3

長い項目別のテキストドキュメントからキーワードのリストを生成し、意味が似ている単語のエントリを組み合わせるテキスト処理プログラムを設計しています。そこにはメトリックがありますが、使用している辞書にない単語を処理するという新しい問題があります。

私は現在nltkとpythonを使用していますが、ここでの私の問題ははるかに抽象的な性質のものです。辞書にない単語を考えると、辞書にある単語にそれを解決する効率的な方法は何でしょうか?私の現在の唯一の解決策は、辞書内の単語を調べて、入力された単語からレーベンシュタイン距離(編集距離)が最も短い単語を選択することです。

明らかに、これは非常に遅くて実用的でない方法であり、含まれている単語であり、かなり近い限り、辞書内から完全に一致する必要はありません。ソリューションでは効率がより重要ですが、基本的なレベルの精度も必要になります。

未知の単語を辞書で既知の単語に一般的に解決する方法についてのアイデアはありますか?

4

4 に答える 4

1

辞書の単語と一致させるには、スペル修正が必要なようです。以下のコードは機能し、 PeterNorvigによって書かれたこのブログhttp://norvig.com/spell-correct.htmlから直接取得されました。

import re, collections

def words(text): return re.findall('[a-z]+', text.lower()) 

def train(features):
    model = collections.defaultdict(lambda: 1)
    for f in features:
        model[f] += 1
    return model

NWORDS = train(words(file('big.txt').read()))

alphabet = 'abcdefghijklmnopqrstuvwxyz'

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)

def known_edits2(word):
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)

def known(words): return set(w for w in words if w in NWORDS)

def correct(word):
    candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
    return max(candidates, key=NWORDS.get)

big.txtは、既知の単語を含む辞書です。

于 2015-04-14T19:27:35.480 に答える
0

あなたのタスクは、実際には単語以外のスペル修正のように聞こえます。したがって、比較的簡単な解決策は、カスタム辞書でaspellのような既存のスペルチェッカーを使用することです。

迅速で汚いアプローチは、metaphone(aspellで使用されるアルゴリズムの1つ)のような音声マッピングを使用することです。辞書から派生した可能性のあるコードごとに、修正として提案する代表的な単語(たとえば、グループ内で最も頻繁に使用される単語)を選択し、一致するものが見つからない場合のデフォルトの修正を選択します。しかし、おそらくaspellを使用するとより良い結果が得られるでしょう。

編集距離を計算したい場合は、辞書と可能な編集操作を試行して保存することにより、比較的迅速に計算できます。Brilland Moore(2000)を参照してください。適切なサイズのスペルミスとその修正のコーパスがあり、BrillとMooreのアプローチ全体を実装できる場合は、おそらくaspellをかなり打ち負かすでしょうが、aspell(または独自の辞書を作成できるスペルチェッカー)のように聞こえます)あなたのタスクには十分です。

于 2012-06-14T12:17:49.310 に答える
0

うまくいけば、この答えはあまり曖昧ではありません:

1)最初にトークン化とフレーズチャンクレイヤーを確認する必要があるようです。これは、ファジースペルチェックに送信する前に、シンボリックフレーズチャンクを破棄する必要がある場所です。

2)距離を編集して、その後の「スペルミス」トークンの代替案を考え出すことをお勧めしますが、これにより、同様に近い可能性のリストが返される場合があります。

3)可能性のリストができたら、共起アルゴリズムを使用して、このリストから最も可能性の高い候補を選択できます。役立つソフトウェアのJavaの例しかありません(http://www.linguatools.de/disco/disco_en.html#was)。単語を送信すると、その単語の最終的な共起単語が返されます。次に、このリストを「スペルミス」の単語のコンテキストと比較し、すべての潜在的な編集距離の単語から最も重複している単語を選択できます。

于 2013-03-07T14:58:44.000 に答える
0

レーベンシュタイン距離を使用して、意味が似ている単語を見つける理由がわかりません。LDはフォームを調べます(「バス」を「ブッシュ」ではなく「トラック」にマッピングします)。

正しい解決策は、次に何をしたいかによって異なります。

これらの未知の単語の情報が本当に必要でない限り、私はそれらすべてを単一の一般的な「UNKNOWN_WORD」アイテムに単純にマップします。

明らかに、文脈やその他の機能によって未知の単語をクラスター化することができます(たとえば、大文字で始まりますか)。コンテキストクラスタリングの場合:意味に関心があるので、これらの単語にはより大きなウィンドウ(たとえば、+ /-50単語)を使用し、おそらく単純な単語バッグモデルを使用します。次に、いくつかの距離計量(たとえば、コサイン)を使用して、この空間内のベクトルが未知の単語に最も近い既知の単語を見つけるだけです。これについてさらに情報が必要な場合はお知らせください。

于 2013-08-04T08:33:27.520 に答える