どうすれば「正常化」できますか
word = 'yeeeessssssss'
に
word = 'yes'
それ以上の情報がなければ、あなたの質問に答えることは不可能です。あなたが述べたように、イテラブルから重複を削除したいと考えています。あなたはそれを行うことができますitertools.groupby
:
>>> "".join(c for c, _ in groupby("yeeessssss"))
'yes'
もちろん、それはすべての重複を削除します:
>>> dedupe = lambda s: "".join(c for c, _ in groupby(s))
>>> dedupe("hello")
'helo'
>>> dedupe("Mississippi")
'Misisipi'
あなたの質問はおそらくもっと難しいと思います。つまり、文字が重複している可能性のある単語を実際の英単語に正規化する方法です。これを正確に行うことは基本的に不可能beeeeeee
ですfeeeed
。-- しかし、多くの努力をすれば、おそらくさまざまなヒューリスティックのいずれかで近似できるでしょう。
簡単な方法の 1 つは、その単語が辞書に載っているかどうかを確認し、そうでない場合は、重複する文字を 1 つずつ削除することです。これは非常に非効率的ですが、うまくいくかもしれません。
もう 1 つの方法は、自然言語ライブラリを使用して単語を「標準形」に変換することです。これは、それがどのように聞こえるか、どのように綴られるか、または他の何かによる可能性があります. 次に、その正規形に最も近い単語を見つけて、それを使用して重複除去された単語を与えることができます。
さらに別の方法は、文字列間の何らかの「変更距離」を定義することです。この場合、「文字の削除」、「文字の挿入」、「文字の変更」の各操作に固定コストを割り当てます。次に、このメトリックの下で入力に最も近い単語を計算できます。これはバイオインフォマティクスで使用されるため、よく研究されている問題であり、洗練された動的計画法のアプローチがあります。残念ながら、解決するのも非常に困難です (関連する質問は、私の学部での数週間のコースワーク プロジェクトでした)。
;tl,dr
重複を削除するのは簡単です。英単語として最適な近似値を見つけるのは非常に困難です。
正規化することで、繰り返される文字を削除することを意味する場合、これは機能するはずです:
re.sub(r'(\w)\1+', r'\1', 'yeeeesssss') // yes
これは、スペル チェッカーを使用して行う必要があることと似ているようです。
よく使用される解決策の 1 つは、Soundex 関数を使用して単語を「どのように聞こえるか」に変換し、それを既知の有効な単語辞書と比較することです。私はそれが絶対確実だとは思いませんが、あなたを正しい方向へと導くかもしれないアイデアです.
http://en.wikipedia.org/wiki/Soundex
Soundex だけが選択肢ではありません。また、Metaphone や他のいくつかの同様のアルゴリズムが機能する可能性があります。
ここに Python を使用した Soundex に関する以前の質問があります: Python のSoundex アルゴリズム (宿題のヘルプ リクエスト)
おそらく最も難しい部分は良い辞書を見つけることですが、私はこの検索でうまくいきました: http://www.bing.com/search?q=download+word+list&qs=n&form=QBRE&pq=download+word+list&sc= 8-18&sp=-1&sk=
何をしても完璧にはなりません。いくつかのコメントで指摘されているように、英語 (さらに言えば、どの言語でも) を扱うには多くの複雑な問題があります。たとえば、「to」と「to」の区別は文脈によって異なります。Microsoft などは、何年にもわたるスペル チェッカーの開発を通じて開発者のチームを投入してきましたが、スペル チェッカーはまだ 100% の確率で正確に行うことができず、依然として人間の介入が必要です。単語の正規化でも同じ問題に直面すると思います。
モジュールを使用してenchant
、返された単語が英単語かどうかを確認します。
import enchant,itertools
d_us= enchant.Dict("en_US")
d_uk= enchant.Dict("en_UK")
words=[]
teks=teks='yeeeessssssss'
for x in itertools.permutations(set(teks)):
if d_us.check(''.join(x)) or d_uk.check(''.join(x)):
words.append(''.join(x))