алгоритм поиска фраз по ключевым парам слов

в папке много текстов txt  utf-8
нужно также проверить папки вложения
и прочитать все тексты которые есть

далее найти фразы в этих текстах по следующему алгоритму:

вводим  фразу input ->
большой город будущего умный ИИ наука

разбиваем нашу фразу на пары слов
с учетом склонений и корней слов

больш город
больш будущ
город будущ
город наук
город умный
умн-ый город
будущ ИИ
умный ИИ
больш наук
умн-ый наук
будущ наук
ИИ город
ИИ наук
и так далее ..

ищем фразы в которых есть все эти пары слов




   **  ->




import os
import re
from collections import defaultdict

def read_txt_files(directory):
    texts = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith('.txt'):
                try:
                with open(os.path.join(root, file), 'r', encoding='utf-8') as f:
                texts.append((file, f.read()))  # Сохраняем имя файла и текст
                except (UnicodeDecodeError, FileNotFoundError) as e:
                print(f"Не удалось прочитать файл {file}: {e}")
    return texts

def generate_word_pairs(phrase):
    words = phrase.split()
    pairs = set()
    for i in range(len(words)):
        for j in range(i + 1, len(words)):
            pairs.add((words[i], words[j]))
            pairs.add((words[j], words[i]))
    return pairs

def search_phrases_in_texts(texts, pairs):
    found_phrases = defaultdict(set)  # Используем set для исключения дубликатов
    for filename, text in texts:
        for word1, word2 in pairs:
            # Регулярное выражение для поиска слов рядом друг с другом
            pattern = re.escape(word2), re.escape(word2), re.escape(word1)), re.IGNORECASE)
            for line in text.splitlines():
                if pattern.search(line):
                found_phrases[(word1, word2)].add((filename, line.strip()))  # Сохраняем имя файла и строку без пробелов

    return found_phrases

# Основная функция
def main():
    directory = "."  # Используем текущую директорию
    phrase = input("фраза поиска: ")

    texts = read_txt_files(directory)
    pairs = generate_word_pairs(phrase)
    found_phrases = search_phrases_in_texts(texts, pairs)

    for pair, occurrences in found_phrases.items():
        for filename, line in occurrences:
            print(f"Файл: {filename}\nСтрока: {line}\n")

if __name__ == "__main__":
    main()





-> 
просто поместите эту программу в папку
где у вас много текстов *.txt   utf-8
и введите вашу фразу поиска






import os
import re
from collections import defaultdict

def read_txt_files(directory):
    texts = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith('.txt'):
                try:
                with open(os.path.join(root, file), 'r', encoding='utf-8') as f:
                texts.append((root, file, f.read()))  # Сохраняем имя папки, имя файла и текст
                except (UnicodeDecodeError, FileNotFoundError) as e:
                print(f"Не удалось прочитать файл {file}: {e}")
    return texts

def generate_word_pairs(phrase):
    words = phrase.split()
    pairs = set()
    for i in range(len(words)):
        for j in range(i + 1, len(words)):
            pairs.add((words[i], words[j]))
            pairs.add((words[j], words[i]))
    return pairs

def search_phrases_in_texts(texts, pairs):
    found_phrases = defaultdict(set)  # Используем set для исключения дубликатов
    for folder, filename, text in texts:
        for word1, word2 in pairs:
            # Регулярное выражение для поиска слов рядом друг с другом
            pattern = re.escape(word2), re.escape(word2), re.escape(word1)), re.IGNORECASE)
            for line in text.splitlines():
                if pattern.search(line):
                found_phrases[(word1, word2)].add((folder, filename, line.strip()))  # Сохраняем имя папки, имя файла и строку без пробелов

    return found_phrases

# Основная функция
def main():
    directory = "."  # Используем текущую директорию
    phrase = input("фраза для поиска: ")

    texts = read_txt_files(directory)
    pairs = generate_word_pairs(phrase)
    found_phrases = search_phrases_in_texts(texts, pairs)

    for pair, occurrences in found_phrases.items():
        for folder, filename, line in occurrences:
            print(f"Папка: {folder}\nФайл: {filename}\nСтрока: {line}\n")

