2015/01/18(日)Python勉強メモ#5「homura と madoka で形態素の頻度を数えよ」

あらかじめ「pip」とかで「homura」と「madoka」を入れておきましょう。

まずはダウンローダーの「homura」で形態素解析済みの青空文庫のデータをダウンロード。

my-mbp% ipython
Python 3.4.2 (default, Jan 12 2015, 11:46:28) 
Type "copyright", "credits" or "license" for more information.

IPython 2.3.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: from homura import download

In [2]: download('http://aozora-word.hahasoha.net/utf8/newnew.csv.gz')
   100%    615.8 MiB      11.1 MiB/s            0:00:00 ETA

適当に解凍したら「madoka」(Pythonの辞書より省メモリかもしれないデータ構造を提供するライブラリ)で形態素をカウントです。(Madokaの詳細: http://s-yata.github.io/madoka/index.ja.html

#!/usr/bin/env python

import madoka

sketch = madoka.Sketch()

with open('newnew.csv', 'r') as f:
    for line in f:
        morpheme = line.split(',')[3]
        sketch[morpheme] += 1
        print(morpheme)

print(sketch['人'])
print(sketch['面倒'])
print(sketch['蕩尽'])

出力された頻度(推定値)は以下のようになりました。

1418808
57427
1910

実際の頻度は以下の通り。

#!/usr/bin/env python

from collections import Counter

cnt_of = Counter()

with open('newnew.csv', 'r') as f:
    for line in f:
        morpheme = line.split(',')[3]
        cnt_of[morpheme] += 1
        print(morpheme)

print(cnt_of['人'])
print(cnt_of['面倒'])
print(cnt_of['蕩尽'])
217837
1738
23

2014/12/20(土)Web Speech API と Twitter n-gram を利用した英語発音矯正ゲーム

4月からは自分が研究室で唯一の日本人になってしまうので、英語の発音のトレーニングをひたすら楽しく積めるWebアプリケーションを研究の合間に作っていました。

「えいごのはつおんとれーにんぐ」 https://pron.chobitool.com/

開発は6日間ぐらいで、そのうち素材集めに3日ほど費やしました。

Web Speech API に音声認識と音声合成のインターフェースがあるので、これらをフル活用しました。出題される問題は Twitter n-gram の高頻度の表現から抽出しています。

いい練習になるので、マイクとChromeがあればどうぞ。

オペレーターズサイドという音声認識ゲームに触発されて「なんだとはなんだゲーム」も作りました。

学生寄宿舎の壁が薄すぎて小さい声でしか練習できないのが辛いところです。

2014/03/21(金)Lingua::JA::KanjiTable - Perlで常用漢字表と人名用漢字表を扱う

https://metacpan.org/pod/Lingua::JA::KanjiTable

常用漢字表だけでも個人的には嬉しいのですが、人名用漢字表も用意してあるので妥当な名かのチェックもできます。戸籍法 第50条と戸籍法施行規則 第60条によると、子の名には常用漢字表の漢字と人名用漢字表の漢字と片仮名と平仮名が使えるようなので、以下のコードで名の妥当性をチェックできます。(名は Mock::Person::JP で出力)

#!/usr/bin/env perl
 
use strict;
use warnings;
use utf8;
use Lingua::JA::KanjiTable;
 
my @name_list = qw/希砂妃 みのる 菜奈世
勇凪 ソラ 未佑 茶流 怜実 紫翠 夢里/;
 
for my $name (@name_list)
{
    $name =~ /^p{InMei}+$/
        ? print "validn"
        : print "invalidn"
        ;
}
 
sub InMei
{
    return <<"END";
+Lingua::JA::KanjiTable::InJoyoKanji
+Lingua::JA::KanjiTable::InJinmeiyoKanji
3005
3041t3096
309D
309E
30A1t30FA
30FCt30FE
END
}

2014/01/11(土)Directional Formatting Characters に関するメモ

大部分の言語ではテキストを左から右へ表示するけど、アラビア語やヘブライ語は右から左に表示するらしいです。しかしながら、それらの言語のテキスト中に数字や英語などの左から右へ表示されるテキストが含まれると、テキストが「左から右」と「右から左」の双方向性を持つことになってしまいます。そのため、双方向性を持つテキストをどう表示したら良いか曖昧性が生じます。(恐らくレンダリングエンジンが)よしなに表示してくれることもあるけど、それだけでは十分でないケースがあるため、方向性を制御できるように「Directional Formatting Characters」が必要になるっちゅうこっちゃ。

「Directional Formatting Characters」の一覧は以下の通り。

U+061C  ARABIC LETTER MARK
U+2066  LEFT-TO-RIGHT ISOLATE
U+2067  RIGHT-TO-LEFT ISOLATE
U+2068  FIRST STRONG ISOLATE
U+2069  POP DIRECTIONAL ISOLATE
U+200E  LEFT-TO-RIGHT MARK
U+200F  RIGHT-TO-LEFT MARK
U+202A  LEFT-TO-RIGHT EMBEDDING
U+202B  RIGHT-TO-LEFT EMBEDDING
U+202C  POP DIRECTIONAL FORMATTING
U+202D  LEFT-TO-RIGHT OVERRIDE
U+202E  RIGHT-TO-LEFT OVERRIDE

恐らく、99.9%ぐらいの日本語がメインのテキストではこれらのフォーマット文字は不要であると考えられるので、拙作のPerlモジュール「Lingua::JA::NormalizeText」ではこれらの文字を削除するオプションを用意しています。(Webアプリケーションでこられの文字を埋め込んでイタズラされちゃうおそれがあるため)

さらに詳しい情報は↓を参照されたし。 Unicode Standard Annex #9

2013/09/25(水)感情の分類を考える

趣味で人工知能のために会話文の感情分類がしたいなぁっと思ったので、ちょいと調べていました。そもそも感情は明確に分類できるものなのか怪しいのですが・・・。

ちょろっと自然言語処理関連の論文を調べた限りでは、

  • 「感情表現辞典」という辞典の分類:「喜」「怒」「哀」「怖」「恥」「好」「厭」「昂」「安」「驚」
  • Ekmanの分類:「怒り」「嫌悪」「恐れ」「幸福感」「悲しみ」「驚き」
  • Plutchikの分類:「喜び」「悲しみ」「受容」「嫌悪」「恐れ」「怒り」「驚き」「期待」とこれらの合成 (日本語訳は 山口大学工学部研究報告第53巻第1号pp.85-90 を参考にしました:http://memoirs.lib-e.yamaguchi-u.ac.jp/531/11.pdf

という分類がよく使われているようです。

自分がしたいのは会話文の感情分類。

Ekmanの分類は表情から読み取れる感情とのことなので、除外。残りは Plutchik の分類か「感情表現辞典」の分類。

Plutchik の混合感情の考え方とかはよく出来ていると思うんだけど、自分以外の人に混合感情を意識させて妥当な感情を選ばせるのはあまりに負担がかかり過ぎるように思えます。かといって混合感情を意識させない場合、ドンピシャに純粋感情を過不足なく複数選択させるのが困難。

一人で感情分類作業する場合は、Plutchik の分類でもいいけど、誰かに手伝ってもらう場合はPlutchikの分類はキツい。

というわけで、「感情表現辞典」の10分類をベースにすることにしました。

今日、注文していた「感情表現辞典」が来たのでちょろっと読みました。

この10分類は実際の表現例から「喜」「怒」「苛」「悲」「淋」「鬱」「悄(ショウ:しょんぼりする)」「苦」「安」「悔」「昂」「感動」「好」「嫌」「憎」「驚」「怖」「恥」「惑」の19感情を抽出して境界線の引きにくさを理由に以下のように圧縮したもののようです。

  • 「哀」={「悲」,「淋」}
  • 「厭」={「鬱」,「悄」,「苦」,「悔」,「嫌」,「憎」,「惑」}
  • 「昂」={「苛」,「昂」,「感動」}

これでほぼ自分の直感にも反しないのですが、いくらか拡張しました。

人工知能を考えると、

  • 友達としての好き
  • 恋人としての好き
  • 慕う(目上の人への)の好き
  • 憧れの好き はそれぞれ分けるべきと考えて、

「好」ー>「友情」,「恋愛」,「忠誠(忠義)」,「欲」

に拡張しました。

これで「喜」「怒」「哀」「怖」「恥」「厭」「昂」「安」「驚」「欲」「友情」「恋愛」「忠誠」の13感情。

これらの13種のうちのどれかか、これらのうちの組み合わせで会話文に表れるほとんどの感情は網羅できるかな?

-追記-
研究レベルなら、「An Argument For Basic Emotions」とか読んでおいたほうがいいです。これによると、愛はemotional attitudeで感情(情動)と区別されています。 Plutchikの3次元モデルは「The Nature of Emotions」を読んだけど根拠が不明でした。