Thinkphp 3.2 単語セグメンテーション加重検索
元のアドレス: http://www.cnblogs.com/kekukele/p/4544349.html
少し前, 空き時間を利用して、簡単な中国語の単語分割と重み付け検索を使用したマグネット検索ウェブサイト Btdog を構築しました。参考までにここで共有したいと思います。
私の Web サイトでは、中国語の単語分割システムは SCWS 単語分割システムを使用しています。この単語分割システムは、PHP を使用する 2 つの方法を提供します。1 つは、ソース コードからインストールする方法です。特定のインストール手順については、こちらを参照してください。
もう 1 つは、提供されている API インターフェイスを使用する方法です。
以下では、SCWS の使用方法を習得していることを前提としています。実際、その使用方法が分からなくても問題はありません。この記事の読み方。
SCWS システム内の分割された各単語には、次の属性/キー値が含まれます。
ここでは、単語分割アルゴリズムで使用する必要がある単語分割属性の idf に焦点を当てます。
IDF の正式名は、逆文書頻度 (逆文書頻度) であり、単語の一般的な重要性の尺度であり、特定の単語の IDF 値を で割ったものです。文書の総数をその単語を含む記事の量で割って、得られた商の対数(log)を計算します。計算式:IDF = log(D/Dt)、Dは記事の総数、Dtは単語が出現する記事の数です。 IDF の主な考え方は、用語 t を含むドキュメントの数が少ない場合、つまり Dt が小さく、IDF が大きいほど、用語 t が優れたカテゴリ識別能力を持っていることを意味します。
たとえば、「Avengers' Alliance」を検索すると、SCWS の単語分割結果は次のようになります:
単語分割結果では、キーワード「Avenger」の idf が 9.06 であり、最も識別力が高いことがわかります。一方、キーワード「」のidfは値が0であり、基本的に識別能力がないことを意味します。「同盟」のidfは4.34と、これも強い識別能力を持っています。したがって、単語セグメンテーション検索での加重並べ替えの基礎として idf 値を単純に使用できます。
scws の単語分割システムでは、idf の値は 0 ~ 10 であるため、以下に示すアルゴリズムでは、全文一致の重みを 10 に設定します。最大。他のキーワードの単語分割後の重み値をそのidf値に設定し、その重みに従って逆順に並べます。これには、中国語の単語分割の単純な重み付けソートを実装する必要があります。コア コードは次のとおりです。
<em id="__mceDel"><em id="__mceDel"> [email protected]:需要分词的内容<em id="__mceDel"> <br>//Return:mysql查询条件字符串,加权排序字符串,关键词</em> <br> <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">function</span> split_words(<span style="color: #800080;">$text</span><span style="color: #000000;">){ </span><span style="color: #800080;">$split_words</span> =<span style="color: #000000;"> scws_new(); </span><span style="color: #800080;">$split_words</span>->set_charset('utf-8'<span style="color: #000000;">); </span><span style="color: #800080;">$split_words</span>->set_ignore(<span style="color: #0000ff;">true</span><span style="color: #000000;">); </span><span style="color: #800080;">$split_words</span>->set_dict('/usr/local/scws/etc/dict.utf8.xdb'<span style="color: #000000;">); </span><span style="color: #800080;">$split_words</span>->set_rule('/usr/local/scws/etc/rules.utf8.ini'<span style="color: #000000;">); </span><span style="color: #800080;">$split_words</span>->send_text(<span style="color: #800080;">$text</span><span style="color: #000000;">); </span><span style="color: #800080;">$weight</span>=10<span style="color: #000000;">; </span><span style="color: #800080;">$condition</span>['where'] = "name LIKE '%".<span style="color: #800080;">$text</span>."%'"<span style="color: #000000;">; </span><span style="color: #800080;">$condition</span>['order'] = "(CASE WHEN name LIKE '%".<span style="color: #800080;">$text</span>."%' THEN <span style="color: #800080;">$weight</span> ELSE 0 END)"<span style="color: #000000;">; //设置全文匹配最大权重</span> <span style="color: #0000ff;">while</span> (<span style="color: #800080;">$words_result</span> = <span style="color: #800080;">$split_words</span>-><span style="color: #000000;">get_result()) { </span><span style="color: #0000ff;">foreach</span>(<span style="color: #800080;">$words_result</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$word_arr</span><span style="color: #000000;">){</span> <span style="color: #800080;">$condition</span>['where'] .= " OR name LIKE '%".<span style="color: #800080;">$word_arr</span>['word']."%'"<span style="color: #000000;">;<br> //设置分词后关键词的权重为其idf的值<br></span> <span style="color: #800080;">$condition</span>['order'] .= " + (CASE WHEN name LIKE '%".<span style="color: #800080;">$word_arr</span>['word']."%' THEN ".<span style="color: #800080;">$word_arr</span>['idf']." ELSE 0 END)"<span style="color: #000000;">; </span> <span style="color: #800080;">$condition</span>['keywords'][<span style="color: #800080;">$cnt</span>++] = <span style="color: #800080;">$word_arr</span>['word'<span style="color: #000000;">]; } } </span><span style="color: #800080;">$split_words</span>-><span style="color: #000000;">close(); </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$condition</span><span style="color: #000000;">; }</span></em></em>
もちろん、より複雑な単語の分割では、単語の単語頻度 TF も考慮する必要がありますが、それは簡単で、基本的には比較的良い結果が得られています。具体的な結果は http://btdog.com.cn で体験できます。