これは、ローカル システム上のテキスト ファイルのクエリに答えるための、Python に基づくファイル検索エンジンの基本的な実装です。 「tf-idf 用語重み付け」と「コサイン類似度」を使用して、一致するドキュメントの関連性をランク付けしました。 tf-idf の計算は事前に計算されるため、検索が大幅に高速になります。また、検索を高速化するためにステミング (Porter Stemmer) が使用されています。 Python の Tkinter ライブラリを使用した基本的なユーザー インターフェイスが提供されています。
python2 createIndex_tfidf.py stopwords.dat testIndex.dat titleIndex.dat
createIndex_tfidf.py は、コーパスの tdf-idf 値を計算するために 1 回だけ実行されます。
python2 queryIndex_tfidf.py stopwords.dat testIndex.dat titleIndex.dat
このステップでは、全体的に 3 つの異なるファイルが作成されます。
titleIndex.dat
このファイルには、コーパス内の各文書に割り当てられる一意の docId (文書 ID) が格納されます。
testIndex.dat
ここでは、すべてのドキュメントに出現するすべての一意の用語 (ストップワードを除く) に関する情報を含むインデックス ファイル (逆インデックス データ構造とも呼ばれます) が作成されます。各ドキュメントには、titleIndex に格納されるように 0 から始まる一意の ID が与えられます。だって。用語に関する情報は、次のようにインデックス ファイルに保存されます: term|docID0:pos1,pos2;docID1:pos3,pos4,pos5;…..|tf0,tf1,tf2...|idf ここでは tf0,tf1,tf2 docID0、docID1、docID2の用語の頻度をそれぞれ表します。 idf は逆文書頻度を表し、pos1 はそれぞれの文書内の用語の位置を表します。
行.dat
このファイルには、さまざまな文書内でその用語が存在する行に関する情報が保存されます。この行情報は次のように表されます: term|docID0:line1,line2;docID1:line3,line4,line5
これらのファイルを作成する前に、文書のすべての用語がストップワード リストでチェックされます。用語がストップワードに含まれる場合はスキップされ、それ以外の場合はその情報が上記のファイルに保存されます。また、各用語はインデックスに追加される前に Porter Stemmer によってステミングされます。
この例では、まず、ファイル lines.dat、titleIndex.dat、testIndex.dat のすべての情報が、Python の辞書を使用して再び保存されます。
現在、サポートされているさまざまなタイプのクエリは次のとおりです。
One Word クエリ (OWQ) これは単一用語クエリであり、その出力は、質問された用語を含む文書のリストと、その用語が各文書内で存在する行番号です。
マルチワードクエリ (MWQ) MWQ の入力は一連の単語であり、出力は行番号とともにクエリ用語のいずれかを含むドキュメントのリストです。
フレーズ クエリー (PQ) PQ への入力は再び単語のシーケンスであり、一致する文書は、指定された順序ですべてのクエリー用語を含む文書です。
クエリが存在するドキュメントのリストが見つかったので、次にそれらをランク付けします。ここで使用したランキング スキームは tf-idf に基づいています。 Tf-Idf は、文書内の各用語に、その用語頻度 (tf) と逆文書頻度 (idf) に基づいて重みを割り当てる重み付けスキームです。より高い重みスコアを持つ用語は、より重要であるとみなされます。これは、情報検索において最も一般的な重み付けスキームの 1 つです。
用語の用語頻度(tf)はドキュメント固有です。これは基本的に、文書 D 内での用語 t の出現数です。用語が文書内でより多く出現するほど、その重要性が高まるため、パラメータとして tf を選択することは非常に論理的です。ドキュメントは、サイズが no に等しいベクトルで表すことができます。文書内の一意の用語の数であり、各値は指定された文書内の用語の数を示します。共通のベクトル空間内のベクトルとしてドキュメントを表現することはベクトル空間モデルとして知られており、これは情報検索にとって非常に基本的なものです。しかし、ここに欠点が 1 つあります。文書のサイズが大きくなるにつれて、用語の頻度が増加するため、tf の重みも増加します。したがって、他の文書と同じ情報が含まれ、複数回コピーされた文書は、より重要であるとみなされます。この欠点を解消するために、ベクトル内の各値をノルムで除算して、ベクトルが単位ベクトルになるようにします。
tf ではすべての用語が同等に重要であるとみなされるため、文書内の用語の重みを計算するために用語の頻度だけを使用することはできません。ただし、一部の用語は出現頻度が低く、他の用語よりも差別的です。ランク付けの尺度として純粋に tf を使用する場合、音波のようなトピックを検索すると、用語の頻度が唯一のパラメータであるため、光波やその他の波を含むドキュメントが大量に取得される可能性があります。
この影響を軽減するために、逆ドキュメント頻度を使用します。用語の文書頻度は、基本的にはその用語を含む文書の数です。したがって、用語の逆文書頻度(idf)は、コーパス内の文書の数を用語の文書頻度で割ったものです。一般に、idf の係数は非常に大きく、log(idf) を使用するとより良い結果が得られることがわかっています。ログは増加機能なので、結果を妨げることなく使用できます。
tf と idf の両方を定義したので、これらを組み合わせて文書 d の用語 t の最終スコアを生成できます。ここでも文書をベクトルとして表します。各エントリは文書内の対応する用語の tf-idf 重みです。文書 d 内の用語 t の tf-idf 重みは、単純にその tf とその idf を乗算したものです。
これで、tf-idf の重みに基づいて各ドキュメントのベクトルが構築されました。与えられたドキュメント ベクトルを使用してクエリに答えるときが来ました。まず最初に、ドキュメント ベクトルを作成したのと同様のベース、つまり tf-idf スコアに基づいてクエリ ベクトル自体を作成します (クエリをドキュメント自体とみなします)。クエリ ベクトルの準備ができたので、クエリが存在するすべてのドキュメントを検索します。ここで、クエリ ベクトルとクエリが存在するドキュメント ベクトルのドット積を計算します。ドット積が大きいほど、クエリ ベクトルとドキュメント ベクトルが類似します。これは、ドキュメント ベクトルとクエリ ベクトルの間の角度が小さいことを意味します。クエリとドキュメントの間の類似性を見つけるこの手法は、コサイン類似度と呼ばれます。