主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GoogleAppEngineのデータストアで全文検索に使うインデックス作り

                
tags:
前々回

前回

 データストアに本の情報を登録しておく。タイトルの一部をキーワードとしてクエリ発行して、該当する本の情報を持つエンティティ(レコード)を抜き出したい。そんなときは形態素解析を使うとインデックスの要素数が膨大にならずに済むというのが前回まで。

 でも形態素解析で分かち書きにしたものをそのままではインデックスとしての実用性がない。たとえば専門書『皇帝の新しい心―コンピュータ・心・物理法則』を形態素解析にかけてみる(Yahoo APIを使用)。

************
皇帝

新しい


コンピュータ



物理
法則
************
このインデックスに”皇帝の新しい心”をキーワードにしたクエリを発行しても、検索に引っかからない。連続した要素をいくつか連結する必要がある。”皇帝”+”の”+”新しい”+”心”、といった具合に。いくつ連結するかが、検索によるピックアップ率とインデックス要素数の増大抑制でのトレードオフだ。

 Yahoo APIではさいわいなことに、要素の品詞も返してくれるので、インデックス要素数の増大を抑える手を打てる。おおよそキーワードというのは名詞や形容詞から始まるもので、接続詞などはめったにキーワードの頭にならない。”皇帝の”や”新しい心”はキーワードとして使われるが、”の新しい”をキーワードにする人は滅多にいないということだ。だから接続詞などを連結キーワードの頭にするのは妥当ではない。

 上記のことを考えつつ、キーワードを検索に使えるインデックス化する関数を作った。形態素解析にはYahoo APIを使ったので、その結果で返ってくるXMLを解析してインデックスリストを作成できるようになっている。この関数から返ってくるリストをデータストアのエンティティにListPropertyで保存する。
 形態素解析のYahoo APIの使い方はほかのブログにあるのでそちらを参考に。Yahooの形態素解析APIからはXMLが返ってくるので、それをそのまま下記の関数に渡せばOK。

def list2index(xml):
reg_pos = re.compile("<pos>(.*?)</pos>")
li_pos = reg_pos.findall(xml.decode('utf-8'))
reg_sur = re.compile("<surface>(.*?)</surface>")
li_sur = reg_sur.findall(xml.decode('utf-8'))
INDEX1 = [u"動詞", u"名詞", u"副詞", u"形容詞", u"連体詞"]
li_join2 = []
for x in range(len(li_sur)):
li_split = li_sur[x:]
if li_pos[x] in INDEX1:
li_join1 = ["".join(li_split[0:y]) for y in range(1, 5)]
else:
li_join1 = [li_split[0]]
li_join2 += li_join1

li_join2 = list(set(li_join2))
li_join2.sort()
return li_join2


li = list2index(xml)
for x in li:
print x


>>>


コンピュータ
コンピュータ・
コンピュータ・心
コンピュータ・心・


心―
心―コンピュータ
心―コンピュータ・
心・
心・物理
心・物理法則
新しい
新しい心
新しい心―
新しい心―コンピュータ
法則
物理
物理法則
皇帝
皇帝の
皇帝の新しい
皇帝の新しい心

            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。