2

単語のすべての語形変化を同じ基本単語として扱う検索エンジンを作成しようとすると、うまくいきません。

  1. したがって、動詞の場合、これらはすべて同じ語根語である be :
    • 人数/人 (例: am; is; are )
    • 過去または未来の時制のような時制/気分 (例: was; were; will be )
    • 過去分詞 ( has been ; had been )
    • 現在分詞と動名詞 ( is being ; was not being funny ; 早いこと正しいことよりも重要ではない)
    • 仮定法 ( might be ;何かを終わらせることが重要; だったらいいのに) ⁠ ⁠ ⁠</p>

  2. 次に、名詞の場合、単数形と複数形の両方が同じ基本単語としてカウントされます [ ᴇᴅɪᴛᴏʀ's ɴᴏᴛᴇ: これは単語の引用形と呼ばれることがよくあります。]

たとえば、「<em>enable」では、「<em>enables」と「<em>enabled」を別々のエントリとして出力したくありません。これらの 3 つすべては、同じ基本単語、動詞enableとしてカウントする必要があります。

次のようなハッシュを使用して、重複の印刷を防ぐことができます。

unless ($seenmatches{ $headmatches[$l] }++)
  1. 誰かがこれを説明できますか?以下のコメントで説明します。

  2. これは、複数形/過去形の継続を止めるものではありません。これを行う方法、または完全に異なるアプローチ、おそらく正規表現および/または置換を含む方法はありますか?

印刷が正しく印刷されないため、置換で単語を変更することはできません。まだその段階ではありませんが、最終的には不規則な過去時制 [ ᴇᴅɪᴛᴏʀ's ɴᴏᴛᴇ: ] と不規則名詞も含めたいと考えています。] 同じように

私の質問に答えるために他に何が必要なのかわからないので、意図せずに省略したものを教えてください。不足しているビットがあれば、より明確にするために記入します.

4

4 に答える 4

5

一般的な検索エンジンの仕組みは次のとおりです。

  • 入力文字列はトークン化され、単語境界で切り刻まれます - 文字オフセットの開始/終了が各トークンに関連付けられます
  • その後、各トークンがステミングされます - Porter ステマーのわずかに更新されたバージョンであるLingua::Stem(または、より良い) を使用します。Lingua::Stem::Snowball
  • 各トークンは、元の文字オフセットの開始/終了とともに保持され、トークン化される前に、通常は元のテキストのコピーと共にインデックスが作成されます。これは基本的に、テキストという用語を元のドキュメント (通常は識別子として) に関連付けるテーブルです。

これで、クエリが到着すると、それもトークン化され、各トークンがステミングされますが、今回は位置は気にしません。インデックスを作成したトークンに対して各トークンを検索し、投稿を見つけます (一致するドキュメント識別子)。保存された開始/終了オフセットを取得して、用語が元のテキストのどこにあったかを判断できるようになりました。

したがって、インデックスの接尾辞(一致するドキュメントを見つけるために使用されていたもの) は失われますが、元のテキストとそれらのドキュメントのオフセットは保持されるため、必要に応じてクエリの強調表示や適切な表示を行うことができます。

ステミングは間違いなくこの仕事に適したツールです。主な秘訣は、クエリとドキュメントを同じように扱うことです。元のドキュメントを変更することはできますが、実際には、正規表現を使用する文字列ではなく、本の裏のインデックスのようなものに変換したいと考えています。必要に応じて、CPANの優れたKinoSearchモジュールを確認するか、元の Apache Lucene プロジェクトを参照してください。

于 2011-05-31T19:06:06.350 に答える
1

Text::Englishモジュールには Porter ステマーが含まれています。これは、同じ単語の異なる形式を照合目的で同一として扱う通常の方法です。

于 2011-05-31T17:33:45.910 に答える
1

verbTenseChanger.pl ( http://cogcomp.cs.illinois.edu/page/tools_view/1 ) を確認してください。readme は次のとおりです。

##codes for the various tenses are:
#0 - Base Form
#1 - Past Simple
#2 - Past Participle
#3 - 3rd Person Singular
#4 - Present Participle

##Example use:
##my $newTense = changeVerbForm("see",0,4);
##changes tense from base form to the present participle

さまざまなフォームを作成して、これを使用しました(ステマーが含まれていると思います)。

my @changeverbforms = map changeVerbForm( $search_key, 0, $_ ), 1..4;
my @verbforms;
push (@verbforms, $changeverbforms[0]) unless ($changeverbforms[0] eq "");
push (@verbforms, $changeverbforms[1]) unless ($changeverbforms[1] eq "");
push (@verbforms, $changeverbforms[2]) unless ($changeverbforms[2] eq "");
push (@verbforms, $changeverbforms[3]) unless ($changeverbforms[3] eq "");

そして、@verbforms(検索エンジンのperlコード全体を)ループして$search_key、持っていたすべての場所に、or $verbform. 修正すべきいくつかの余分なことがありましたが、それは一般的な実装です(私の特定の状況ではありますが)

問題のあるオンライン コードのデバッグについては、次を参照してください

于 2011-06-08T19:21:28.663 に答える