以下を参考に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;