поиск фраз с повторами слов

промт для алгоритма программы
есть набор фраз в файле 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
Теперь программа должна корректно обрабатывать слова, игнорируя окончания, и находить больше повторяющихся пар


Рецензии