執筆者 Gustavo Bezerra
本節では情報検索の基礎やキーワード抽出について説明します。
目次:
情報検索(information retrieval)とは、ユーザーの検索質問(query)に適合する文書(document)を文書集合(document collection)の中から見つけ出すことです。
情報検索を行う効率的に行うために、各文書の内容を最もよく表すキーワード(索引語)を抽出する必要があります。そのプロセスは一般的に以下の2つのステップからなります:
以下、形態素解析、接辞処理、索引語の重み付けの代表的な手法であるTF-IDF法について説明します。
言語学では、形態素は意味を持つ最小単位であると定義されています。形態素解析では形態素の同定と形態素の品詞の同定の二つの処理を行います。形態素解析(morphological analysis)では、入力として与えられた文字列を形態素の列に変換する処理を行います。キーワード抽出作業において形態素解析を行うのは、日本語のような単語と単語の間に空白を置かない言語において、単語の境界を判別する必要があるからです。
日本語の形態素解析のツールとしては茶筅やMecabなどがあります。以下、Mecabを使って形態素解析を行うための簡単なPythonスクリプトを紹介します。
#coding:utf-8 import MeCab sentence = '日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民との協和による成果と、わが国全土にわたつて自由のもたらす恵沢を確保し、政府の行為によつて再び戦争の惨禍が起ることのないやうにすることを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は、国民の厳粛な信託によるものであつて、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは人類普遍の原理であり、この憲法は、かかる原理に基くものである。われらは、これに反する一切の憲法、法令及び詔勅を排除する。' tagger = MeCab.Tagger() result = tagger.parse(sentence) print result wordCount = {} wordList = result.split()[:-1:2] for word in wordList: wordCount.setdefault(word,0) wordCount[word]+=1 for word,count in wordCount.items(): print '%-16s %i' % (word, count)
7-8行ではTaggerオブジェクトの結果(形態素解析)を出力しています。11行以降は各単語の数を数え、その結果を辞書に収納し、表示しています。
接辞処理(stemming)とは単語の文法的な派生形(品詞)を考慮し、単語を正規化する処理である。英語のように単語の境界で明確である印欧語族の言語で使われていますが、日本語では接辞処理は行われません。具体的に、英語の場合は語尾の”ed”や”ing”などを削除し、単語を語幹(stem)に縮退する処理を指します。
tf-idfは文書の局所的重み付けをと大域的重み付けにより文書中の特徴的な語を重み付けする手法です。局所的重み付けは文書内の語に対してのみ重み付けを行うものであり、文書内の単語の頻度(tf)を用います。大域的重み付けは、文書集合全体にわたり語に重み付けを行うものであり、多くの文書に共通して出現する頻出語には低い重みを与え、特定の文書にのみ偏って出現する語には高い重みを与えるidfを用います。tf-idfはtfとidfの積を取って語の重みを計算します。 それぞれの定義式は下記の通りです。
TFIDF法でキーワード抽出を行うプログラムを(TFIDF法のライブラリを用いずに)実装し、適切なデータセットに対してキーワード抽出を行い、結果について考察せよ。