1

ノイズのある同様の文字列がたくさんあるとします。主に、単語が誤って接続/切断されています。好き:

 "Once more unto the breach, dear friends. Once more!"
 "Once more unto the breach , dearfriends. Once more!"
 "Once more unto the breach, de ar friends. Once more!"
 "Once more unto the breach, dear friends. Once more!"

どうすれば全員を同じ単語のセットに正規化できますか?つまり、

 ["once" "more" "unto" "the" "breach" "dear" "friends" "once" "more"]

ありがとう!

4

2 に答える 2

3

ここにいくつかの指針があります。最終的には、遭遇するさまざまな種類の異常をすべて修正する一連のルーチン/関数を作成する必要があると思います。

幸いなことに、一連の「修正」を段階的に追加して、パーサーを改善し続けることができます。

私も似たようなことをしなければなりませんでしたが、Peter Norvig によるこの投稿は非常に役に立ちました。(これは Python であることに注意してください。)

特にこの機能には、不規則な単語を「修正」するための分割、削除、転置、挿入など、必要なアイデアがあります。

def edits1(word):
   splits     = [(word[:i], word[i:]) for i in range(len(word) + 1)]
   deletes    = [a + b[1:] for a, b in splits if b]
   transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1]
   replaces   = [a + c + b[1:] for a, b in splits for c in alphabet if b]
   inserts    = [a + c + b     for a, b in splits for c in alphabet]
   return set(deletes + transposes + replaces + inserts)

上記は、Norvig のスペル修正プログラムからの 1 つのスニペットです。

コードをそのまま使用できない場合でも、核となるアイデアはあなたのケースに適用できます: あなたのケースでは不規則な単語であるトークン (「単語」) を取り、さまざまな調整を試みて、それが大きなものに属しているかどうかを確認します。既知および受け入れられている単語の辞書。

それが役立つことを願っています。

于 2012-11-21T19:02:39.303 に答える
1

ちょっとクレイジーなアイデアです。今週生徒に提案しようとしているアルゴリズムを教えていたので、私はそれを提案しているだけです.

文からすべての空白を削除します。たとえば、 become にde ar friendsなりdearfriendsます。空白のない文字列を単語の最も可能性の高いシーケンスに分割するための二次時間線形空間動的計画法アルゴリズムが存在します。そのアルゴリズムについては、ここここで説明します--- 2 番目の解決策は、私が考えているものです。ここでの前提は、単語とは何かについての優れたモデルがあり、そのモデルのクエリに一定の時間がかかることです。

于 2012-11-22T20:41:20.130 に答える