Как найти похожие слова в списке?

Есть такой список
['голубец', 'конь', 'голубцы', 'лист']
Программа должна выдать: голубец

Еще пример:
['стол', 'день', 'свет', 'клинок', 'светильник']
Программа должна выдать: свет.

Ну и еще пример:
['восток', 'дань', 'исток', 'жир', 'голубь', 'да']
Программа должна выдать: восток

Как это реализовать на python?
  • Вопрос задан
  • 5945 просмотров
Решения вопроса 2
adugin
@adugin Куратор тега Python
# -*- coding: utf-8 -*-

from difflib import SequenceMatcher
from itertools import combinations, imap

def ratio(pair):
    return (SequenceMatcher(None, *pair).ratio(), pair[0])

def findword(wordlist):
    pairs = combinations(wordlist, 2)
    found = max(imap(ratio, pairs))[1] 
    return found

print findword(['голубец', 'конь', 'голубцы', 'лист'])
print findword(['стол', 'день', 'свет', 'клинок', 'светильник'])
print findword(['восток', 'дань', 'исток', 'жир', 'голубь', 'да'])

Результат:
голубец
свет
восток
Ответ написан
@pcdesign Автор вопроса
Ну как-то вот так получилось:

import difflib


def similar(arr):
    s = difflib.SequenceMatcher()
    full = []
    for i in arr:
        s.set_seq2(i)
        for n in (arr):
            if n == i:
                continue
            s.set_seq1(n)
            full.append((s.ratio(), n))
            full.sort(reverse=True)

    print("### Отладка ### Сколько каждое слово набрало очков похожести")
    for score, i in full:
        print(i + str(score))

    return full[0]

arr = ['голубец', 'конь', 'голубцы', 'лист']
print("Итоговый результат:" + similar(arr)[1])

arr = ['стол', 'день', 'свет', 'клинок', 'светильник']
print("Итоговый результат:" + similar(arr)[1])

arr = ['восток', 'дань', 'исток', 'жир', 'голубь', 'да']
print("Итоговый результат:" + similar(arr)[1])


Результат работы:
### Отладка ### Сколько каждое слово набрало очков похожести
голубцы0.8571428571428571
голубец0.8571428571428571
лист0.18181818181818182
лист0.18181818181818182
конь0.18181818181818182
конь0.18181818181818182
голубцы0.18181818181818182
голубцы0.18181818181818182
голубец0.18181818181818182
голубец0.18181818181818182
лист0.0
конь0.0
Итоговый результат:голубцы 

### Отладка ### Сколько каждое слово набрало очков похожести
светильник0.5714285714285714
свет0.5714285714285714
стол0.5
свет0.5
стол0.42857142857142855
светильник0.42857142857142855
светильник0.375
светильник0.2857142857142857
день0.2857142857142857
свет0.25
день0.25
стол0.2
клинок0.2
клинок0.2
день0.2
клинок0.125
стол0.0
свет0.0
клинок0.0
день0.0
Итоговый результат:светильник

### Отладка ### Сколько каждое слово набрало очков похожести
исток0.7272727272727273
восток0.7272727272727273
дань0.6666666666666666
да0.6666666666666666
исток0.25
жир0.25
дань0.2
голубь0.2
исток0.18181818181818182
голубь0.18181818181818182
голубь0.16666666666666666
восток0.16666666666666666
исток0.0
исток0.0
жир0.0
жир0.0
жир0.0
жир0.0
дань0.0
дань0.0
дань0.0
да0.0
да0.0
да0.0
да0.0
голубь0.0
голубь0.0
восток0.0
восток0.0
восток0.0
Итоговый результат:исток
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
desperadik
@desperadik
Истина где-то рядом.
а = ['голубец', 'конь', 'голубцы', 'лист']
for b in a:
     if b == 'голубцы':
          print 'голубец'
      else:
           countinue


нет?
Ответ написан
yttrium
@yttrium
Помимо вычислений различных расстояний, можно пойти путем где на первом этапе нормализовать слова, на втором уже сравнивать нормальные формы. Нормализовать слова можно так называемым стеммером, например, из пакета nltk.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы