ホームページ  >  記事  >  バックエンド開発  >  検索エンジンの Python 実装 (Pylucene) サンプル チュートリアル

検索エンジンの Python 実装 (Pylucene) サンプル チュートリアル

零下一度
零下一度オリジナル
2017-07-18 10:12:5213717ブラウズ
  1. ドキュメント、ドキュメントクラス。 Pylucene におけるインデックス作成の基本単位は「ドキュメント」です。ドキュメントとは、Web ページ、記事、または電子メールのことです。ドキュメントはインデックスの構築に使用される単位であり、検索時の結果の単位でもあります。これを適切に設計すると、パーソナライズされた検索サービスを提供できます。

  2. ファイルされた、ドメインクラス。ドキュメントには複数のフィールド (フィールド) を含めることができます。記事が記事タイトル、記事本文、著者、発行日などの複数のファイルで構成されるのと同じように、Filed はドキュメントのコンポーネントです。

  3. ページをドキュメントとして扱います。ドキュメントには、ページの URL アドレス (url)、ページのタイトル (title)、ページの本文コンテンツ (content) の 3 つのフィールドが含まれます。インデックスの保存方法として、SimpleFSDirectory クラスを使用してインデックスをファイルに保存することを選択します。アナライザーは Pylucene が付属する CJKAnalyzer を選択します。このアナライザーは中国語を適切にサポートしており、中国語コンテンツのテキスト処理に適しています。

  4. 検索エンジンとは何ですか?

検索エンジンは、「ネットワーク情報リソースを収集および整理し、情報収集、情報分類、およびユーザークエリの3つの部分を含む情報クエリサービスを提供するシステム」です。図 1 は、検索エンジンの一般的な構造です。情報収集モジュールは、インターネットからネットワーク情報データベースに情報を収集し (通常はクローラを使用します)、その後、情報分類モジュールが単語の分割、ストップワードの削除、重み付けなどの操作を実行します。収集された情報。インデックス テーブル (通常は逆インデックス) を確立してインデックス ライブラリを形成します。最後に、ユーザー クエリ モジュールがユーザーの検索ニーズを特定し、検索サービスを提供します。

図 1 検索エンジンの一般的な構造

2. Python を使用して単純な検索エンジンを実装する

2.1 問題分析

図 1 から、完全な検索エンジン アーキテクチャは、インターネット。Python を使用してクローラーを作成します。これが Python の強みです。

次に、情報処理モジュールです。分詞?言葉を止めますか?逆さテーブル?何?この混乱は何ですか?心配しないでください。私たちは前任者によって作成されたホイールを備えています。Pylucene (lucene の Python パッケージ バージョンです。Lucene は、開発者がソフトウェアやシステムに検索機能を追加するのに役立ちます。Lucene は、完全な機能を備えたオープン ソース ライブラリのセットです)。テキストの取得と検索)。 Pylucene を使用すると、インデックスの作成や検索など、収集した情報の処理に簡単に役立ちます。

最後に、Web ページで検索エンジンを使用するために、軽量 Web アプリケーション フレームワークである flask を使用して、検索ステートメントとフィードバック検索結果を取得するための小さな Web ページを作成します。

2.2 クローラーの設計

主に次のコンテンツを収集します: ターゲット Web ページのタイトル、ターゲット Web ページの本文コンテンツ、ターゲット Web ページが指す他のページの URL アドレス。 Web クローラーのワークフローを図 2 に示します。クローラーの主なデータ構造はキューです。まず、最初のシード ノードがキューに入り、キューからノードを取り出してアクセスし、ノード ページ上のターゲット情報を取得します。次に、他のページを指すノード ページの URL リンクをキューに入れ、キューから新しいノードが削除され、キューが空になるまでノードがアクセスされます。キューの「先入れ先出し」機能により、幅優先トラバーサル アルゴリズムが実装され、サイトの各ページに 1 つずつアクセスします。

ディレクトリ、アナライザー、IndexWriter、ドキュメント、およびファイル。

Directory は、ファイル操作のための Pylucene のクラスです。 SimpleFSDirectory、RAMDirectory、CompoundFileDirectory、FileSwitchDirectory など 11 個のサブクラスがあり、リストされているのはインデックス ディレクトリの保存に関連するサブクラスです。RAMDirectory はインデックスを RAM メモリに保存します。複合インデックス保存メソッドと FileSwitchDirectory により、インデックス保存メソッドを一時的に切り替えて、さまざまなインデックス保存メソッドを利用できます。

アナライザー、アナライザー。クローラーが取得したテキストをインデックス処理するクラスです。テキストの単語の分割、ストップワードの削除、大文字と小文字の変換などの操作が含まれます。 Pylucene にはいくつかのアナライザーが付属しており、インデックスを構築するときにサードパーティのアナライザーや自作のアナライザーを使用することもできます。アナライザーの品質は、インデックス構築の品質と、検索サービスが提供できる精度と速度に関係します。

