ホームページ  >  記事  >  バックエンド開発  >  Pythonとxapianを使った高速検索エンジンの構築

Pythonとxapianを使った高速検索エンジンの構築

高洛峰
高洛峰オリジナル
2016-10-18 10:03:171185ブラウズ

最初にいくつかの概念を理解します: ドキュメント、用語、投稿 情報検索 (IR) では、取得しようとしているアイテムは「ドキュメント」と呼ばれ、各ドキュメントは一連の用語で説明されます。 「文書」と「用語」という 2 つの単語は、「図書館管理」に由来する IR 用語です。通常、文書は、ほとんどの場合機械可読形式のテキストとして考えられ、用語は文書内で文書を説明するために使用される単語または語句です。たとえば、ほとんどの文書には複数の用語が含まれます。文書が口腔衛生に関連する場合、「歯」、「歯」、「歯ブラシ」、「虫歯」、「虫歯」、「歯垢」、「食事」などの用語が存在する可能性があります。

IR システムに D という名前のドキュメントがあり、このドキュメントが t という名前の用語で記述されている場合、t はインデックス D であるとみなされ、次の式で表すことができます: t->D。実際のアプリケーションでは、IR システムは通常、D1、D2、D3... などの複数のドキュメントの集合と、t1、t2、t3... などの複数の用語の集合であるため、次のようになります。関係: ti -> DJ。

特定の用語が特定のドキュメントにインデックスを付ける場合、それはポスティングと呼ばれます。端的に言えば、ポスティングは位置情報を伴う用語であり、関連性の検索において特定の用途がある可能性があります。

D という名前のドキュメントがあるとすると、それにインデックスを付ける用語リストがあり、これを D の用語リストと呼びます。

t という名前の用語を指定すると、t の投稿リストと呼ばれるドキュメントのリストにインデックスが付けられます (「ドキュメント リスト」を使用すると、命名においてより一貫性があるかもしれませんが、あまりにも曖昧に聞こえます)。

コンピューター上に存在する IR システムでは、用語はインデックス ファイルに保存されます。用語を使用すると、投稿リスト内で各ドキュメントにドキュメント ID という短い識別子が付いています。簡単に言うと、投稿リストはドキュメント ID のコレクションであるのに対し、用語リストは文字列のコレクションであると考えることができます。一部の IR システムでは、内部で用語を表すために数値が使用されるため、Xapian の場合はそうではなく、用語リストはストレージを圧縮するために使用されます。

用語は必ずしも文書内に出現する単語である必要はありません。通常、用語は小文字に変換され、ステミング アルゴリズムによって処理されることが多いため、値が " の用語を通じて一連の単語が取得される場合があります。 「connect」、「connect」、「connects」、「connection」、「connected」など。1 つの単語で複数の用語が生成される場合もあります。たとえば、抽出された語幹と抽出されていない単語の両方にインデックスを付けます。もちろん、これは英語、フランス語、ラテン語などのヨーロッパ言語とアメリカ言語にのみ当てはまりますが、中国語の分詞は一般に、中国語の分詞とは次のような違いがあります。英語を例に挙げると、通常、英語では各単語がスペースで区切られますが、中国語ではそうではなく、記事全体にスペースや句読点が存在しない場合もあります。 2. 前述のとおり、「接続」、「接続」、「接続」、「接続」とは、それぞれ「動詞性の接続」、「動詞性の三人称の接続」、「名字性の接続」、「 「つながりの過去形」ですが、中国語では「つながり」ですべてを表現でき、ステミングの必要はほとんどありません。これは、英語のさまざまな品詞のほとんどがルールに基づいているのに対し、中国語の品詞は自由で制約がないことを意味します。 3. 2 番目の点は、中国語の単語分割の難しさの縮図です。たとえば、「中華人民共和国が設立されました」という文では、文の意味を完全かつ正確に識別するのは非常に困難です。 「中国」と「中国人」、「人民」、「共和国」、「創設」などの単語が区別できますが、このうち「中国人」は実はこの文とはあまり関係がありません。一見単純そうに見えますが、どうして機械はその秘密を簡単に理解できるのでしょうか?

Values

Values はドキュメントに添付される一種のメタデータであり、各ドキュメントは複数の値を持つことができ、これらの値は異なる番号で識別されます。値は、照合プロセス中にすぐにアクセスできるように設計されており、並べ替え、重複したドキュメントのキューイング、範囲の取得などの目的に使用できます。値の長さに制限はありませんが、結果として表示するフィールドを保存するだけの場合は、値をドキュメントのデータに保存することをお勧めします。

ドキュメントデータ

各ドキュメントには 1 つのデータしかありません。もちろん、保存する際には、どのような形式のデータでもかまいません。少し奇妙に聞こえるかもしれませんが、実際は次のとおりです。保存するデータがテキスト形式の場合は直接保存できますが、保存するデータがさまざまなオブジェクトの場合は、まずバイナリ ストリームにシリアル化してから保存してください。保存してから、デシリアライズして読み取るときに読み取ります。

posting

postingは位置を伴う用語です

# -*- coding: gb18030 -*-
import xapian
testdatas = [u'abc test python1',u'abcd testing python2']
def buildtest():
    database = xapian.WritableDatabase('indexes/', xapian.DB_CREATE_OR_OPEN)
    stemmer = xapian.Stem("english")
    for data in testdatas:
        doc = xapian.Document()
        doc.set_data(data)
        for term in data.split():
            doc.add_term(term)
        database.add_document(doc)
if __name__ == '__main__':
    buildtest()

実行後、カレントディレクトリにインデックスライブラリが生成されます。


[sh]

[ec2-user@ip-10-167-6-221 インデックス]$ ll

合計使用量 52

-rw-rw-r-- 1 ec2-user ec2-user 0 0 July 28 16:06 flintlock

-rw-rw-r-- 1 ec2-user ec2-user 28 July 28 16:06 iamchert

-rw-rw-r-- 1 ec2-user ec2-user 13 7月 28 16:06 postlist.baseA

-rw-rw-r-- 1 ec2-user ec2-user 14 7月 28 16:06 postlist.baseB

-rw-rw-r-- 1 ec2-user ec2-user 8192 7 月 28 日 16:06 postlist.DB

-rw-rw-r-- 1 ec2-user ec2-user 13 7 月 28 日 16:06 レコード.baseA

-rw-rw-r-- 1 ec2-user ec2-user 14 7 月 28 日 16:06 Record.baseB

-rw-rw-r-- 1 ec2-user ec2- user 8192 7 月 28 日 16: 06 Record.DB

-rw-rw-r-- 1 ec2-user ec2-user 13 7月28日 16:06 termlist.baseA

-rw-rw-r-- 1 ec2 -user ec2-user 14 7月28日16:06 termlist.baseB

-rw-rw-r-- 1 ec2-user ec2-user 8192 July 28 16:06 termlist.DB

次の記事でクエリインデックスに移動する方法を紹介します。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。