私は最近、さまざまな単語に略語を使用するデータセットに取り組んでいました。例えば、
wtrbtl = water bottle
bwlingbl = bowling ball
bsktball = basketball
慣例に関して一貫性がないようでした。つまり、母音を使用する場合と使用しない場合があります。完全なコーパスや用語の包括的なリストなしで、略語とそれに対応する単語について上記のようなマッピングオブジェクトを構築しようとしています(つまり、明示的に知られていない略語が導入される可能性があります)。簡単にするために、ジムで見つけるものに限定されていると言いますが、それは何でもかまいません。
基本的に、例の左側だけを見ると、各略語を対応するフルテキストラベルに関連付けるという点で、どのようなモデルが私たちの脳と同じ処理を実行できますか。
私のアイデアは、最初と最後の手紙を取り、辞書でそれらを見つけることに止まりました。次に、コンテキストに基づいて事前確率を割り当てます。しかし、Wordの終わりを示すマーカーのない形態素が多数あるため、それらを分割する方法がわかりません。
更新しました:
また、一致評価アルゴリズムなどのいくつかの文字列メトリックアルゴリズムを組み合わせて、関連する用語のセットを決定し、セット内の各単語とターゲットの略語とのレーベンシュタイン距離を計算するというアイデアもありました。しかし、マスターディクショナリーにない単語の略語に関しては、私はまだ暗いままです。基本的に、Wordの構築を推論します-Naive Bayesモデルが役立つかもしれませんが、上記のアルゴリズムを使用することによって引き起こされる精度のエラーがモデルのトレーニングプロセスを無効にするのではないかと心配しています。
私は本当にこれにこだわっているので、どんな助けもありがたいです。
網羅的な辞書が見つからない場合は、確率的言語モデルを構築(またはダウンロード)して、文の候補を生成および評価できます。これは、文字のn-gramモデルまたはニューラルネットワークです。
省略形については、文字の脱落の確率を予測する「ノイズモデル」を作成できます。コーパスから学習することができます(手動または半手動でラベルを付ける必要があります)。
複雑な言語モデルと単純なノイズモデルがあるため、noisy channelアプローチを使用してそれらを組み合わせることができます(例 Jurafskyによる記事 ) =詳細については)、候補文を提案します。
更新。私はこの問題に熱心になり、このアルゴリズムを実装しました:
私のソリューションは実装されています このPython Notebook です。トレーニングされたモデルでは、noisy_channel('bsktball', language_model, error_model)
のようなインターフェイスがあり、これは_{'basket ball': 33.5, 'basket bally': 36.0}
_。辞書値は提案のスコアです(低いほど良い)。
他の例では、これはさらにうまくいきます: 'wtrbtl'の場合は_{'water but all': 23.7, 'water but ill': 24.5, 'water but lay': 24.8, 'water but let': 26.0, 'water but lie': 25.9, 'water but look': 26.6}
_を返します。
'bwlingbl'の場合、_{'bwling belia': 32.3, 'bwling bell': 33.6, 'bwling below': 32.1, 'bwling belt': 32.5, 'bwling black': 31.4, 'bwling bling': 32.9, 'bwling blow': 32.7, 'bwling blue': 30.7}
_になります。ただし、適切なコーパス(たとえば、スポーツ雑誌やブログ、おそらく名詞のオーバーサンプリング)でトレーニングしたり、ビーム検索の幅をより広くしたりすると、このモデルはより適切な提案を提供します。
だから私は同様の問題を見て、 PyEnchant と呼ばれる素晴らしいパッケージに出くわしました。スペルチェッカーでビルドを使用すると、Wordの候補を取得できます。これは、素晴らしくシンプルなソリューションです。 ただし(私が知る限り)単一の単語のみを提案するため、状況は次のようになります。
wtrbtl = water bottle
動作しないでしょう。
ここにいくつかのコードがあります:
import enchant
wordDict = enchant.Dict("en_US")
inputWords = ['wtrbtl','bwlingbl','bsktball']
for Word in inputWords:
print wordDict.suggest(Word)
出力は次のとおりです。
['rebuttal', 'tribute']
['bowling', 'blinding', 'blinking', 'bumbling', 'alienable', 'Nibelung']
['basketball', 'fastball', 'spitball', 'softball', 'executable', 'basketry']
たぶん、どのような略語があるか知っているなら、文字列を2つの単語に分けることができます。
'wtrbtl' -> ['wtr', 'btl']
自然言語処理キット( [〜#〜] nltk [〜#〜] )もあります。これは驚くべきことであり、これを上記のコードと組み合わせて、それぞれがどの程度一般的であるかを調べることで使用できます。たとえば、言葉です。
幸運を!
1つのオプションは、時間をさかのぼって Soundex Algorithm を計算することです。
Soundexはすべての母音を削除し、一般的な誤発音を処理し、つづりを修正しました。アルゴリズムは単純化されており、手作業で行われていました。欠点は、特別なWordステミングや作業停止サポートがないことです。
...マスター辞書にない単語の略語。
それで、あなたは以前にそれらを見たことがなくても、有効な英単語を思い付くことができるNLPモデルを探していますか?
より包括的なWord辞書を見つけること、または既存の辞書の各Wordを+"es"
やWord[:-1] + "ies"
などの一般的な拡張子にマップすることはおそらく簡単です。