IndexWriter、インデックス作成クラス。 Directory によって開かれた記憶域では、IndexWriter はインデックスの書き込み、変更、追加、削除などの操作を実行できますが、インデックスの読み取りや検索はできません。

ドキュメント、ドキュメントクラス。 Pylucene におけるインデックス作成の基本単位は「ドキュメント」です。ドキュメントとは、Web ページ、記事、または電子メールのことです。ドキュメントはインデックスの構築に使用される単位であり、検索時の結果の単位でもあります。これを適切に設計すると、パーソナライズされた検索サービスを提供できます。

ファイルされた、ドメインクラス。ドキュメントには複数のフィールド (フィールド) を含めることができます。記事が記事タイトル、記事本文、著者、発行日などの複数のファイルで構成されるのと同じように、Filed はドキュメントのコンポーネントです。

ページをドキュメントとして扱います。ドキュメントには、ページの URL アドレス (url)、ページのタイトル (title)、ページのメイン テキスト コンテンツ (content) の 3 つのフィールドが含まれます。インデックスの保存方法として、SimpleFSDirectory クラスを使用してインデックスをファイルに保存することを選択します。アナライザーは Pylucene が付属する CJKAnalyzer を選択します。このアナライザーは中国語を適切にサポートしており、中国語コンテンツのテキスト処理に適しています。

Pylucene を使用してインデックスを構築する具体的な手順は次のとおりです:

lucene.initVM()
INDEXIDR = self.__index_dir
indexdir = SimpleFSDirectory(File(INDEXIDR))①
analyzer = CJKAnalyzer(Version.LUCENE_30)②
index_writer = IndexWriter(indexdir, analyzer, True, IndexWriter.MaxFieldLength(512))③
document = Document()④
document.add(Field("content", str(page_info["content"]), Field.Store.NOT, Field.Index.ANALYZED))⑤
document.add(Field("url", visiting, Field.Store.YES, Field.Index.NOT_ANALYZED))⑥
document.add(Field("title", str(page_info["title"]), Field.Store.YES, Field.Index.ANALYZED))⑦
index_writer.addDocument(document)⑧
index_writer.optimize()⑨
index_writer.close()⑩

インデックスを構築するには 10 の主な手順があります:

①SimpleFSDirectory オブジェクトをインスタンス化し、インデックスをローカル ファイルに保存し、パス カスタマイズされたパス「INDEXIDR」の場合。

②CJKAnalyzerアナライザーをインスタンス化します。インスタンス化時のパラメーターVersion.LUCENE_30は、Pyluceneのバージョン番号です。

③ IndexWriter オブジェクトをインスタンス化します。 渡される 4 つのパラメーターは、以前にインスタンス化された SimpleFSDirectory オブジェクトと CJKAnalyzer アナライザーで、新しいインデックスの作成を示します (フィールド数)。 。

④Document オブジェクトをインスタンス化し、それに document という名前を付けます。

⑤「content」という名前のドメインをドキュメントに追加します。このフィールドの内容は、クローラーによって取得された Web ページのメイン テキスト コンテンツです。この操作のパラメータは、インスタンス化されてすぐに使用される Field オブジェクトです。Field オブジェクトの 4 つのパラメータは次のとおりです:

(1) "コンテンツ"、ドメインの名前。

(2) page_info["content"]、クローラーによって収集された Web ページのメイン テキスト コンテンツ。

(3) Field.Store は、このフィールドの値を元の文字に戻すことができるかどうかを示すために使用される変数です。 Field.Store.YES は、このフィールドに格納されている内容を元のテキストの内容に戻すことができることを意味します。 Field.Store.NOT は回復不可能を意味します。

(4) Field.Index 変数は、フィールドの内容をアナライザーで処理するかどうかを示します。Field.ANALYZED は、このフィールドの文字を処理するためにアナライザーが使用されることを示します。このフィールドの文字の処理には使用されません。

⑥ページアドレスを保存するために「url」という名前のドメインを追加します。

⑦ページのタイトルを保存するために「title」という名前のフィールドを追加します。

⑧IndexWriterオブジェクトをインスタンス化して、ドキュメントドキュメントをインデックスファイルに書き込みます。

⑨ インデックス ライブラリ ファイルを最適化し、インデックス ライブラリ内の小さなファイルを大きなファイルにマージします。

⑩インデックス構築操作が 1 サイクルで完了したら、IndexWriter オブジェクトを閉じます。

Pylucene のインデックス検索用の主なクラスには、IndexSearcher、Query、QueryParser などがあります[16]。

IndexSearcher、インデックス検索クラス。 IndexWriter によって構築されたインデックス ライブラリで検索操作を実行するために使用されます。

Query、クエリリクエストを記述するクラス。クエリ要求を IndexSearcher に送信して、検索操作を完了します。クエリには、さまざまなクエリ要求を完了するための多くのサブクラスがあります。たとえば、TermQuery は、最も基本的で単純なクエリ タイプであり、指定されたドメイン内の特定の項目とドキュメントを一致させるために使用されます。RangeQuery は、指定された範囲内で検索され、特定の範囲内のドキュメントを一致させるために使用されます。指定されたドメイン; ファジー クエリである FuzzyQuery は、クエリ キーワードに意味的に類似する同義語の一致を簡単に識別できます。

