36

テキストの段落を取り、そこから「タグ」のリストを抽出する必要があります。これのほとんどは非常に簡単です。ただし、重複を避けるために、結果の単語リストをステミングするためのヘルプが必要です。例:コミュニティ/コミュニティ

私はPorterStemmerアルゴリズムの実装を使用しました(ちなみに私はPHPで書いています):

http://tartarus.org/~martin/PorterStemmer/php.txt

これはある程度までは機能しますが、「実際の」単語は返されません。上記の例は「commun」に由来しています。

「Snowball」を試しました(別のStack Overflowスレッド内で提案されています)。

http://snowball.tartarus.org/demo.php

私の例(コミュニティ/コミュニティ)では、Snowballは「communiti」に由来します。

質問

これを行う他のステミングアルゴリズムはありますか?他の誰かがこの問題を解決しましたか?

私の現在の考えは、ステミングアルゴリズムを使用して重複を回避し、遭遇した最短の単語を選択して実際に表示する単語にすることができるというものです。

4

3 に答える 3

16

ここでの中心的な問題は、ステミング アルゴリズムが、使用している言語を実際に理解せずに、純粋に言語のスペル ルールに基づいて音声ベースで動作することです。実際の単語を生成するには、ステマーの出力を何らかの形式の検索関数とマージして、ステムを実際の単語に変換する必要があります。これを行うには、基本的に次の 2 つの方法が考えられます。

  1. 可能性のある各語幹を実際の単語にマップする大規模な辞書を検索または作成します。(例: コミュニティ -> コミュニティ)
  2. 各語幹をその語幹に縮小された単語のリストと比較し、どれが最も類似しているかを判断しようとする関数を作成します。(例えば、「コミュニティ」と「コミュニティ」および「コミュニティ」を比較して、「コミュニティ」がより類似したオプションとして認識されるようにする)

個人的には、私が行う方法は、#1 の動的な形式であると思います。つまり、調べたすべての単語とその語幹を記録し、最も一般的な単語が適切な単語であると仮定してカスタム辞書データベースを構築します。使用済み。(たとえば、ソース テキストの本文で「コミュニティ」よりも「コミュニティ」を使用する頻度が高い場合は、コミュニティ -> コミュニティをマッピングします。) 辞書ベースのアプローチは一般的により正確であり、ステマー入力に基づいて構築すると結果が得られます。テキストに合わせてカスタマイズできますが、主な欠点はスペースが必要なことですが、これは最近では一般的に問題ではありません。

于 2008-10-10T11:22:12.283 に答える
15

それが遅すぎるかどうかはわかりませんが、実際の単語を生成する PHP ステミング スクリプトは 1 つしかありません: http://phpmorphy.sourceforge.net/ - それを見つけるのに何年もかかりました。他のすべてのステマーはコンパイルする必要があり、その後も、補題ではなくステムを生成する Porter アルゴリズムに従ってのみ機能します (つまり、community = communiti)。PhpMorphy one は完璧に機能し、インストールと初期化が簡単で、英語、ロシア語、ドイツ語、ウクライナ語、エストニア語の辞書があります。また、他の辞書をコンパイルするために使用できるスクリプトも付属しています。ドキュメンテーションはロシア語ですが、Google 翻訳を使用すると簡単に翻訳できます。

于 2012-06-06T11:52:39.527 に答える