поиск фраз с повторами слов
есть набор фраз в файле txt utf-8
нужно разбить их на слова
и найти фразы в которых повторяются два слова
слова могут быть в любой позиции внутри фразы
затем вывести те группы фраз в которых пары слов повторяются большее число раз
союзы и предлоги не учитываем при поиске слов
окончания слов также не учитываем при их поиске
если найденных фраз много то ограничить их числом 100
** gpt 4o mini
Вот пример алгоритма, который решает поставленную задачу:
Задача: Разработка программы для обработки текстового файла с фразами.
Входные данные:
Файл формата .txt, кодировка UTF-8, содержащий набор фраз.
Требования:
Программа должна разбивать каждую фразу на слова.
Игнорировать союзы и предлоги при поиске слов (например: "и", "в", "на", "с", "по", "к", "за" и т.д.).
Игнорировать окончания слов при сравнении (например, "бег", "бегу", "бегает" должны считаться одним словом).
Найти фразы, в которых повторяются два слова, независимо от их позиции.
Подсчитать количество повторений каждой пары слов в фразах.
Вывести группы фраз, в которых пары слов повторяются наибольшее количество раз.
Ограничить вывод до 100 групп, если найдено много.
* Алгоритм:
Загрузить фразы из файла.
Определить список союзов и предлогов для игнорирования.
Для каждой фразы:
Разбить фразу на слова.
Удалить союзы и предлоги.
Привести слова к базовой форме ( например, с помощью стемминга или лемматизации )
Найти все пары слов и сохранить их в структуре данных (например, словаре).
Подсчитать количество уникальных фраз для каждой пары слов.
Отсортировать пары слов по количеству повторений.
Вывести до 100 групп фраз с наибольшим количеством повторений.
Выходные данные:
Список групп фраз с парами слов, отсортированный по количеству повторений, с ограничением до 100 групп.
Этот промт можно использовать в качестве основы для написания программы на любом языке программирования.
напиши на питоне код
Вот пример кода на Python, который выполняет описанную задачу:
# код ---------------------------------------------->
import re
from collections import defaultdict
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer
# Загрузка стоп-слов
stop_words = set(stopwords.words('russian'))
stemmer = PorterStemmer()
def preprocess_phrase(phrase):
# Приведение к нижнему регистру и удаление знаков препинания
phrase = phrase.lower()
phrase = re.sub(r'[^\w\s]', '', phrase)
words = phrase.split()
# Удаление стоп-слов
words = [word for word in words if word not in stop_words]
# Стемминг слов
words = [stemmer.stem(word) for word in words]
return words
def find_repeated_pairs(phrases):
pair_count = defaultdict(list)
for phrase in phrases:
words = preprocess_phrase(phrase)
# Находим все уникальные пары слов
unique_pairs = set()
for i in range(len(words)):
for j in range(i + 1, len(words)):
pair = tuple(sorted((words[i], words[j])))
unique_pairs.add(pair)
# Добавляем фразу к каждой паре
for pair in unique_pairs:
pair_count[pair].append(phrase)
return pair_count
def main(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
phrases = file.readlines()
pair_count = find_repeated_pairs(phrases)
# Сортируем пары по количеству фраз
sorted_pairs = sorted(pair_count.items(), key=lambda x: len(x[1]), reverse=True)
# Ограничиваем вывод до 100 групп
for i, (pair, phrases) in enumerate(sorted_pairs[:100]):
print(f"Пара слов: {pair}, Количество фраз: {len(phrases)}")
for phrase in phrases:
print(f" - {phrase.strip()}")
print()
if __name__ == "__main__":
main('phrases.txt')
**
Описание кода:
Импорт библиотек: Используются re для регулярных выражений, defaultdict для удобного хранения данных и модули из nltk для обработки текста (не забудьте установить nltk и загрузить необходимые ресурсы).
Функция preprocess_phrase: Приводит фразу к нижнему регистру, удаляет знаки препинания, фильтрует стоп-слова и применяет стемминг.
Функция find_repeated_pairs: Находит все уникальные пары слов в каждой фразе и сохраняет их вместе с фразами, в которых они встречаются.
Функция main: Загружает фразы из файла, обрабатывает их и выводит пары слов с количеством фраз, в которых они встречаются, ограничивая вывод до 100 групп.
Установка зависимостей:
Перед запуском кода убедитесь, что у вас установлены необходимые библиотеки:
pip install nltk
Также загрузите необходимые ресурсы для nltk:
import nltk
nltk.download('stopwords')
Запуск:
Сохраните код в файл, например, phrase_analysis.py,
и создайте файл phrases.txt с вашими фразами.
= набор фраз >
нужно найти повторы слов в этой фразе
повторы слов могут быть в любом месте
этот повтор слова мы можем найти просто так
у нас слишком много повторов слов в строке
= вывод данных программы >
Пара слов: ('повторы', 'слов'), Количество фраз: 2
- нужно найти повторы слов в этой фразе
- повторы слов могут быть в любом месте
Пара слов: ('найти', 'повторы'), Количество фраз: 1
- нужно найти повторы слов в этой фразе
Пара слов: ('слов', 'фразе'), Количество фраз: 1
- нужно найти повторы слов в этой фразе
Пара слов: ('нужно', 'слов'), Количество фраз: 1
- нужно найти повторы слов в этой фразе
Пара слов: ('нужно', 'фразе'), Количество фраз: 1
- нужно найти повторы слов в этой фразе
Пара слов: ('найти', 'нужно'), Количество фраз: 1
- нужно найти повторы слов в этой фразе
Пара слов: ('повторы', 'фразе'), Количество фраз: 1
- нужно найти повторы слов в этой фразе
Пара слов: ('нужно', 'повторы'), Количество фраз: 1
- нужно найти повторы слов в этой фразе
Пара слов: ('найти', 'слов'), Количество фраз: 1
- нужно найти повторы слов в этой фразе
Пара слов: ('найти', 'фразе'), Количество фраз: 1
- нужно найти повторы слов в этой фразе
Пара слов: ('месте', 'повторы'), Количество фраз: 1
- повторы слов могут быть в любом месте
Пара слов: ('любом', 'месте'), Количество фраз: 1
- повторы слов могут быть в любом месте
Пара слов: ('любом', 'могут'), Количество фраз: 1
- повторы слов могут быть в любом месте
Пара слов: ('могут', 'повторы'), Количество фраз: 1
- повторы слов могут быть в любом месте
Пара слов: ('любом', 'слов'), Количество фраз: 1
- повторы слов могут быть в любом месте
Пара слов: ('месте', 'слов'), Количество фраз: 1
- повторы слов могут быть в любом месте
Пара слов: ('любом', 'повторы'), Количество фраз: 1
- повторы слов могут быть в любом месте
Пара слов: ('месте', 'могут'), Количество фраз: 1
- повторы слов могут быть в любом месте
Пара слов: ('могут', 'слов'), Количество фраз: 1
- повторы слов могут быть в любом месте
Пара слов: ('повтор', 'просто'), Количество фраз: 1
- этот повтор слова мы можем найти просто так
Пара слов: ('найти', 'просто'), Количество фраз: 1
- этот повтор слова мы можем найти просто так
Пара слов: ('можем', 'найти'), Количество фраз: 1
- этот повтор слова мы можем найти просто так
Пара слов: ('просто', 'слова'), Количество фраз: 1
- этот повтор слова мы можем найти просто так
Пара слов: ('можем', 'слова'), Количество фраз: 1
- этот повтор слова мы можем найти просто так
Пара слов: ('найти', 'слова'), Количество фраз: 1
- этот повтор слова мы можем найти просто так
Пара слов: ('можем', 'повтор'), Количество фраз: 1
- этот повтор слова мы можем найти просто так
Пара слов: ('повтор', 'слова'), Количество фраз: 1
- этот повтор слова мы можем найти просто так
Пара слов: ('можем', 'просто'), Количество фраз: 1
- этот повтор слова мы можем найти просто так
Пара слов: ('найти', 'повтор'), Количество фраз: 1
- этот повтор слова мы можем найти просто так
Пара слов: ('слишком', 'слов'), Количество фраз: 1
- у нас слишком много повторов слов в строке
Пара слов: ('повторов', 'слишком'), Количество фраз: 1
- у нас слишком много повторов слов в строке
Пара слов: ('повторов', 'строке'), Количество фраз: 1
- у нас слишком много повторов слов в строке
Пара слов: ('слишком', 'строке'), Количество фраз: 1
- у нас слишком много повторов слов в строке
Пара слов: ('повторов', 'слов'), Количество фраз: 1
- у нас слишком много повторов слов в строке
Пара слов: ('слов', 'строке'), Количество фраз: 1
- у нас слишком много повторов слов в строке
вроде всё так ->
но кажется ты не учёл что слова в фразах нужно сравнивать
без их окончаний чтобы было больше повторов при их поиске
** gpt
Вы правы, для более точного сравнения слов нужно использовать лемматизацию или стемминг, чтобы убрать окончания и привести слова к базовым формам. В предыдущем коде уже использовался стемминг, но давайте уточним, как это сделать более эффективно.
Вот обновленный код,
который использует лемматизацию для более точного сравнения слов:
----------------------->
import re
from collections import defaultdict
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
import nltk
# Убедитесь, что необходимые ресурсы загружены
nltk.download('stopwords')
nltk.download('wordnet')
# Загрузка стоп-слов и инициализация лемматизатора
stop_words = set(stopwords.words('russian'))
lemmatizer = WordNetLemmatizer()
def preprocess_phrase(phrase):
# Приведение к нижнему регистру и удаление знаков препинания
phrase = phrase.lower()
phrase = re.sub(r'[^\w\s]', '', phrase)
words = phrase.split()
# Удаление стоп-слов и лемматизация
words = [lemmatizer.lemmatize(word) for word in words if word not in stop_words]
return words
def find_repeated_pairs(phrases):
pair_count = defaultdict(list)
for phrase in phrases:
words = preprocess_phrase(phrase)
# Находим все уникальные пары слов
unique_pairs = set()
for i in range(len(words)):
for j in range(i + 1, len(words)):
pair = tuple(sorted((words[i], words[j])))
unique_pairs.add(pair)
# Добавляем фразу к каждой паре
for pair in unique_pairs:
pair_count[pair].append(phrase)
return pair_count
def main(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
phrases = file.readlines()
pair_count = find_repeated_pairs(phrases)
# Сортируем пары по количеству фраз
sorted_pairs = sorted(pair_count.items(), key=lambda x: len(x[1]), reverse=True)
# Ограничиваем вывод до 100 групп
for i, (pair, phrases) in enumerate(sorted_pairs[:100]):
print(f"Пара слов: {pair}, Количество фраз: {len(phrases)}")
for phrase in phrases:
print(f" - {phrase.strip()}")
print()
if __name__ == "__main__":
main('phrases.txt')
Изменения:
Лемматизация: Вместо стемминга используется лемматизация. Для этого используется WordNetLemmatizer. Учтите, что для русского языка нужно использовать соответствующий лемматизатор, поэтому может потребоваться библиотека pymorphy2 или ru_core_news_sm из spacy.
Импорт и загрузка ресурсов: Убедитесь, что все необходимые ресурсы загружены и установлены.
Альтернативный вариант с pymorphy2:
Если вы хотите использовать pymorphy2, вот как это можно сделать:
#код ---------------------------->
import re
from collections import defaultdict
import pymorphy2
from nltk.corpus import stopwords
import nltk
# Убедитесь, что необходимые ресурсы загружены
nltk.download('stopwords')
# Загрузка стоп-слов и инициализация лемматизатора
stop_words = set(stopwords.words('russian'))
morph = pymorphy2.MorphAnalyzer()
def preprocess_phrase(phrase):
# Приведение к нижнему регистру и удаление знаков препинания
phrase = phrase.lower()
phrase = re.sub(r'[^\w\s]', '', phrase)
words = phrase.split()
# Удаление стоп-слов и лемматизация
words = [morph.parse(word)[0].normal_form for word in words if word not in stop_words]
return words
def find_repeated_pairs(phrases):
pair_count = defaultdict(list)
for phrase in phrases:
words = preprocess_phrase(phrase)
# Находим все уникальные пары слов
unique_pairs = set()
for i in range(len(words)):
for j in range(i + 1, len(words)):
pair = tuple(sorted((words[i], words[j])))
unique_pairs.add(pair)
# Добавляем фразу к каждой паре
for pair in unique_pairs:
pair_count[pair].append(phrase)
return pair_count
def main(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
phrases = file.readlines()
pair_count = find_repeated_pairs(phrases)
# Сортируем пары по количеству фраз
sorted_pairs = sorted(pair_count.items(), key=lambda x: len(x[1]), reverse=True)
# Ограничиваем вывод до 100 групп
for i, (pair, phrases) in enumerate(sorted_pairs[:100]):
print(f"Пара слов: {pair}, Количество фраз: {len(phrases)}")
for phrase in phrases:
print(f" - {phrase.strip()}")
print()
if __name__ == "__main__":
main('phrases.txt')
Установка pymorphy2:
Если вы выбрали этот вариант, установите библиотеку:
pip install pymorphy2
Теперь программа должна корректно обрабатывать слова, игнорируя окончания, и находить больше повторяющихся пар
Свидетельство о публикации №124091802926