不可視点

search guy at cookpad.com

形態素解析エンジンSenを使う

ゼミ用資料 関係のない方はスルーしてください


グーグル様に聞けばすばらしい資料がいっぱい出ますが、とりあえず出たやつをまとめました。

無料のものから商用向けまで非常に多くの形態素解析エンジンが開発されている。

形態素解析とは?

対象言語の文法の知識(文法のルールの集まり)や辞書(品詞等の情報付きの単語リスト)を情報源として用い、自然言語で書かれた文を形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの品詞を判別する作業を指す。

自然言語で書かれた文を、形態素(言語で意味を持つ最小単位)に分割する技術です。この際、辞書 (「品詞」などの情報つきの単語リスト)中の情報を参照することで、「品詞」、「活用形」、「読み」等の情報を得ることが可能です。

形態素解析アルゴリズムにはいろいろな手法があり、製品によって提供される機能も精度も異なる。
一般的に形態素解析は品詞や単語の情報を持った辞書が利用され、この辞書の作成方針によっても精度に影響。

辞書

今回使用するSenではデフォルトのIPAの辞書を採用。他にも無償で利用できるもので新しいものだと例えば、

また、新語や専門領域の言葉などは辞書に登録されていないものが多く、高精度な解析のためには適宜登録していくことが必要。

何ができて何のミーニングがあるの?

  • 形態素解析を行うことで日本語など単語の切れ目がわかりにくいアジア諸語、アラビア語などを分かち書きにすることができる。
  • 品詞情報を利用すると文法を含めた文章の構造を扱うことができる。
  • 動詞の活用などによって生じる表記ゆれを吸収することができまる。あいまい性の回避

文章検索・構文解析アルゴリズムは単語単位の対象を前提としているものが多くある。
インド・ヨーロッパ語族は単語の切れ目が分かりやすいから容易に単語への分割が可能だが、優れたアルゴリズムであっても日本語や韓国語、アラビア語などに適用しずらい。
形態素解析を利用することで使えるアルゴリズムが増える。


使ってみる

とりあえず試す
Sen/Java

