1

助けが必要な興味深い問題があります。私は現在、自分のプログラムの機能に取り組んでおり、この問題に遭遇しました

  1. データベースに保存されているインドネシアのストリート名の膨大なリスト(> 100k行)があります。各ストリート名には複数の単語が含まれている可能性があります。例:「Sudirman」、「Gatot Subroto」、または「JalanAsiaAfrika」はすべて正当な通りの名前です

  2. データベースにたくさんのテキスト(> 100万行)があり、それを文に分割します。さて、私がしなければならない機能(正確には関数)は、文の中に通りの名前があるかどうかをテストすることなので、真/偽のテストだけです

    私はこれらのステップを実行することによってそれを解決しようとしました:

a。通りの名前をKey、Valueハッシュに入れる

b。各文を単語に分割する

c。単語がハッシュに含まれているかどうかをテストします

これは高速ですが、複数の単語では機能しません

私が考えたもう1つの方法は、次の手順を実行することです。

a。各文を単語に分割する

b。LIKEステートメントを使用してデータベースをクエリします(つまり、SELECT #### FROM street_table WHERE name like'%word%')

c。クエリが行を返した場合、それは文に通りの名前が含まれていることを意味します

現在、このソリューションは非常にIOを集中的に使用します。

だから私の質問は「このテストを行うための最も効率的な方法は何ですか」ですか?プログラミング言語に関係なく。私は主にPythonでこれを行いますが、概念を理解できる限り、どの言語でもかまいません

============編集1=================

これは定期的ですか?

はい、この機能を1分間隔で呼び出します。各呼び出しは、少なくとも100行のテキストを受け取り、ストリート名データベースに対してテストします。

4

4 に答える 4

2

簡単な解決策は、first-word-of-street-name => full-street-name(s)を使用して辞書/マルチマップを作成することです。文中の各単語を繰り返すと、潜在的な通りの名前を検索し、一致するものがあるかどうかを確認します(次の単語を確認します)。

このアルゴリズムは、実装がかなり簡単で、パフォーマンスもかなり良いはずです。

于 2012-06-11T12:00:21.083 に答える
1

nlpを使用すると、文の適切な名詞を判別できます。以下のリンクを参照してください。

http://nlp.stanford.edu/software/lex-parser.shtml

スタンドフォードパーサーは、その計算が正確です。適切な名詞ができたら、従うべきアプローチを決めることができます。

于 2012-06-11T11:53:10.787 に答える
0

それで、あなたは文書を持っていて、それがあなたのストリートネームのリストのいずれかを含んでいるかどうかを調べたいですか?

Turbo Boyer-Mooreは、それを行うための良い出発点です。

ターボボイヤームーアの詳細はこちら

しかし、私はあなたが通りの名前のリストの構成について何かをしなければならないと強く信じています。バケットにアクセスできる必要があります。つまり、通りの名前を簡単にフィルタリングできます。

ここに例があります:通りの名前:Asia-Pacific-street

次の方法でリストにアクセスできます。A(Aで始まるすべての開始点を取得)AS(ASで始まるすべての開始点を取得)

等々...

そのためには、少なくとも26(最初の文字)* 26(2番目の文字)のバケツがたくさんあるはずです。

バケット化に関する詳細情報

于 2012-06-11T11:51:42.227 に答える
0

Aho-Corasickアルゴリズムは非常に便利です。その利点の1つは、実行時間が検索している単語の数に依存しないことです(検索しているテキストの長さのみ)。通りの名前のリストが頻繁に変更されていない場合は特に便利です。

http://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_string_matching_algorithm

于 2012-06-14T22:09:00.627 に答える