web-dev-qa-db-ja.com

実際の単語を生成するステミングアルゴリズム

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

私はポーターステマーアルゴリズムの実装を使用しました(ところで、PHPで書いています):

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

これはある程度までは機能しますが、「本当の」言葉を返しません。上記の例は、 "commun"に由来します。

「スノーボール」を試しました(別のスタックオーバーフロースレッド内で推奨)。

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

私の例(コミュニティ/コミュニティ)の場合、Snowballは「communiti」に派生します。

質問

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

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

36
Dave

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

  1. 考えられる各語幹を実際のWordにマップする大きな辞書を見つけるか作成します。 (例:コミュニティ->コミュニティ)
  2. 各語幹をその語幹に削減された単語のリストと比較し、どれが最も類似しているかを判別する関数を作成します。 (例えば、「コミュニティ」が「コミュニティ」と比較され、「コミュニティ」がより類似したオプションとして認識されるような方法で「コミュニティ」)

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

16
Dave Sherohman

私が正しく理解していれば、必要なのはステマーではなく、見出し語処理です。 Lemmatizerは、-ies-edなどの語尾に関する知識を持つツールですなど、およびwrittenなどの例外的な語形。

英語には多くの見出し語がありますが、私はmorphaしか使用していません。 Morphaは、実行可能ファイルにコンパイルできる大きなLexファイルです。使用例:

$ cat test.txt 
Community
Communities
$ cat test.txt | ./morpha -uc
Community
Community

モルファは http://www.informatics.sussex.ac.uk/research/groups/nlp/carroll/morph.html から取得できます。

50
Kaarel

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

14