我希望从enchant suggest()
获得最相关的字词。有没有更好的方法来做到这一点。在检查100k或更大范围内的大量单词时,我觉得我的功能效率不高。
enchant suggest()
的问题:
>>> import enchant >>> d.suggest("prfomnc") ['prominence', 'performance', 'preform', 'Provence', 'preferment', 'proforma']
我的功能是从一组建议的单词中获取适当的单词:
import enchant, difflib word="prfomnc" dict,max = {},0 a = set(d.suggest(word)) for b in a: tmp = difflib.SequenceMatcher(None, word, b).ratio(); dict[tmp] = b if tmp > max: max = tmp print dict[max] Result: performance
更新:
如果我得到多个密钥,意味着相同的difflib ratio()
值,我使用多密钥字典。如下所述:http://code.activestate.com/recipes/440502-a-dictionary-with-multiple-values-for-each-key/
答案 0 :(得分:3)
没有灵丹妙药,我害怕...... 但是有一些建议。
我猜测逻辑中的大部分时间花在 difflib的SequenceMatcher()。ratio()调用上。这并不奇怪,因为这个方法使用Rattcliff-Obershelp algorithm的变体,这是相对昂贵的,CPU方式(但它产生的度量相当“在标记上”来定位紧密匹配,这可能是为什么你喜欢它。)
可以肯定的是,你应该分析这个逻辑,并确认SequenceMatcher()确实是热点。也许Enchant.suggest()也有点慢,但是我们可以做的很少,代码方面,以改善这一点(配置方面,可能有一些选项,例如,废除个人字典以节省双重查找和合并等。)。
假设SequenceMatcher()确实是罪魁祸首,并假设你希望坚持使用Ratcliff-Obershelp相似性度量作为选择最佳匹配的方法,那么你可以做以下几点:
答案 1 :(得分:2)
如果您只对最佳匹配感兴趣,则实际上不需要保留dict
>>> word="prfomnc"
>>> best_words = []
>>> best_ratio = 0
>>> a = set(d.suggest(word))
>>> for b in a:
... tmp = difflib.SequenceMatcher(None, word, b).ratio()
... if tmp > best_ratio:
... best_words = [b]
... best_ratio = tmp
... elif tmp == best_ratio:
... best_words.append(b)
...
>>> best_words
['performance']