#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():
для фильтрации только предложений с числами в начале.