如何将发音相似的单词放在一起

19 python list python-3.x

我正在尝试从列表中获取所有类似的发音。

我试图用余弦相似度来获取它们,但这没有实现我的目的。

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

我知道这不是正确的方法,我似乎无法得到如下结果:

result = ['xx', 'xx', 'yy', 'yy', 'zz', 'zz'] 
Run Code Online (Sandbox Code Playgroud)

他们的意思是听起来相似的单词

Dir*_*Bit 30

首先,您需要使用正确的方法来获得相似的发音,即字符串相似性,我建议:

使用jellyfish

from jellyfish import soundex

print(soundex("two"))
print(soundex("to"))
Run Code Online (Sandbox Code Playgroud)

输出

T000
T000
Run Code Online (Sandbox Code Playgroud)

现在也许创建一个处理列表的函数,然后对其进行排序以获取它们:

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))])
Run Code Online (Sandbox Code Playgroud)

输出

['D263', 'D263', 'F630', 'F630', 'T000', 'T000']
Run Code Online (Sandbox Code Playgroud)

编辑

另一种方法可能是:

使用fuzzy

import fuzzy
soundex = fuzzy.Soundex(4)

print(soundex("to"))
print(soundex("two"))
Run Code Online (Sandbox Code Playgroud)

输出

T000
T000
Run Code Online (Sandbox Code Playgroud)

编辑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)])
Run Code Online (Sandbox Code Playgroud)

输出

[['D263', 'D263'], ['F630', 'F630'], ['T000', 'T000']]
Run Code Online (Sandbox Code Playgroud)

编辑3

@Eric Duminil的这个,假设您同时想要namesval

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])])
Run Code Online (Sandbox Code Playgroud)

输出

[[('dessert', 'D263'), ('desert', 'D263')], [('fourth', 'F630'), ('forth', 'F630')], [('two', 'T000'), ('to', 'T000')]]
Run Code Online (Sandbox Code Playgroud)

编辑4(对于OP):

Soundex:

Soundex是一种系统,通过该系统将值分配给名称,以使听起来相似的名称获得相同的值。这些值称为soundex编码。基于soundex的搜索应用程序不会直接搜索名称,而是会搜索soundex编码。这样,它将获得听起来像正在寻找的名称的所有名称。

阅读更多..