ホームページ >バックエンド開発 >Python チュートリアル >Python軽量検索ツールWhooshの利用(概要共有)

Python軽量検索ツールWhooshの利用(概要共有)

WBOY
WBOY転載
2022-07-26 14:03:413062ブラウズ

この記事では、Python に関する関連知識を提供します。Python の軽量検索ツールである Whoosh について簡単に紹介し、対応する使用例コードを次のように示します。見てみましょう。みんなの役に立つように。

Python軽量検索ツールWhooshの利用(概要共有)

[関連する推奨事項: Python3 ビデオ チュートリアル ]

この記事では、Python の軽量検索ツールである Whoosh について簡単に紹介します。対応する使用例のコードを示します。

Whoosh の概要

Whoosh は Matt Chaput によって作成されました。これは Houdini 3D アニメーション ソフトウェア パッケージのオンライン ドキュメントのシンプルかつ高速な検索サービス ツールとして始まり、その後ゆっくりと成熟しました。検索ソリューション ツールがオープンソース化されました。

Whoosh は純粋に Python で書かれています。柔軟で便利な軽量の検索エンジン ツールです。Python2 と 3 の両方をサポートするようになりました。その利点は次のとおりです:

  • Whoosh は次のとおりです。純粋に Python で書かれていますが、非常に高速です。Python 環境のみが必要で、コンパイラは必要ありません。
  • デフォルトでは、Okapi BM25F ソート アルゴリズムが使用され、他のソート アルゴリズムもサポートされています。
  • 他の検索エンジンと比較して、Whoosh はより小さなインデックス ファイルを作成します;
  • Whoosh のインデックス ファイルのエンコードは Unicode である必要があります;
  • Whoosh は任意の Python オブジェクトを保存できます。

Whoosh の公式紹介 Web サイトは、https://whoosh.readthedocs.io/en/latest/intro.html です。 ElasticSearch や Solr などの成熟した検索エンジン ツールと比較して、Whoosh は軽量で操作が簡単なので、小規模な検索プロジェクトでの使用を検討できます。

インデックスとクエリ

ES に詳しい人にとって、検索の 2 つの重要な側面はマッピングとクエリ、つまりインデックス構築とクエリです。舞台裏には複雑なインデックス ストレージがあり、クエリ解析および並べ替えアルゴリズムなど。 ES の経験がある場合、Whoosh は非常に簡単に始めることができます。

著者の理解と Whoosh の公式ドキュメントによると、Whoosh の主な入門レベルの用途はインデックスとクエリです。検索エンジンの強力な機能の 1 つは、全文検索を提供できることです。これは、BM25 などの並べ替えアルゴリズムに依存し、フィールドの保存方法にも依存します。したがって、index が名詞として使用される場合はフィールドのインデックスを指し、index が動詞として使用される場合はフィールドのインデックスを確立することを指します。クエリは並べ替えアルゴリズムを使用して、クエリが必要なステートメントに基づいて適切な検索結果を提供します。

Whoosh の使用方法については、公式ドキュメントに詳細な説明が記載されていますが、ここでは、Whoosh がどのように簡単に検索エクスペリエンスを向上させることができるかを説明するために、著者は簡単な例のみを示しています。

#サンプル コード

データ

このプロジェクトのサンプル データは詩.csv です。次の図はデータ セットの最初の 10 行です:

フィールド

データセットの特性に従って、タイトル、王朝、詩人、内容の 4 つのフィールド (フィールド) を作成します。

# -*- coding: utf-8 -*-
import os
from whoosh.index import create_in
from whoosh.fields import *
from jieba.analyse import ChineseAnalyzer
import json

# 创建schema, stored为True表示能够被检索
schema = Schema(title=TEXT(stored=True, analyzer=ChineseAnalyzer()),
                dynasty=ID(stored=True),
                poet=ID(stored=True),
                content=TEXT(stored=True, analyzer=ChineseAnalyzer())
                )

このうちIDは単位値のみで複数の単語に分割することはできず、ファイルパス、URL、日付、カテゴリなどによく使われます。

#TEXT ファイルのテキスト コンテンツ、テキストのインデックス付けと保存、および単語検索のサポート。アナライザーは吃音中国語単語セグメンターを選択します。

インデックス ファイルの作成

次に、インデックス ファイルを作成する必要があります。このプログラムを使用して、最初にpoem.csvファイルを解析し、それをインデックスに変換し、indexdirディレクトリに書き込みます。 Python コードは次のとおりです。

# 解析poem.csv文件
with open('poem.csv', 'r', encoding='utf-8') as f:
    texts = [_.strip().split(',') for _ in f.readlines() if len(_.strip().split(',')) == 4]

# 存储schema信息至indexdir目录
indexdir = 'indexdir/'
if not os.path.exists(indexdir):
    os.mkdir(indexdir)