インストールガイド:-http://www.techscore.com/tech/ApacheJakarta/Lucene/4.html
必要なもの:ant, perl(辞書のコンパイルに必要です。

import java.io.IOException;

import net.java.sen.StringTagger;
import net.java.sen.Token;

public static void main(String[] args) throws IllegalArgumentException, IOException {

	System.setProperty("sen.home","c:/sen");

	StringTagger tagger = StringTagger.getInstance();

	//解析対象
	String str = "今日はそこそこ良い天気ですね。図書館で雑誌をめくってこようかとおもいます。";
	//形態素を配列で取得
	Token[] tokens = tagger.analyze(str);
//here
	//取得した形態素をカ行変格活用とかはずして、語の基本形で取得。
	for(int i=0; i<tokens.length; i++){
		System.out.println(tokens[i].getBasicString()
				+"("+tokens[i].getTermInfo()+")");
	}
}


今日 (名詞,副詞可能,*,*,*,*,今日,キョウ,キョー)
は (助詞,係助詞,*,*,*,*,は,ハ,ワ)
そこそこ (副詞,助詞類接続,*,*,*,*,そこそこ,ソコソコ,ソコソコ)
良い (形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ)
天気 (名詞,一般,*,*,*,*,天気,テンキ,テンキ)
です (助動詞,*,*,*,特殊・デス,基本形,です,デス,デス)
ね (助詞,終助詞,*,*,*,*,ね,ネ,ネ)
。 (記号,句点,*,*,*,*,。,。,。)
図書館 (名詞,一般,*,*,*,*,図書館,トショカン,トショカン)
で (助詞,格助詞,一般,*,*,*,で,デ,デ)
雑誌 (名詞,一般,*,*,*,*,雑誌,ザッシ,ザッシ)
を (助詞,格助詞,一般,*,*,*,を,ヲ,ヲ)
めくる (動詞,自立,*,*,五段・ラ行,連用タ接続,めくる,メクッ,メクッ)
て (助詞,接続助詞,*,*,*,*,て,テ,テ)
くる (動詞,非自立,*,*,カ変・クル,命令yo,くる,コヨ,コヨ)
う (助動詞,*,*,*,不変化型,基本形,う,ウ,ウ)
か (助詞,副助詞/並立助詞/終助詞,*,*,*,*,か,カ,カ)
と (助詞,格助詞,引用,*,*,*,と,ト,ト)
おもう (動詞,自立,*,*,五段・ワ行促音便,連用形,おもう,オモイ,オモイ)
ます (助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス)
。 (記号,句点,*,*,*,*,。,。,。)

このように文章を形態素に分けることができる。形態素に関する情報は以下のようなものが利用できる。

Token.getBasicString(); //活用を取り除いた基本形を取得
Token.getSurface(); //活用などをそのまま残して取得
Token.getTermInfo(); //品詞など形態素の情報、なければnull
String toString()
    形態素(表層表現)
String getBasicString()
    基本形
String getPos()
    品詞情報(品詞、用言なら活用型、など)
String getPronunciation()
    発音
String getReading()
    読み
int length()
    長さ
int start()
    形態素の始まりの位置
int end()
    形態素の終わりの位置
頻出語を調べる方法:Hashtableクラスを利用した場合

上記プログラムの

//here

のところに以下のプログラムを入れてみる。

//	出現回数(形態素)
	Hashtable<String, Integer> frequency = new Hashtable<String, Integer>();

	for(Token token : tokens){
		if(token.getTermInfo() !=null 
				&& (token.getTermInfo().startsWith("名詞"))){
			if(frequency.containsKey(token.toString())){
				frequency.put(token.toString(), 1 + frequency.get(token.toString()));
			}else{
				frequency.put(token.toString(), 1);
			}
		}
	}

	for(Map.Entry<String, Integer> x : frequency.entrySet()){
		System.out.println(x.getKey() + ":" + x.getValue().toString());
	}
図書館:1
雑誌:1
天気:1
今日:1
ガバナンス演習ブログに適用すると・・・

ガバナンス演習のブログ(54人)の241の記事に対して頻出語(形態素)を多い順に10個選ぶ。
各々の頻出語が含まれる文の集合の中で頻出する単語を同様に5個取得した。
すると、争点になっている語、またその語と一緒に利用される語がリストアップできる。

from:2007/04/01 0:00:00 to:2007/05/21 0:00:00
 浜松{ 西日本 東 東日本 静岡 県}
    58/ 138sentence=0.42028984
 大学{ 祭 大学生 自転車 学生 店 インターフェース}
    93/ 152sentence=0.6118421
 自転車{ 規制 通学 駐輪場 禁止 キャンパス}
    51/ 99sentence=0.5151515
 規制{ 学生 反対 改善 納得 交通}
    28/ 76sentence=0.36842105
 学生{ 側 模擬 店 団体 学校 参加}
    20/ 73sentence=0.2739726
 ブログ{ 授業 日記 演習 課題 評価 論}
    29/ 94sentence=0.30851063
 西日本{ 東日本 静岡 県 関西 関東 東 姓}
    43/ 69sentence=0.6231884
 店{ 模擬 団体 参加 学外 店員}
    56/ 90sentence=0.62222224
 静岡{ 県 市 東 東日本 線}
    41/ 55sentence=0.74545455
 参加{ 祭り 団体 必要 形成 条件 外部 意欲 自然 包含 学外 合意 議論 委員}
    22/ 53sentence=0.41509435

899/ 4031sentence[241entry]=0.22302158

ごく単純なアルゴリズムでおもしろい結果を得ることができる。キレイに出ているように見えるが、ストップワードを設定して「ありふれた単語」は無視している。

String[] ng = {"もの", "これ", "それ", "よう", "こと",
		"的", "ん", "の", "私", "人", "意見",
		"1", "さん", "何", "わけ", "そう", "ため", "やつ",
		"たち", "0", "なん", "みたい", "自分", "俺", "者",
		"さ", "カ", "ここ", "確か", "リ", "今", "あと", "静",
		"問題", "ら", "気", "5", "うち", "前",
		"一", "笑", "タイトル", "とき", "他", "話", "輪", "性", "本", "今回", "回", "日", "上"};

このように個別に不要な単語を設定していくわけにはいかない。実際にはTF-IDFなどのアルゴリズムを利用して特徴的な語を優先的に利用することが必要である。

係り受け

係り受けなどを解析することである語がどのように利用されているかを同定することができる。

バナナを育てる。バナナで釘を打つ。バナナを食べる。りんごを剥く。りんごを食べる。りんごを捨てる。

バナナやりんごなどの名詞の直後に現れる動詞を集計すれば、バナナに対してできる動作を知ることができる。
食べるなどの動詞の直前に現れる名詞を集計すれば、食べることのできるものを知ることができる。

係り受けを調べる方法:Hashtableクラスを利用した場合

上記プログラムの

//here

のところに以下のプログラムを入れてみる。

//	受け(形態素)
	Hashtable<String, String> target = new Hashtable<String, String>();
//	直前の名詞
	String noun = "";
	for(Token token : tokens){
		if(token.getTermInfo() !=null 
				&& (token.getTermInfo().startsWith("名詞"))){
			
			noun = token.getBasicString();
			
		}else if(token.getTermInfo() !=null 
				&& (token.getTermInfo().startsWith("動詞"))){
			target.put(noun, token.toString() + " " + target.get(noun));
			noun ="";
		}
	}
	
	for(Map.Entry<String, String> x : target.entrySet()){
		System.out.println(x.getKey() + ":" + x.getValue().toString());
	}
バナナ:食べる 育てる null
りんご:捨てる 食べる 剥く null
釘:打つ null

利用事例

日本語入力

読み仮名と漢字を逆にして・・・

twitterで何してtter:http://ryo.hayamin.com/nani/

何してtterは、twitterの情報を使って、あこがれのアルファなんちゃらの人たちがいつも何をやっているかなんてことを教えてくれます。

wkzkさんが日々何をしているのかを統計してみる。

結果:(2007/5/11 23:45)

Twitterから分析したwkzkの日々の行動

悩む(2) 進む(5) 渇く(1) 書く(13) 入る(4) 困る(1) ばれる(1) 出る(1) いう(1) つなぐ(3) 落ちる(1) かける(2) 聞く(3) がんばる(1) 言う(1) 戻る(2) 感じる(2) 泣ける(1) 食べる(6) 終わる(6) もらう(1) 見れる(1) 動く(2) わかる(3) しれる(1) 満たす(1) 黙る(1) 買う(1) 帰る(7) ほる(3) 作れる(1) 行う(3) 取る(2) 思う(4) 読める(1) 来る(1) いく(1) 任せる(1) 走る(1) 忘れる(3) へぐ(1) 入れる(1) 書ける(1) 知る(1) 向かう(1) すげる(1) 間に合う(1) 書き直す(1) サボる(1) 進める(1) 見る(3) 釣る(1) だらける(1) 変える(1) 投げる(1) はずす(1) 飲む(2) 書き込む(1) 食う(3) いる(5) 気づく(1) 読む(3) 寝る(2) 作る(2) 考える(4) 起きる(1) たつ(1) 始まる(1) なる(4) 行く(5)

Twitterから分析したwkzkが日々気にしているコト

次(1) 変(1) プログラム(2) OS(1) 自主(1) 成績(1) キタ(2) 帯(1) 開始(1) 説明(1) 杉(2) 法則(1) 喉(1) 今後(2) 雰囲気(1) チェック(2) 本気(1) 可能(1) 完了(1) 事情(1) 気(1) 奥(1) ソース(2) 従来(1) DS(1) アップデート(1) テスト(5) 間違い(1) 格闘(1) サーバー(1) Linux(1) 範囲(1) install(1) Web(1) 準備(1) 選(1) 室(1) 親(2) 掃除(1) Wiki(1) コマ(1) 乙(1) ゼミ(5) 修正(1) 俺(1) 改良(1) 局(1) 朝(1) ル(3) キーボード(1) 元気(1) 対(1) 会(1) y(1) 勉強(4) クラス(1) 的(1) SQL(1) 重要(1) 絶望(1) orz(6) 発行(1) 論(1) www(3) HP(1) 移動(1) 午前(1) 多(2) 不明(1) 勝手(1) 6(2) 話(1) 失敗(1) 遅刻(1) 罠(1) エントリー(1) 友人(2) 興奮(1) 実家(1) 何(1) ジュース(1) 新た(1) 合同(1) モジュール(1) 復活(1) トラックバック(1) 参加(1) ツンデレ(2) シンプル(1) 再(3) mixi(2) 火曜日(1) プロ(2) 帰還(1) 構築(2) 一時(1) 半角(1) CSS(2) 作業(2) 作成(1) 証明(1) 書(4) 詳細(1) 係(1) 大学(1) 性(1) メール(4) 家(1) 仕様(2) ー(1) 返信(1) make(2) 周り(1) RSS(2) e(1) 方針(1) 報告(1) 英語(1) 教育(1) 終了(5) 飯(4) 適用(1) スペース(1) センス(1) 録(1) ファイル(1) スケジュール(1) 日誌(1) 機(1) 収集(1) PC(1) 会社(1) 処理(2) 業務(1) プログラミング(1) 制限(1) 完成(1) 迷惑(1) 実装(1) 学校(1) 書類(1) 半(1) インストール(1) 継続(1) 例外(1)

関連

機械翻訳

NIST 2006 Machine Translation Evaluation Official Results

中国語とアラビア語の文章を英訳するソフトウエアの競技会には、40の プログラムが参加していますが、そのうちの一つを除いて、Googleは全ての 課題で首位もしくは同率首位という成績を収めました。競技は、人間の翻訳者 達によって作製された参考文書と、プログラムが出した結果がどれだけ一致して いるのか、という事を基準に採点されています。

Googleのプログラムを作成したチームには、中国語を話す人もアラビア語を 話す人もいないそうです。彼等は純粋に、「アラビア文字あるいは漢字の文字 列」と「それに相当する英語の文字列」を一致させることを学ぶプログラムを 作製したそうです。より多くの例文がストックされるのに伴い、「翻訳」の 正確性は高くなります。

統計的手法による翻訳にはコーパスが不可欠で形態素解析が利用されているはず。
グーグル様のFAQ:http://www.google.com/intl/ja/help/faq_translation.html

マーケティング

ネット上での評判を判定するポジティブ/ネガティブ(p/n)判定技術を利用したサービスが最近増えてきている。p/n判定技術は、文章を形態素解析した上で、品詞間の係り受けを考慮しつつ、ある対象語に対する属性値とその評価値の組を抽出する技術である。レストランの属性値としては、味、値段、雰囲気、立地、メニューなどがあげられ、評価値としては、いい、悪い、まずい、おいしい、安い、豊富などがあげられる。日本語では往々にして主語が省略される場合が多いが、文脈から最も自然な主語を補う手法が使われる。

SPSS

概要

KH Coderとは、内容分析(計量テキスト分析)もしくはテキストマイニングのためのフリーソフトウェアです。新聞記事、質問紙調査における自由回答項目、インタビュー記録など、社会調査によって得られる様々な日本語テキスト型データを計量的に分析するために製作されました。