поиск релевантных фраз в файлах txt

в корневой папке "." есть тексты txt utf-8 ( то есть набор файлов с текстами )
и также есть файл текст.txt с тестовым текстом
нужно взять из тестового текста наборы троек соседних слов или их корней
и найти фразы в доступных файлах которые содержат эти группы слов
затем вывести эти найденные фразы
если фразы не найдены тогда искать не тройки а пары слов в тестовом тексте



 вот пример кода такой программы  =>



import os
import re
from collections import defaultdict

def extract_ngrams(text, n):
    words = re.findall(r'\b\w+\b', text.lower())
    return set(tuple(words[i:i+n]) for i in range(len(words) - n + 1))

def find_sentences_with_ngrams(text, ngrams):
    sentences = re.split(r'(?<=[.!?]) +', text)  # Разделяем текст на предложения
    found_sentences = []
   
    for sentence in sentences:
        for ngram in ngrams:
            pattern = r'\b' + r'\s+'.join(ngram) + r'\b'
            if re.search(pattern, sentence):
                found_sentences.append(sentence.strip())
                print(f" {sentence.strip()}")  # Отладочная информация
                break  # Если нашли хотя бы одно совпадение, переходим к следующему предложению

    return found_sentences

def search_phrases_in_files(ngrams, directory):
    found_phrases = defaultdict(list)
   
    for filename in os.listdir(directory):
        if filename.endswith('.txt') and filename != 'текст.txt':
            print(f"Чтение файла: {filename}")  # Отладочная информация
            with open(os.path.join(directory, filename), 'r', encoding='utf-8') as f:
                content = f.read().lower()
                sentences_with_ngrams = find_sentences_with_ngrams(content, ngrams)
                if sentences_with_ngrams:
                found_phrases[filename].extend(sentences_with_ngrams)

    return found_phrases

def main():
    directory = '.'
   
    # Считываем тестовый текст
    with open(os.path.join(directory, 'текст.txt'), 'r', encoding='utf-8') as f:
        test_text = f.read()

    print("Тестовый текст считан.")  # Отладочная информация

    # Извлекаем тройки и пары слов
    trigrams = extract_ngrams(test_text, 3)
    bigrams = extract_ngrams(test_text, 2)

    print(f"Тройки: {trigrams}")  # Отладочная информация
    print(f"Пары: {bigrams}")  # Отладочная информация

    # Ищем фразы с тройками
    found_phrases = search_phrases_in_files(trigrams, directory)

    # Если не нашли фразы с тройками, ищем с парами
    if not any(found_phrases.values()):
        print("Фразы с тройками не найдены, ищем пары...")
        found_phrases = search_phrases_in_files(bigrams, directory)

    # Выводим результаты
    if not any(found_phrases.values()):
        print("Фразы не найдены ни в одном из файлов.")
    else:
        for filename, phrases in found_phrases.items():
            print(f'Файл: {filename}')
            for phrase in phrases:
                print(f'Найдена фраза: {phrase}')

if __name__ == '__main__':
    main()


Рецензии