0

私は、生物医学実体に関する用語の長い辞書を持っています。各用語 (キー) には、識別子 (値) のリストがあります。

私はこの用語をフリーテキストで見つけなければなりません。私は約 300,000 用語の辞書をいくつか持っており、このタスクでは速度を評価するために Python と Java を使用しています。

アルゴリズムは次のようになります (Python の場合):

for sentence in text_list:
    terms = dictionary.keys()
    pattern = re.compile("|".join(terms))
    matches = pattern.finditer(sentence)
    for m in matches:
        ini = m.start()
        end = m.end()
        match = m.group(1)
        save_result(ini, end, match)

標準の re パッケージでは長い正規表現をコンパイルできないため、pypi.python.org/pypi/regexパッケージを使用しています。また、Java で同じアルゴリズムを実行しました。

私は約 650,000 文を使用しています。Python では、コンパイルに 3 ~ 4 分かかり、アルゴリズムは 3 ~ 4 時間で終了します。

Java は数秒で正規表現をコンパイルしますが、アルゴリズムには 16 ~ 18 時間かかります...O_o

私はさまざまな Web サイトを読んでおり、http://swtch.com/~rsc/regexp/regexp1.htmlには興味深い情報がありますが、処理方法がわかりません。

私の質問は... 私は 3 時間以内にすべての文を完成させました。同じことをより短い時間で達成する別の方法を知っていますか? 多分他の言語で、または他のライブラリやパッケージを使用していますか? (Java では、標準ライブラリを使用していますjava.util.regex.*)。上記の Web サイトでは、Thonpson NFA アルゴリズムについて説明しています。Java、Python などのこのアルゴリズムのライブラリまたはパッケージはありますか? grep(Linux) は強力なツールですが、使用できると思いますか?

4

2 に答える 2

2

正規表現はこの仕事には間違ったツールです。用語を使用して辞書(Pythonのハッシュテーブルの名前)を作成し、テキストを単語に分割し(string.splitとstring.rstripを使用して句読点を削除)、テキスト内の各単語をこの辞書と照合します。

于 2012-07-30T13:50:19.967 に答える
0

テキストのすべての文に対してREを再構築および再コンパイルしています。ループの外で一度コンパイルします。

terms = dictionary.keys()              # why are you using a dict?
pattern = re.compile("|".join(terms))

for sentence in text_list:
    matches = pattern.finditer(sentence)
    # etc.

それはあなたの時間を節約するはずです。

Cox によって記述されたアルゴリズムを備えた RE ライブラリが必要な場合は、彼のRE2ライブラリへの Python または Java バインディングを探してください。egrepまたは、または Awkを使用します。

于 2012-07-30T15:19:56.703 に答える