Peter Norvig的分词问题:我如何才能将单词与拼写错误分开?

问题描述:

我试图理解,Peter Norvig的拼写校正器是如何工作的。Peter Norvig的分词问题:我如何才能将单词与拼写错误分开?

在他jupyter笔记本标题here他解释说,如何细分的字符序列无空格分开的话。当所有序列中的字写得正确它的工作原理是正确的,:

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

但是当序列字(或词)的拼写错误,它的工作原理不正确:

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

不幸的是,我有不知道如何解决这个问题,使段()函数工作与拼写错误单词串联。

有谁有一个想法如何处理这个问题呢?

+1

我的意思是...这是一个难题。很多研究都涉及这一点。 – erip

+0

你知道关于这个问题的研究的任何文章吗? –

它可以由彼得·诺维格的algorithm有细微的变化来实现。诀窍是在字母表中添加一个空格字符,并将由空格字符分隔的所有bigrams视为一个唯一字。

由于big.txt不含deep learning两字,我们将不得不多一点点文本添加到我们的字典。我将使用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 

我将创建与所有对unigram和双字母组新的辞典:

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.txtnew_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也可能有所帮助。