Как собрать похожие слова - PullRequest
19 голосов
/ 25 марта 2019

Я пытаюсь получить все похожие звучащие слова из списка.

Я пытался получить их, используя косинусное сходство, но это не соответствует моей цели.

from sklearn.metrics.pairwise import cosine_similarity
dataList = ['two','fourth','forth','dessert','to','desert']
cosine_similarity(dataList)

Я знаюэто неправильный подход, я не могу получить такой результат, как:

result = ['xx', 'xx', 'yy', 'yy', 'zz', 'zz'] 

, где они означают, что слова, которые звучат похоже

1 Ответ

30 голосов
/ 25 марта 2019

Во-первых, вы должны использовать правильный способ получить похожие звучащие слова, т. Е. сходство строк , я бы предложил:

Использование jellyfish:

from jellyfish import soundex

print(soundex("two"))
print(soundex("to"))

OUTPUT

T000
T000

Теперь, возможно, создайте функцию, которая будет обрабатывать список, а затем отсортировать его, чтобы получить их:

def getSoundexList(dList):
    res = [soundex(x) for x in dList]   # iterate over each elem in the dataList
    # print(res)     # ['T000', 'F630', 'F630', 'D263', 'T000', 'D263']
    return res

dataList = ['two','fourth','forth','dessert','to','desert']    
print([x for x in sorted(getSoundexList(dataList))])

OUTPUT

['D263', 'D263', 'F630', 'F630', 'T000', 'T000']

РЕДАКТИРОВАТЬ :

Другой способ может быть:

Использование fuzzy:

import fuzzy
soundex = fuzzy.Soundex(4)

print(soundex("to"))
print(soundex("two"))

OUTPUT

T000
T000

РЕДАКТИРОВАТЬ 2 :

Если вы хотите их grouped, вы можете использовать groupby:

from itertools import groupby

def getSoundexList(dList):
    return sorted([soundex(x) for x in dList])

dataList = ['two','fourth','forth','dessert','to','desert']    
print([list(g) for _, g in groupby(getSoundexList(dataList), lambda x: x)])

OUTPUT

[['D263', 'D263'], ['F630', 'F630'], ['T000', 'T000']]

РЕДАКТИРОВАТЬ 3 :

Это для @Eric Duminil, скажем, вы хотите и names и их соответствующие val:

Использование dict вместе с itemgetter:

from operator import itemgetter

def getSoundexDict(dList):
    return sorted(dict_.items(), key=itemgetter(1))  # sorting the dict_ on val

dataList = ['two','fourth','forth','dessert','to','desert']
res = [soundex(x) for x in dataList]    # to get the val for each elem
dict_ = dict(list(zip(dataList, res)))  # dict_ with k,v as name/val

print([list(g) for _, g in groupby(getSoundexDict(dataList), lambda x: x[1])])

OUTPUT

[[('dessert', 'D263'), ('desert', 'D263')], [('fourth', 'F630'), ('forth', 'F630')], [('two', 'T000'), ('to', 'T000')]]

РЕДАКТИРОВАТЬ 4 (для OP):

Саундэкс:

Soundex - это система, в которой значения присваиваются именам в таких таким образом, что названия с похожим звучанием получают одинаковое значение Эти значения известны как soundex кодировки. Поисковое приложение на основе soundex не будет искать имя напрямую, а будет искать кодирование soundex. Таким образом, он получит все названия, которые звучат как имя, которое ищут.

читать дальше ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...