実際の単語を生成するステミングアルゴリズム
-
08-07-2019 - |
質問
テキストの段落を取り、そこから「タグ」のリストを抽出する必要があります。このほとんどは非常に簡単です。しかし、重複を避けるために、結果の単語リストをステミングするためのいくつかの助けが必要です。例:コミュニティ/コミュニティ
Porter Stemmerアルゴリズムの実装を使用しました(ちなみにPHPで書いています):
http://tartarus.org/~martin/PorterStemmer/php.txt
これはある程度までは機能しますが、" real"を返しません。言葉。上記の例は「commun」に由来しています。
「雪だるま」を試しました(別のStack Overflowスレッド内で推奨)。
http://snowball.tartarus.org/demo.php
私の例(コミュニティ/コミュニティ)では、Snowballは" communiti"に由来しています。
質問
これを行う他のステミングアルゴリズムはありますか?他の誰かがこの問題を解決しましたか?
現在の考えでは、重複を避けるためにステミングアルゴリズムを使用し、次に表示される実際の単語として最も短い単語を選択することができます。
解決
ここでの中心的な問題は、ステミングアルゴリズムが純粋に言語のスペルルールに基づいて音声ベースで動作し、使用している言語を実際に理解していないことです。実際の単語を生成するには、ステムを実際の単語に戻すために、ステマーの出力を何らかの形式のルックアップ関数とマージする必要があります。基本的に、これを行う2つの潜在的な方法を見ることができます。
- 各可能性のある語幹を実際の単語にマップする大きな辞書を検索または作成します。 (例:コミュニティ->コミュニティ)
- 各語幹をその語幹に短縮された単語のリストと比較し、どれが最も類似しているかを判断しようとする関数を作成します。 (たとえば、「コミュニティ」がより類似したオプションとして認識されるように、「コミュニティ」と「コミュニティ」および「コミュニティ」を比較します)
個人的に、私はそれを行う方法は動的な形の#1だと思います、調べられたすべての単語とそれが由来するものを記録してカスタム辞書データベースを構築し、最も一般的な単語がそれを使用する必要があります。 (たとえば、ソーステキストの本文で「コミュニティ」よりも「コミュニティ」を頻繁に使用している場合は、コミュニティ->コミュニティをマップします。)辞書ベースのアプローチは、より正確で、ステマー入力に基づいて構築します。テキストに合わせてカスタマイズされた結果が提供されますが、主な欠点は必要なスペースであり、これは一般に最近では問題ではありません。
他のヒント
私が正しく理解していれば、必要なのはステマーではなく、補助詞です。 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
ちょっと遅すぎるかどうかはわかりませんが、実際の単語を生成するPHPステミングスクリプトは http:// phpmorphyだけです。 .sourceforge.net / – それを見つけるのに何年もかかりました。他のすべてのステマーはコンパイルする必要があり、その後も、レンマーではなくステムを生成するPorterアルゴリズムに従ってのみ動作します(つまり、community = communiti)。 PhpMorphy oneは完璧に動作し、インストールと初期化が簡単で、英語、ロシア語、ドイツ語、ウクライナ語、エストニア語の辞書があります。また、他の辞書をコンパイルするために使用できるスクリプトが付属しています。ドキュメンテーションはロシア語ですが、Google翻訳で確認すれば簡単です。