if __name__ == "__main__":
    main()



->  здесь программа также выводит имя папки где находится файл с текстом









    **





  ->  программа читает текст голосом



import pyttsx3

def read_text_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        return file.read()

def speak_text(text):
    engine = pyttsx3.init()
    engine.setProperty('rate', 150)  # Скорость речи
    engine.setProperty('volume', 1)  # Громкость (от 0.0 до 1.0)
   
    engine.say(text)
    engine.runAndWait()

if __name__ == "__main__":
    file_path = 'текст.txt'  # Укажите путь к вашему файлу
    text = read_text_file(file_path)
    speak_text(text)









 ->   программа перемешивает тройки слов из текста txt
     и выводит их в виде случайного списка



import random

# Чтение текста из файла
with open('текст.txt', 'r', encoding='utf-8') as file:
    text = file.read()

# Разделение текста на слова
words = text.split()

# Извлечение троек соседних слов
triplets = []
for i in range(len(words) - 2):
    triplet = (words[i], words[i + 1], words[i + 2])
    triplets.append(triplet)

# Перемешивание троек
random.shuffle(triplets)

# Вывод троек в случайном порядке
for triplet in triplets:
    print(' '.join(triplet))









 ->  следующий алгоритм ищет фразы в тексте по фразе ввода




import re
import itertools
from pymorphy2 import MorphAnalyzer

# Функция для предобработки текста
def preprocess_text(text):
    text = text.lower()
    words = re.findall(r'\b\w+\b', text)
    return words

# Функция для извлечения корней слов
def get_word_roots(phrase):
    morph = MorphAnalyzer()
    roots = [morph.parse(word)[0].normal_form for word in phrase.split()]
    return roots

# Функция для генерации комбинаций корней
def generate_combinations(roots):
    combinations = []
    for r in range(1, len(roots) + 1):
        combinations.extend([' '.join(comb) for comb in itertools.permutations(roots, r)])
    return set(combinations)

# Функция для поиска фраз в тексте
def search_phrases_in_text(phrase, text):
    words = preprocess_text(text)
    roots = get_word_roots(phrase)
    combinations = generate_combinations(roots)
   
    found_phrases = set()
    for combination in combinations:
        if combination in text:
            found_phrases.add(combination)
   
    return found_phrases

# Пример использования
if __name__ == "__main__":
    input_phrase = input("Введите фразу поиска: ")
    with open("large_text.txt", "r", encoding="utf-8") as file:
        large_text = file.read()
   
    results = search_phrases_in_text(input_phrase, large_text)
    print("Найденные фразы:", results)




 



 * ->  вот ещё другой алгоритм поиска фраз который работает



import re
from collections import Counter

# Функция для предобработки текста
def preprocess_text(text):
    return text.lower()

# Функция для извлечения слов из фразы
def get_words(phrase):
    return phrase.lower().split()

# Функция для поиска релевантных фраз в тексте
def search_relevant_phrases(phrase, text):
    words = get_words(phrase)
    pattern = r'\b(?:' + '|'.join(re.escape(word) for word in words) + r')\b'
   
    # Находим все предложения в тексте
    sentences = re.split(r'[.!?]', text)
    found_phrases = []

    for sentence in sentences:
        if all(word in sentence for word in words):
            found_phrases.append(sentence.strip())

    # Сортируем фразы по количеству совпадений слов
    counted_phrases = [(sentence, sum(word in sentence for word in words)) for sentence in found_phrases]
    counted_phrases.sort(key=lambda x: x[1], reverse=True)  # Сортировка по количеству совпадений

    # Возвращаем только наиболее релевантные фразы
    relevant_phrases = [phrase for phrase, count in counted_phrases if count > 0]
   
    return relevant_phrases

# Пример использования
if __name__ == "__main__":
    input_phrase = input("Введите фразу: ")
    with open("фразы.txt", "r", encoding="utf-8") as file:
        large_text = file.read()
   
    results = search_relevant_phrases(input_phrase, large_text)
   
    # Выводим найденные фразы с переводом строки
    print("Найденные фразы:\n" + "\n".join(results))


Рецензии