Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 20, 2016 02:10:06

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Поиск общих слов в 2 разных текстах

Нужно вычленить общие слова из 2 текстов, при этом, если слова образуют фразу, нужно вычленить отдельно эту фразу. Т.е., из

 a = 'the quick brown fox jumps over the lazy dog'
b = 'the quick brown dog jumps over the lazy fox'

нужно получить

 ['the quick brown','fox','jumps over the lazy','dog']

При этом в одном из текстов могут встречаться слова, не имеющиеся во втором.

Проблема в каком-то плане решается difflib:
 >>> difflib.SequenceMatcher(a=a,b=b).get_matching_blocks()
[Match(a=0, b=0, size=16), Match(a=17, b=17, size=1), Match(a=19, b=19, size=21), Match(a=41, b=41, size=1), Match(a=43, b=43, size=0)]
>>> a[0:16]
'the quick brown '
>>> a[17:18]
'o'
>>> a[19:40]
' jumps over the lazy '
>>> a[41:42]
'o'
Далее я могу отфильтровать совпадения так, чтобы оставались одни слова. Но есть серьезная проблема: difflib, похоже, не находит совпадения в разных текстах, он ищет изменения в измененном тексте. Поэтому, видно, и не заметил, что в “a” и “b” местами переставлены “dog” и “fox”. Кроме того,
если мне надо сравнить
 >>> a = 'the quick brown fox jumps over the lazy dog'
>>> b = 'jumps over the lazy dog the quick brown fox'
>>> difflib.SequenceMatcher(a=a,b=b).get_matching_blocks()
[Match(a=20, b=0, size=23), Match(a=43, b=43, size=0)]
>>> a[20:43]
'jumps over the lazy dog'
то difflib найдет только 1 фрагмент, а мне нужно получить
 ['jumps over the lazy dog', 'the quick brown fox']
В difflib есть также find_longest_match(), то тогда мне придется дробить текст на фрагменты и делать find_longest_match() до посинения. Не уверен, насколько это оптимально. Я уже писал алгоритм, который сначала искал общие слова, затем дробил слова по общим фрагментам, но скорость работы у такого алгоритма (в особенности, если тексты большие) низкая. Где мне достать нужный алгоритм? Возможно, в nltk что-нибудь подобное есть?

Отредактировано vanvanov (Ноя. 20, 2016 02:11:43)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version