ix = create_in(indexdir, schema)

# 按照schema定义信息,增加需要建立索引的文档
writer = ix.writer()
for i in range(1, len(texts)):
    title, dynasty, poet, content = texts[i]
    writer.add_document(title=title, dynasty=dynasty, poet=poet, content=content)
writer.commit()

インデックスが正常に作成されると、indexdir ディレクトリが生成されます。このディレクトリには、上記の poem.csv データの各フィールドのインデックス ファイルが含まれます。

Query

インデックスが正常に作成されたら、それを使用してクエリを実行します。

たとえば、コンテンツに

明月

を含む詩をクエリする場合は、次のコードを入力できます: <pre class="brush:py;"># 创建一个检索器 searcher = ix.searcher() # 检索content中出现&amp;#39;明月&amp;#39;的文档 results = searcher.find(&quot;content&quot;, &quot;明月&quot;) print(&amp;#39;一共发现%d份文档。&amp;#39; % len(results)) for i in range(min(10, len(results))): print(json.dumps(results[i].fields(), ensure_ascii=False))</pre>出力結果は次のとおりです。 ##

合計 44 個のドキュメントが見つかりました。
最初の 10 件の文書は次のとおりです:
{"content": "ベッドの前に明るい月明かりがあり、地面に霜がついたのではないかと思われます。明るい月を見上げて頭を下げます。故郷を想う。", "dynasty": "唐代", "詩人": "李白", "title": "きよしこの夜の思い"}
{"content": "端の草、端の草、端の草はすべてここにあります 山の南と北の雪は澄んでいて、月は何千マイルも離れて明るいです 明るい月、明るい月、胡家は叫びました"、"王朝": "唐代"、"詩人": "戴樹倫"、"タイトル": "ティアオ・シャオリン・ビアンツァオ"}
{"content": "静かな竹の中に一人で座る、私はピアノを弾き、大声で口笛を吹きます。深い森の人々は、明るい月が輝くことを知りません。」、「王朝」:「唐代」、「詩人」:「王偉」、「タイトル」: "竹里閣"}
{" content": "漢江の明るい月が帰郷する人々を照らし、秋の風が千里を越えて広がります。ゲストの服を軽く洗わないでください。まだ埃が残っています。帝都より。"、"dynasty": "明朝"、"poet": "Bian Gong"、"title": "呉国賓への重い贈り物"}
{"content": "明るい月秦王朝の峠と漢王朝の峠、そして数千マイルを行進した人々は戻ってきませんでした。しかし、龍城の飛行将軍はここにいます、そして彼らは胡馬に殷山を越えるように教えません。」 dynasty": "唐代"、"詩人": "王長陵"、"title": "城外の詩二首・一首"}
{"content": "京口と瓜州の間には、詩が一つしかない水、中山山 数え切れないほどの山々。春風が川の南岸まで緑に変わります。明るい月はいつ再び私を照らしますか?」、「王朝」:「宋」、「詩人」:「王安石」、 "title": "Boancing Guazhou"}
{" content": "周りを見回すと、山の光と水の光が見えます。手すりに寄りかかって、野の花の香りを嗅ぐことができます。澄んだ風と明るい月を気にする人は誰もおらず、南館にいるといつも涼しいです。"、"王朝": "宋"、"詩人": "黄庭堅"、"タイトル": "鄂州南楼書道"}
{"content": "緑の山はかすかに見え、水は遠く、長江の南の草は秋になっても枯れていません。二十四橋、美人はどこで笛を教えてくれますか?"、"王朝": "唐代"、"詩人": "杜牧"、"タイトル": "揚州の漢仲判事へ"}
{"content": "露の空気は冷たく、光が集まり、竹丘の下で太陽が輝いています。猿が洞窟で泣いています。木々、木蘭船に乗る人々。明るい月が広江を照らしています、そして蒼山山脈の激流。雲の中にあなたは見えませんが、夜になると悲しい気がします。"、"王朝": "唐代"、"詩人": "马代"、"タイトル ": "チュー川に関する 3 つの懐かしい詩のうちの 1 つ"}
{"content": "明るい月が海に昇り、私たちは世界の終わりのこの瞬間を共有します。恋人たちは遠い夜について不平を言いますが、彼らは恋しいです夜はお互いに。ろうそくの火が消えて、その光は哀れみに満ちていて、服は露で覆われている。栄養がある。人にあげるのは忍びないが、それでもよく眠れる。」、「王朝」 ": "唐代"、"詩人": "張九陵"、"title": "月を見て淮源 / 月を見て昔を懐かしむ"}

#[関連推奨事項:

Python3 ビデオ チュートリアル ]

以上がPython軽量検索ツールWhooshの利用(概要共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。