QueryParser、クエリパーサー。さまざまなクエリ要件を実装する必要がある場合は、Query が提供するさまざまなサブクラスを使用する必要があるため、Query の使用時に混乱が生じやすくなります。したがって、Pylucene はクエリ パーサー QueryParser も提供します。 QueryParser は、送信された Query ステートメントを解析し、Query 構文に従って適切な Query サブクラスを選択して、対応するクエリを完成させることができます。開発者は、下部でどの Query 実装クラスが使用されているかを気にする必要はありません。たとえば、クエリ ステートメント「キーワード 1 とキーワード 2」は、QueryParser によって解析され、キーワード 1 とキーワード 2 の両方に一致するドキュメントがクエリされます。クエリ ステートメント「id[123 to 456]」は、QueryParser によって解析され、名前が「id」であるドメインがクエリされます。値が指定された範囲「123」から「456」内にあるドキュメント。クエリ ステートメント「キーワード site:www.web.com」。QueryParser は、「site」という名前のドメイン内の「www.web」の値も満たすクエリを解析します。 「.com」と「キーワード」の 2 つのクエリ条件に一致するドキュメント。

インデックス検索は、Pylucene が重点を置いている領域の 1 つです。インデックス検索を実装するためにクエリと呼ばれるクラスが作成されます。クエリには、インデックス検索を実装するための主な手順が 7 つあります。 :

① まず、検索ステートメントがタイトルまたは記事内容に対する単一のドメイン クエリではない場合、つまりキーワード「タイトル:」または「コンテンツ:」が含まれていない場合、2 つのドメインを判定します。デフォルトでは、タイトルとコンテンツが検索されます。

②SimpleFSDirectory オブジェクトをインスタンス化し、その作業パスを以前にインデックスが作成されたパスとして指定します。

③实例化一个CJKAnalyzer分析器,搜索时使用的分析器应与索引构建时使用的分析器在类型版本上均一致。

④实例化一个IndexSearcher对象lucene_searcher,它的参数为第○2步的SimpleFSDirectory对象。

⑤实例化一个QueryParser对象my_query,它描述查询请求,解析Query查询语句。参数Version.LUCENE_CURRENT为pylucene的版本号,“title”指默认的搜索域,lucene_analyzer指定了使用的分析器,query_str是Query查询语句。在实例化QueryParser前会对用户搜索请求作简单处理,若用户指定了搜索某个域就搜索该域,若用户未指定则同时搜索“title”和“content”两个域。

⑥lucene_searcher进行搜索操作,返回结果集total_hits。total_hits中包含结果总数totalHits,搜索结果的文档集scoreDocs,scoreDocs中包括搜索出的文档以及每篇文档与搜索语句相关度的得分。

⑦lucene_searcher搜索出的结果集不能直接被Python处理,因而在搜索操作返回结果之前应将结果由Pylucene转为普通的Python数据结构。使用For循环依次处理每个结果,将结果文档按相关度得分高低依次将它们的地址域“url”的值放入Python列表result_urls,将标题域“title”的值放入列表result_titles。最后将包含地址、标题的列表和结果总数组合成一个Python“字典”,将最后处理的结果作为整个搜索操作的返回值。

 

用户在浏览器搜索框输入搜索词并点击搜索,浏览器发起一个GET请求,Flask的路由route设置了由result函数响应该请求。result函数先实例化一个搜索类query的对象infoso,将搜索词传递给该对象,infoso完成搜索将结果返回给函数result。函数result将搜索出来的页面和结果总数等传递给模板result.html,模板result.html用于呈现结果

如下是Python使用flask模块处理搜索请求的代码:

 

app = Flask(__name__)#创建Flask实例

@app.route('/')#设置搜索默认主页

def index():
html="<h1>title这是标题</h1>"
return render_template(&#39;index.html&#39;)
@app.route("/result",methods=[&#39;GET&#39;, &#39;POST&#39;])#注册路由,并指定HTTP方法为GET、POST
def result(): #resul函数
if request.method=="GET":#响应GET请求
key_word=request.args.get(&#39;word&#39;)#获取搜索语句
   if len(key_word)!=0:
      infoso = query("./glxy") #创建查询类query的实例
       re = infoso.search(key_word)#进行搜索,返回结果集
       so_result=[]
       n=0
       for item in re["url"]:
temp_result={"url":item,"title":re["title"][n]}#将结果集传递给模板
        so_result.append(temp_result)
                n=n+1
        return render_template(&#39;result.html&#39;, key_word=key_word, result_sum=re["Hits"],result=so_result)
    else:
        key_word=""
    return render_template(&#39;result.html&#39;)
if __name__ == &#39;__main__&#39;:
    app.debug = True
    app.run()#运行web服务


以上が検索エンジンの Python 実装 (Pylucene) サンプル チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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