2

ヨーロッパの多くの言語には屈折があります。これは、テキスト内で 1 つの単語を複数の形式で記述できることを意味します。たとえば、ポーランド語の「コンピューター」という単語には、「コンピューター」、「コンピューター」、「コンピューター」、「コンピューター」などの複数の形式があります。

言語の変化に対処するために django+haystack+whoosh を適切に使用するにはどうすればよいですか?

「komputer」、「komputera」、「komputerowi」のいずれかの形式を検索するときはいつでも、これと同じことを意味します->「komputer」。

NLP には、単語のステミング (接尾辞の切り取り) またはフォームを基本フォームへの変換 ("komputerowi" => "komputer") に基づく基本的なアプローチがあります。それを支援するライブラリがいくつかあります。

私が最初に考えたのは、特定の変数で認識されたすべての単語を、フォームではなく基本フォームを使用してテキストに変換する特別なテンプレート フィルターを準備することでした。次に、django + haystack の検索インデックス テンプレートで使用できます。whooshエンジンで評価する前に検索クエリも変換される場合、これはうまく機能するはずです。例を参照してください:

haystack search index template:
    {{some_indexed_text|convert_to_base_form_filter}}

text to index: "Nie ma komputera"  => "Nie ma komputer" <- this is really indexed
 search query: "komputery"         => "komputer"   <-- this will match 

しかし、これがこの問題の「エレガントな」解決策だとは思いません。また、スペルミスの提案を提案するなど、他のいくつかの機能も機能しません。

では、この問題をどのように解決すればよいですか? たぶん、whoosh 以外の検索エンジンを使用する必要がありますか?

4

2 に答える 2

5

私は非常によく似た問題を抱えていたので、私が助けてくれることを願っています。

Whooshは、デフォルトでは、英語の語幹のみを使用しています。
別の言語のステミングを実装するには、まず内部を調べます。

/your_path_to_whoosh/whoosh/lang/analysis.py

ここでStemmingAnalyzer(デフォルトのアナライザー)が定義され、優れた出発点になります。stemからインポートされた関数porter.pyは、他の重要な場所です。

したがって、3つのステップは次のとおりです。

  • porter.pyのstem関数と、ルールを正しく取得するために必要な文法および言語の参照を参照として使用して、独自のsteming関数を実装します。

  • StemmingAnalyzer内部を参照して、独自のアナライザーを実装しますanalysis.py。ファイルは詳細に文書化されているため、問題なくナビゲートできます。これは基本的に、単語に一致する正規表現を使用したStemmingAnalyzeraのチェーン、小文字のフィルター、および基本的に上記のステミング関数を呼び出すステミングフィルターであることがわかります。Tokenizerステミング関数をパラメーターとして受け取るので、フィルターを再実装する必要はありませStemFilterん。

  • スキーマの作成時に新しいアナライザー関数を渡します。http://files.whoosh.ca/whoosh/docs/latest/schema.html#creating-a-schemaを参照してください。

これがお役に立てば幸いです。

于 2010-10-10T10:37:56.910 に答える
4

将来の読者のために: Whoosh は Snowball Stemmer を使用してさまざまな言語を処理できます。

from whoosh.lang.snowball.russian import RussianStemmer
stemmer_ru = RussianStemmer()
analyzer = StemmingAnalyzer(stemfn=stemmer_ru.stem)
schema = fields.Schema(
    name=fields.TEXT(analyzer=analyzer),
)
于 2014-11-10T21:41:59.537 に答える