5

バックグラウンド

データベースの列名を対応する英語のテキストに分割して、データ ディクショナリをシードします。英語辞書は、企業文書、wiki、および電子メールのコーパスから作成されます。辞書 ( lexicon.csv) は単語と確率を含む CSV ファイルです。したがって、誰かが「セラピスト」という単語を(電子メールまたはウィキページで)書く頻度が高いほど、「セラピスト名」が他の何かではなく「セラピスト名」に分割される可能性が高くなります. (レキシコンには、おそらくレイピストという単語さえ含まれないでしょう。)

ソースコード

データファイル

問題 (2011 年 1 月 3 日更新)

次の問題が発生した場合:

dependentrelationship::end depend ent dependent relationship
end=0.86
ent=0.001
dependent=0.8
relationship=0.9

次の解決策が考えられます。

dependentrelationship::dependent relationship
dependentrelationship::dep end ent relationship
dependentrelationship::depend ent relationship

レキシコンには、相対的な確率 (単語の頻度に基づく) を持つ単語が含まれています: dependent 0.8end 0.86relationship 0.9depend 0.3、およびent 0.001

dep end ent relationshipなぜなら、辞書にないためdep(つまり、75% の単語使用)のソリューションを削除し、他の 2 つのソリューションは辞書内の単語の 100% をカバーします。残りの解のうち、 の確率dependent relationship0.72ですが、 0.00027depend ent relationshipです。したがって、正解として選択できます。dependent relationship

関連している

質問

与えられた:

// The concatenated phrase or database column (e.g., dependentrelationship).
String concat;

// All words (String) in the lexicon within concat, in left-to-right order; and
// the ranked probability of those words (Double). (E.g., {end, 0.97}
// {dependent, 0.86}, {relationship, 0.95}.)
Map.Entry<String, Double> word;

レキシコンの範囲と確率に基づいて最も可能性の高いソリューションを生成するルーチンをどのように実装しますか? 例えば:

for( Map.Entry<String, Double> word : words ) {
  result.append( word.getKey() ).append( ' ' );

  // What goes here?

  System.out.printf( "%s=%f\n", word.getKey(), word.getValue() );
}

ありがとうございました!

4

3 に答える 3

1

Peter Norvig は Python でいくつかのことを書いています。

http://norvig.com/ngrams/ngrams.py

セグメントと呼ばれる機能が含まれています。一連の単語の単純ベイズ確率を実行します。うまくいきます。Javaで達成しようとしていることの良い基礎になる可能性があります。

もしあなたがそれをJavaに変換したなら、私はその実装を見たいと思っています。

ありがとう。

マイク

于 2011-01-24T15:44:43.660 に答える
0

あなたの問題はNLPで非常に一般的な問題です-車輪の再発明から始めないでください-それはあなたに長い時間がかかり、すでにそこにあるものほど良くはありません。

確かに、NLPライブラリが提供するものを確認することから始める必要があります:http://en.wikipedia.org/wiki/Natural_language_processingおよびhttp://en.wikipedia.org/wiki/Category:Natural_language_processing_toolkits。あなたの問題は一般的なものであり、あなたのコーパスのために探求する必要があるさまざまなアプローチがあります。

あなたの単語分割はハイフンルーチンの下にあるかもしれません。考えられる2つのアプローチは、n-gram(たとえば、4文字の部分文字列の頻度を使用して境界を予測する)と、単語の一般的な開始または終了を示す試行です。これらのいくつかは、スペルミスに役立つ可能性があります。

しかし、簡単な答えはありません。自分に最適なものを見つけてください。

于 2011-01-02T23:09:51.927 に答える
0

私は少し違った方法で問題に取り組みます。「終了」と「従属」が重複していることは重要ですが、マップという言葉ではそれが失われています。単一の単語マップの代わりに、重複しない単語のみで構成される、列名の可能なセグメンテーションを表す一連の単語マップを作成する場合、単語の確率に基づいて各セグメンテーションのスコアを計算できます。そして語長。セグメンテーションのスコアは、セグメンテーション内の個々の単語のスコアの平均になります。個々の単語のスコアは、次のような単語の長さ (l) と確率 (p) の関数になります。

スコア=al + bp
ここで、a と b は適切なミックスを得るために微調整できるウェイトです。各単語のスコアを平均してセグメンテーションのスコアを取得し、スコアが最も高いセグメンテーションを選択します。スコア関数も線形の重み付けである必要はありません。対数、指数、または高次の多項式 (たとえば、2 乗) を試すことができます。

于 2011-01-02T22:58:48.533 に答える