【问题标题】:NLP - Find Similar/Phonetic word and calculate score in a paragraphNLP - 在段落中查找相似/拼音单词并计算分数
【发布时间】:2020-06-11 03:42:38
【问题描述】:

我正在开发一个简单的 NLP 项目,其中我们给出了一组单词并从文本中找到相似/语音相似的单词。我找到了很多算法,但没有找到示例应用程序。

它还应该通过比较关键字和找到的单词来给出相似度分数。

谁能帮帮我?

    def word2vec(word):
    from collections import Counter
    from math import sqrt

    cw = Counter(word)
    sw = set(cw)
    lw = sqrt(sum(c*c for c in cw.values()))
    return cw, sw, lw

def cosdis(v1, v2):
    common = v1[1].intersection(v2[1])
    return sum(v1[0][ch]*v2[0][ch] for ch in common)/v1[2]/v2[2]

list_A = ['e-commerce', 'ecomme', 'e-commercy', 'ecomacy', 'E-Commerce']
list_B = ['E-Commerce']

for word in list_A:
    for key in list_B:
            res = cosdis(word2vec(word), word2vec(key))
            print(res)

此代码仅进行逐字比较。

谁能帮帮我?

【问题讨论】:

    标签: python python-3.x nlp cosine-similarity


    【解决方案1】:

    我认为您指的是类似于 API 的东西,它可以首先将单词转换为 IPA 符号(一种音标形式),然后您比较 国际音标符号。

    from collections import Counter
    from math import sqrt
    import eng_to_ipa as ipa
    
    def word2vec(word):
        cw = Counter(word)
        sw = set(cw)
        lw = sqrt(sum(c*c for c in cw.values()))
        return cw, sw, lw
    
    def cosdis(v1, v2):
        common = v1[1].intersection(v2[1])
        return sum(v1[0][ch]*v2[0][ch] for ch in common)/v1[2]/v2[2]
    
    list_A = ['e-commerce', 'ecomme', 'e-commercy', 'ecomacy', 'E-Commerce']
    list_B = ['E-Commerce']
    
    IPA_list_a = []
    IPA_list_b = []
    for each in list_A:
        IPA_list_a.append(ipa.convert(each))
    for each in list_B:
        IPA_list_b.append(ipa.convert(each))
    
    for word in IPA_list_a:
        for key in IPA_list_b:
                res = cosdis(word2vec(word), word2vec(key))
                print(res)
    

    看看这个:[https://github.com/mphilli/English-to-IPA][1]

    >>> import eng_to_ipa as ipa
    >>> ipa.convert("The quick brown fox jumped over the lazy dog.")
    'ðə kwɪk braʊn fɑks ʤəmpt ˈoʊvər ðə ˈleɪzi dɔg.'
    

    示例是从上面的 github 链接建立的。

    【讨论】:

    • 谢谢。但是让我们假设列表 A 是这里的一个段落,并帮助我查找列表 B 中的单词是否存在于列表 A 中。
    • 因此,它会返回一个关系数组(0 到 1),如果单词在 List A 中,则关系数组中应该有一个 1.0,这意味着确切的单词在段落中。
    【解决方案2】:

    余弦相似度主要用于字符串,而不是将一个单词与另一个单词进行比较。我宁愿建议您使用 Levenshteien Distance(也称为编辑距离)之类的东西。

    编辑距离(又名 Levenshtein 距离)是两个字符串之间的相似性度量,称为源字符串和目标字符串。字符串之间的距离被描述为将源转换为目标所需的最小编辑操作数(删除、插入或替换)。因此,距离越短,它们非常相似的可能性就越高。

    您可以通过 Python 的 nltk 库以这种方式使用它:

    import nltk
    
    w1 = 'mapping'
    w2 = 'mappings'
    
    nltk.edit_distance(w1, w2)
    

    在这种情况下,输出返回为 1,因为 w1 和 w2 之间只有一个字母差异

    【讨论】:

      猜你喜欢
      • 2021-06-29
      • 2012-07-07
      • 2018-05-20
      • 2020-08-18
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      相关资源
      最近更新 更多