Python: как найти наиболее подходящее предложение из текстового файла

#python

#python

Вопрос:

Я хотел вывести, присутствует ли какое-либо похожее предложение в текстовом файле

Пример:
Если файл .txt содержит

1 . Какая самая большая планета нашей Солнечной системы?
2 . Как приготовить чай?
3 . Какая планета нашей Солнечной системы самая большая?

В этом случае должно получиться:-
3 . Какая планета нашей Солнечной системы самая большая?

В принципе, он должен сравнивать, есть ли более 4 или 5 похожих слов в строках файла

Комментарии:

1. Итак, вы хотите вывести два наиболее похожих предложения? Есть ли по одному предложению в строке? И какую метрику сходства вы используете? Левенштейн? Какое-то встраивание предложения?

2. Может помочь модуль difflib , особенно функция difflib.get_close_matches

3. @Nathan да, это всего по одному предложению в строке. На самом деле я читаю текстовый файл, который содержит много вопросов.

4. @JohnColeman позвольте мне проверить это

5. @JohnColeman в этом тексте слова уже упомянуты или предопределены. В моем случае это не так

Ответ №1:

Я согласен с предложением Джона Коулмана. difflib может помочь вам найти показатель сходства между двумя строками. Вот один из возможных подходов:

 from difflib import SequenceMatcher

sentences = []
with open('./bp.txt', 'r') as f:
    for line in f:
        # only consider lines that have numbers at the beginning
        if line.split('.')[0].isdigit():
            sentences.append(line.split('n')[0])
max_prob = 0
similar_sentence = None
length = len(sentences)
for i in range(length):
    for j in range(i 1,length):
        match_ratio = SequenceMatcher(None, sentences[i], sentences[j]).ratio()
        if  match_ratio > max_prob:
            max_prob = match_ratio
            similar_sentence = sentences[j]
if similar_sentence is not None:
    print(similar_sentence)

  

Комментарии:

1. Возможно, вы сможете ускорить это, используя ball tree или kd tree (например, из sklearn). Я полагаю, что по крайней мере ball tree принимает пользовательскую метрику расстояния. В противном случае вам нужно выполнить n ^ 2 сравнения для файла с n предложениями. Понятия не имею, насколько велики файлы в этом приложении, но это быстро портится

2. Это не совсем работает Проверьте это погружение, это мой проект

3. @Nathan Спасибо за предложение. Я не очень знаком с ball tree, поэтому я не использовал в своем ответе. Учитывая пример OP и ссылку на проект, предложений для сравнения не так много, поэтому я думаю, что текущего подхода должно быть достаточно.

4. @Appries Я не знал, что в текстовом файле есть пустые строки и заголовки. Я добавил условие if if line.split('.')[0].isdigit(): для фильтрации только предложений с числами в начале.