読者です 読者をやめる 読者になる 読者になる

AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

mecabのユーザー辞書にwikipediaの見出しを登録する

自然言語処理

以下を参考にwikipediaの見出しをmecabのユーザー辞書に登録してみます。
aidiary.hatenablog.com

wikipediaからの見出しをdownloadします。
wcで数えると見出しは1594901個ありました。159万です、多いね。

上記記事で紹介されているpythonコードを実行を使わせてもらいます。
入力ファイル名はスクリプト内に書いてあるので、便宜変更します。

    fin = codecs.open("jawiki-20101102-all-titles-in-ns0", "r", "utf-8")

↑自分がdownloadしたwikipediaの見出しテキスト名に置き換える。

実行するとunicode関係のエラー(UnicodeDecodeError: 'ascii' codec can't decode byteみたいな)が出ます

-fout.write("%s,-1,-1,%d,名詞,一般,*,*,*,*,*,*,*,wikipedia\n" % (word, cost))
+fout.write(u"%s,-1,-1,%d,名詞,一般,*,*,*,*,*,*,*,wikipedia\n" % (word, cost))

文字列の前にunicodeを示すuを追加するとエラーが消えました。

# python change.py
スクリプト実行。user.csvができました!
このスクリプトは見出しとして数字だけとか一文字だけなどは除外してくれています。


さっそく、mecabのテスト。
同じ記事のpythonスクリプトを実行すると

keywords = extractKeyword(str(text))

の部分で、またUnicodeEncodeErrorがでます。str()は文字列に変換する関数のようですが、
text自体はunicodeのテキストなんですけど、なんで変換してるんだろ?
python自体はまったく知らないので、行き詰まる。
自前でperlでテストしました。

しっかりuser.dicを参照して形態素解析が動いてました!

人工知能は、コンピュータに人間と同様の知能を実現させようという試み、あるいはそのための一連の基礎技術をさす。人工知能という名前は1956年にダートマス会議でジョン・マッカーシーにより命名された。現在では、機械学習、自然言語処理、パターン認識などの研究分野がある。
人工知能	名詞,一般,*,*,*,*,*,*,*,wikipedia 
コンピュータ	名詞,一般,*,*,*,*,*,*,*,wikipedia 
人間	名詞,一般,*,*,*,*,*,*,*,wikipedia 
同様	名詞,形容動詞語幹,*,*,*,*,同様,ドウヨウ,ドーヨー 
知能	名詞,一般,*,*,*,*,*,*,*,wikipedia 
実現	名詞,一般,*,*,*,*,*,*,*,wikipedia 
試み	名詞,一般,*,*,*,*,試み,ココロミ,ココロミ 
ため	名詞,非自立,副詞可能,*,*,*,ため,タメ,タメ 
一連	名詞,一般,*,*,*,*,一連,イチレン,イチレン 
基礎	名詞,一般,*,*,*,*,*,*,*,wikipedia 
技術	名詞,一般,*,*,*,*,*,*,*,wikipedia 
人工知能	名詞,一般,*,*,*,*,*,*,*,wikipedia 
名前	名詞,一般,*,*,*,*,*,*,*,wikipedia 
1956年	名詞,一般,*,*,*,*,*,*,*,wikipedia 
ダートマス会議	名詞,一般,*,*,*,*,*,*,*,wikipedia 
ジョン・マッカーシー	名詞,一般,*,*,*,*,*,*,*,wikipedia 
命名	名詞,一般,*,*,*,*,*,*,*,wikipedia 
現在	名詞,一般,*,*,*,*,*,*,*,wikipedia 
機械学習	名詞,一般,*,*,*,*,*,*,*,wikipedia 
自然言語処理	名詞,一般,*,*,*,*,*,*,*,wikipedia 
パターン認識	名詞,一般,*,*,*,*,*,*,*,wikipedia 
研究	名詞,一般,*,*,*,*,*,*,*,wikipedia 
分野	名詞,一般,*,*,*,*,*,*,*,wikipedia 

perlからテストする場合は、以下の様な感じ

my $path = '/usr/local/bin/mecab -u user.dic';
my $str = "人工知能は、コンピュータに人間と同様の知能を実現させようという試み、あるいはそのための一連の基礎技術をさす。人工知能という名前は1956年にダートマス会議でジョン・マッカーシーにより命名された。現在では、機械学習、自然言語処理、パターン認識などの研究分野がある。";
print $str."<br>\n";
open IN, "echo $str | $path 2>&1 |";
while(my $list = <IN>)
{
	if( index($list,"名詞")>=0 ) { print $list."<br>\n"; }
}
close IN;