日本語形態素解析器Senを導入する その4 再現率が高いNグラム

今回と次回の記事で形態素解析とNグラムの違いをみていきたいと思います。
結論から言うとNグラムの方が再現率が高く、検索語が含まれる文章を確実に拾い上げることができます。
逆に形態素解析の方は、解析ミスによって取りこぼすことがあります。

形態素解析フィールドを検索

前回の記事の繰り返しになりますが
形態素解析トークナイズしたブログのタイトルフィールドを検索語「ブログ」で検索してみます。

1件ヒットすると思います。

<result name="response" numFound="1" start="0">
<doc>
<str name="URL">http://abiru.hoge.com/</str>
<str name="bloger">あびる優</str>
<date name="timestamp">2008-09-23T09:19:07.043Z</date>
<str name="title">あびる優のブログ</str>
<str name="title_morph">あびる優のブログ</str>
</doc>
</result>

タイトルに「ブログ」が含まれるドキュメントは実は6件あるのですが
ここでは1件しかヒットしません。

Nグラムフィールドを検索

次にNグラムでトークナイズしたブログのタイトルフィールドを検索語「ブログ」で検索してみます。

全く同じ文章をインデキシング・検索しているのに今度は6件ヒットすると思います。

<result name="response" numFound="6" start="0">
<doc>
<str name="URL">http://abiru.hoge.com/</str>
<str name="bloger">あびる優</str>
<date name="timestamp">2008-09-23T09:19:07.043Z</date>
<str name="title">あびる優のブログ</str>
<str name="title_morph">あびる優のブログ</str>
</doc>
<doc>
<str name="URL">http://ameblo.jp/hoshino--aki/</str>
<str name="bloger">ほしのあき</str>
<date name="timestamp">2008-09-23T09:19:07.018Z</date>
<str name="title">ほしのあき オフィシャルブログ by アメーバブログ</str>
<str name="title_morph">ほしのあき オフィシャルブログ by アメーバブログ</str>
</doc>
<doc>
<str name="URL">http://ameblo.jp/kamijiyusuke/</str>
<str name="bloger">上地雄輔</str>
<date name="timestamp">2008-09-23T09:19:07.004Z</date>
<str name="title">オフィシャルブログ「神児遊助」</str>
<str name="title_morph">オフィシャルブログ「神児遊助」</str>
</doc>
<doc>
<str name="URL">http://ameblo.jp/momokaeri/</str>
<str name="bloger">桃華絵里</str>
<date name="timestamp">2008-09-23T09:19:07.012Z</date>
<str name="title">桃華絵里オフィシャルブログ</str>
<str name="title_morph">桃華絵里オフィシャルブログ</str>
</doc>
<doc>
<str name="URL">http://blog.excite.co.jp/shokotan/</str>
<str name="bloger">中川翔子</str>
<date name="timestamp">2008-09-23T09:19:07.024Z</date>
<str name="title">中川翔子オフィシャルブログ しょこたん☆ぶろぐ</str>
<str name="title_morph">中川翔子オフィシャルブログ しょこたん☆ぶろぐ</str>
</doc>
<doc>
<str name="URL">http://yamamoto-mona.cocolog-nifty.com/</str>
<str name="bloger">山本モナ</str>
<date name="timestamp">2008-09-23T09:19:07.026Z</date>
<str name="title">山本モナオフィシャルブログ 山本モナのもなろ〜ぐ</str>
<str name="title_morph">山本モナオフィシャルブログ 山本モナのもなろ〜ぐ</str>
</doc>
</result>

実は形態素解析の方は「オフィシャルブログ」が1語としてトークナイズされるので「ブログ」ではヒットしません。

山本モナオフィシャルブログ」にいたっては「山本」 + 「モナオフィシャルブログ」に分解されるので「オフィシャルブログ」でもヒットしません。


これは辞書に「ブログ」が載っていないために起きる問題です。このように形態素解析は辞書に依存する部分が多いので辞書に載っていない単語に対する分解のミスがあります。
一方、Nグラムの場合には単純に特定の文字数だけで切っていくだけなので、検索語の文字列が含まれてさえいれば必ずヒットします。

特定の文字列が入っている文章を確実にヒットさせたい場合にはNグラムを適用することになります。
また、SolrにバンドルされているCJKAnalyzerは N = 2 の2グラム(bi-gram)方式なので2文字ずつに区切られます。なので、検索語が1文字の場合にはヒットしません ( 検索対象の文章が1文字だけの場合を除いて )。
検索語が1文字でも確実にヒットさせたい場合にはN = 1 の 1 グラム ( uni-gram ) を使うといいでしょう。


形態素解析に比べてNグラムの方が再現率( 網羅性 ) が高いのがわかると思います。

ではでは


[Solr][Sen] 日本語形態素解析器Senを導入する その1 Senのインストール
[Solr][Sen] 日本語形態素解析器Senを導入する その2 lucene-jaのインストール
[Solr][Sen] 日本語形態素解析器Senを導入する その3 インデキシングする
[Solr][Sen] 日本語形態素解析器Senを導入する その4 再現率が高いNグラム
[Solr][Sen] 日本語形態素解析器Senを導入する その5 精度なら形態素解析
[Solr][Sen] 日本語形態素解析器Senを導入する その6 Nグラムと形態素解析には一長一短あり。目的に応じて使い分けよう