Peter Norvig的分词问题:如何在内部拼错单词?

时间:2017-08-02 10:34:10

标签: python nlp spell-checking spelling

我试图理解,Peter Norvig的拼写纠正器是如何工作的。

在他的jupyter-notebook标题here上,他解释说,如何分割一系列字符而没有空格分隔单词。当正确的所有单词都写得正确时,它的工作正确:

>>> segment("deeplearning")
['deep', 'learning']

但是当序列中的单词(或某些单词)拼写错误时,它的工作方式不正确:

>>> segment("deeplerning")
['deep', 'l', 'erning']

不幸的是,我不知道如何解决这个问题并使 segment()函数与拼写错误的拼写单词一起使用。

有人知道如何处理这个问题吗?

1 个答案:

答案 0 :(得分:1)

Peter Norvig的algorithm可以通过微小的改变来实现。诀窍是在字母表中添加一个空格字符,并将所有由空格字符分隔的双字母视为唯一字。

由于big.txt不包含deep learning bigram,我们将不得不在字典中添加更多文字。我将使用wikipedia librarypip install wikipedia)来获取更多文字。

import re
import wikipedia as wiki
import nltk
from nltk.tokenize import word_tokenize
unigrams =  re.findall(r"\w+", open("big.txt").read().lower())
for deeplerning in wiki.search("Deep Learning"):
    try:
        page = wiki.page(deeplerning).content.lower()
        page = page.encode("ascii", errors="ignore")
        unigrams = unigrams + word_tokenize(page)
    except:
        break

我将创建一个包含所有unigrams和bigrams的新词典:

fo = open("new_dict.txt", "w")
for u in unigrams:
    fo.write(u + "\n")
bigrams = list(nltk.bigrams(unigrams))
for b in bigrams:
    fo.write(" ".join(b)+ "\n")
fo.close()

现在只需在space函数的letters变量中添加edits1字符,将big.txt更改为new_dict.txt并更改此功能:

def words(text): return re.findall(r'\w+', text.lower())

到此:

def words(text): return text.split("\n")

现在correction("deeplerning")返回'deep learning'

如果您需要针对特定​​域的拼写纠正器,此技巧将表现良好。如果此域名很大,您可以尝试将最常见的unigrams / bigrams添加到您的词典中。

question也可能有所帮助。