2017-08-02 10 views
3

私は理解しようとしています、Peter Norvigのスペルの修正はどのように機能しますか?Peter Norvigの単語セグメンテーションの問題:スペルミスのある単語をどのようにセグメント化できますか?

彼のジュピターノートのタイトルhereには、単語を区切るスペースを使わずに文字シーケンスを分割する方法が説明されています。シーケンス内のすべての単語が正しい書かれているときには、正しい動作します:

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

しかし、シーケンス内の単語(またはいくつかの単語が)スペルが間違っているとき、それは間違って動作します:

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

は、残念ながら、私が持っていますこれを修正して、segment()関数を、スペルミスのある連結単語で機能させる方法は考えられません。

誰もこの問題に対処する方法を知っていますか?

+1

これは難しい問題です。多くの研究がこれに入ります。 – erip

+0

この問題の調査に関する記事をご存知ですか? –

答えて

0

これはPeter Norvigのalgorithmによってわずかな変更で達成できました。トリックは、アルファベットにスペース文字を追加し、すべてのバイグラムをスペース文字で区切って一意の単語として扱うことです。

big.txtにはdeep learningバイグラムが含まれていないので、少し多くのテキストを辞書に追加する必要があります。より多くのテキストを入手するにはwikipedia librarypip install wikipedia)を使用します。

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() 

今だけnew_dict.txtからbig.txtを変更、edits1機能にletters変数にspace文字を追加し、変更するには、この機能:

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 

私はすべてのユニグラムとバイグラムを使用して新しい辞書を作成します。

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

to this:

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

今すぐcorrection("deeplerning")が返されます。'deep learning'

このトリックは、特定のドメインのスペルチェックが必要な場合に効果的です。このドメインが大きい場合は、最も一般的なunigrams/bigramsだけを辞書に追加しようとすることができます。

このquestionも役立ちます。

関連する問題