Hatena::ブログ(Diary)

アスペ日記

2017-03-23

青春→鯖鰆みたいなやつ

今日、こんなツイートを見かけました。



ぼくもこういうのは大好きです。

(社会に適応できているかどうかは微妙なところです)

それで、こういうのを探してみることにしました。


漢字の構造については、漢字構造情報データベース(CHISE)というものがあります。

(かなりの労力がかかっていると思われるデータベースです。作られた方に感謝します。)

今回は、これを使わせていただきます。


% git clone http://git.chise.org/git/chise/ids.git

この中の IDS-UCS-Basic.txt が CJK 統合漢字のファイル、IDS-UCS-Ext-A.txt が CJK 統合漢字拡張 A のようです。

表示できない文字ばかり出ても面白くないので、今回はこの二つだけを使うことにします。


それと、元ツイートで言う「青春」のような、加工元の単語が必要です。

今回は、Wikipedia のタイトルを使うことにします。


% curl -LO https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles.gz
% gunzip jawiki-latest-all-titles.gz

後は、簡単な Perlワンライナー(1行スクリプト)で、加工元の単語それぞれについて、「すべての文字に共通の部品を足すことができるもの」を探すだけです。


% perl -Mutf8 -CSD -F/\\t/ -nale 'if (@ARGV) { next if $F[2] =~ s{(\p{Han})}{$1}g < 2; for $i(0..length($F[2])-1) { $ch = substr($F[2], $i, 1); if ($ch =~ m{\p{Han}}) { $dict{$ch}->{substr($F[2], 0, $i).".".substr($F[2], $i+1)} = $F[1]; } } } else { next unless $F[1] =~  m{^(\p{Han}{2,})$}; %n=(); @n{split//, $F[1]}=(); next unless keys(%n)==length($F[1]); %t = (); while ($F[1] =~ m{(\p{Han})}g) { for $key(keys %{$dict{$1}}) { $t{$key}++; } } for $key(keys %t) { ($k=$key) =~ s{\P{Han}}{}g; $s=join("", map { $dict{$_}{$key}; } split(//, $F[1])); print "$F[1]+$k=$s" if $t{$key} == length($F[1]) and not exists $e{$F[1].$s}; $e{$F[1].$s} = (); } }' ids/IDS-UCS-Basic.txt ids/IDS-UCS-Ext-A.txt jawiki-latest-all-titles > list.txt

できたファイルはgistに置いてあります。

16万行もあるので見るのはちょっと大変です。


この中から、面白そうなものを見てみることにしましょう。

まずは、一番長いものです。


% perl -Mutf8 -CSD -nle '$dict{$_}=(); END { print for sort {length($b)<=>length($a)} keys %dict; }' list.txt | head

一番長いものは9文字でした。


世田谷区教育委員会+⺡=泄沺浴沤漖淯涹溳浍

連合国軍最高司令官+木=槤㭘椢楎樶槁柌柃棺

国土交通省大臣官房+木=椢杜校樋㮐杕栕棺椖


世田谷区教育委員会」、全部さんずいがつけられるんですね。


次に、足す部品ごとに、一番長いものを探してみます。


% perl -Mutf8 -CSD -nle '@F=split/[\+=]/; $dict{$F[1]}=$_ if length($_) > length($dict{$F[1]}); END { print $dict{$_} for sort keys %dict; }' list.txt

いくつか拾うと、次のような感じです。


喜多見不動堂+⺖=憘恀悓怀慟憆

共産主義者同盟+⺘=拱摌拄㩘㨋挏擝

青少年委員会+⺼=腈䏚脌腇䐣脍

企業年金連合会+口=㖉㗼哖唫嗹哈哙

喜多見不動尊+火=熺㶴䙺炋㷲燇

風林火陰山雷+疒=瘋痳疢癊疝癗

連邦取引委員会+糹=縺綁緅紖緌縜絵

原子力安全委員会+艹=蒝芓艻荌荃萎蒷荟

世界長者番付+言=詍䛺䛫諸譒詂

月火水木金土+門=閒焛閖閑䦦䦌

軍人皇帝時代+魚=鯶魜鰉䱱鰣鮘

公民身分番号+鳥=䲲鴖鵢鳻鷭鴞


Wikipedia に「日月火水木金土」という記事はないようですが、「間」があるので「間閒焛閖閑䦦䦌」と揃いますね)


ほかに、よく出てくる単語についても見てみます。

Wikipedia でリンクが張られている数が多いもの順にリストを作ります。


% curl -Ls https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 | bzcat | head -n 1000000 | perl -Mutf8 -CSD -nle '$dict{$1}++ while m{\[\[(\p{Han}{2,})\]\]}g; END { print for sort { $dict{$b}<=>$dict{$a} } keys %dict; }' > frequent.txt
% perl -Mutf8 -CSD -nle 'if (@ARGV) { m{^(\p{Han}+)}; $dict{$1}->{$_}=(); } else { print for keys %{$dict{$_}}; }' list.txt frequent.txt > frequent_plus.txt

目視でいくつか拾ってみました。


大久保利通+木=杕杦椺梸樋

足利尊氏+⺡=浞浰澊汦

日清食品+艹=䒤蔳䓹䓵

武田信玄+女=娬㚼㜃妶

吉本新喜劇+口=咭呠噺嘻㘌

小林多喜二+亻=仦㑣侈僖仁

長宗我部元親+艹=萇萗莪蔀芫藽


最後に、この記事を公開するにあたって、はてなダイアリーEUC-JP なので、EUC-JP で表せない漢字を実体参照にしました。


% perl -Mutf8 -MEncode -CSD -i.bak -ple 's{(\p{Han})}{ Encode::encode("shiftjis", $1) eq "?" ? sprintf("&#%d;", ord($1)) : $1; }ge;' draft.txt

*1


やっぱり、こういうちょっとしたテキスト処理には Perlワンライナーが便利です。

awksed やるぐらいなら Perl おすすめですよ!

ツイッターでぼくの言いたいことを言ってくれている人がいたので、ツイートを貼っておきます。



紹介されているミニマル Perl、ぼくは読んだことがないので読んでみたいのですが、中古しかないのが残念です。



ところで、漢字に部首をつけるのが何の役に立つかを考えたのですが、検閲のある SNS などでヤバい単語を書くのにいいかもしれません。

リストを見ると、


本番行為+⺡=泍潘洐溈

本番行為+⺮=笨䉒筕䈧

本番行為+艹=苯蕃荇蒍


なんてのがありました。(ろくでもない)

*1:なぜ "shiftjis" にしているかは面倒なので略。

2017-01-21

適当に情報を消費する人たち(Amazon Dash Buttonについて)

Amazon Dash Buttonは何がヤバイのかという記事が最近バズっていましたね。


この記事の中で、「電池の寿命が1年」というのがキーのひとつになっているというところはいいですよね?


また、1年ごとに電池が切れるのもえげつない。

1年電池が切れるからこそ、Amazonプラットフォームが広告市場として成立するのだ。

Amazon Dash Buttonによって、広告費の投入先がテレビCMから、Amazonプラットフォーム上に移動したのだ。

(強調は引用者)


ところで、"Amazon dash battery"といったキーワードで英語版のGoogleで検索すると、次の記事が出てきます。*1


Amazon Dash Button Teardown

This means the ~1200 mAh battery should be able to power the device for at least four hours while on and decades while in sleep. Since the button is only on for a few seconds when activated, it can probably be used close to 1000 times before the battery dies. Thus, the button should become obsolete long before the battery is depleted.

(つまり、~1200 mAh電池はオンの状態で最低4時間、スリープ状態で数十年間給電できるはずだということになる。ボタンはアクティベートされたときに数秒間しかオンにならないので、電池が切れるまで1000回近く使えるだろう。そういうわけで、電池が切れるずっと前にボタン自体が必要なくなっているはずだ。)


実際に"decades"(数十年)持つかどうかはともかく、5年でも持つなら、話は全然変わってきますよね。

この記事が正しければ、元記事の「電池の寿命が1年」というのが見当違いであるという点について、問題ないですよね?*2


さて、もうひとつポイントを押さえておきます。


英語圏で最初に出た製品について情報を得るのに、まず英語で検索するというのは、基本中の基本である。


これは私の意見なのですが、みなさんはいかがでしょうか。

よって、私には、現状が次のように見えています。


キーとなる情報について、基本中の基本といえるような調査が行われておらず、結果として考察が見当違いになっている記事に、2480ブクマはてなブックマーク)もついている。


いや、ネット上の情報が玉石混淆だという点については非常に今さらなんですけどね。

これだけの人数がいて、「おかしい」と思う人がほとんどいないというのはどうなんでしょうね。

目から鱗が落ちたという人がブコメにたくさんいますが、頭大丈夫ですか?


*1:これは旧バージョンについてのものです。新バージョンはこちら

*2:新バージョンではさらに電力消費が抑えられているのでなおさらです。

2016-12-29

ドイツ語分割

ドイツ語分割スクリプトを作りました。

デモはこちら。

German Word Decomposer Demo

上のテキストエリアに例えば"Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz"と入れると、下のテキストエリアに"Rindfleisch-Etikettierungs-Überwachungs-Aufgaben-Übertragungs-Gesetz"となって出てきます。

レポジトリはこちらです。

https://github.com/hiroshi-manabe/german-word-splitter


新旧正書法に対応しています。

正書法では、例えば"Schiffahrt"は"Schiff-Fahrt"になります。

何をもって分割単位とするかは難しいところなのですが、"Bahnhof"(駅)や"Krankenhaus"(病院)のようなものは切らないという方針で、まあそうすると微妙なものがたくさん出てくるのですが、頻出語についてはある程度目で見て切る切らないを決めました。

2016-12-28

ニューラルかな漢字変換の細かいツッコみどころ

ニューラルかな漢字変換という記事へのツッコミです。

いや、ニューラル部分はいいんですよ。

ぼくはやってないから。


ツッコみどころは、ごく細かいところです。

注釈の、「かな漢字変換はN=3以上にしても精度が上がらないことが実験により確かめられています。詳しくは論文(リンク)を参照ください。(ドヤァ 」という箇所です。


それ、BCCWJのコアデータだけ使った場合ですよね。


ぼくは以前、N-gram かな漢字変換を作って公開したことがあります。

これは、京都大学で公開している言語モデル配布ページの、BCCWJ全体を使ったものです。

実装はhttps://github.com/hiroshi-manabe/ngram-converter-cppにあります。


http://vocrf.net/test/ime.htmlで、4-gram かな漢字変換をテストできます。

(PCで、PCのIMEを切って、IME On/Off ボタンを押します)

これでやったら、例えば「今日の天気は」等は変換できます。

(ちなみに、例えば「てんきがおとずれた」はちゃんと「転機が訪れた」になります。)


まあ、ぼくのやつはテストデータと訓練データを分離したちゃんとした実験をしていないので、うまくいって当たり前と思われるかもしれません。

でも、BCCWJコーパス全体の中に「今日の天気」は47件もあるので、訓練データとテストデータを分けたとしても、偏りなく分ければ訓練データにも多数含まれることになります。

(ところで、言語モデル配布ページkkc-BCCWJ.tarの中の3-gram.fwkを見ると「2 今日/きょう の/の 天気/てんき」となっていて、3-gram が2個しかないことになっているんですよね。少納言などで調べると47件あるのに。どうしてこうなっているんでしょうか?)


いや、ぼくのやつはちゃんと論文にしてないし、これがどこかの知らない人なら、「お前の 4-gram 変換なんて知らん」と言われたらそれまでなんですけどね。

不思議なのは、yoh_okuno さんは昔Ngramかな漢字変換とMozc辞書の比較(現在はプライベートモード)という記事を書いて、(ぼくがサボってた)精度の検証をしてくれているということです。

そのときに、変換結果を見ていたら、2-gram じゃできないような変換(元記事で書かれているようなもの)が 4-gram でできているということに気づいて、「かな漢字変換はN=3以上にしても精度が上がらない」ということが一般的には言えないとわかってもいいはずだと思うんですよね。


まあ、今回の記事のやつはコアデータだけ使っているということで、それでニューラルでうまくいっているのはほんとすごいとは思うんですけど。

単純に、不思議だなぁという話でした。

2016-12-06

責任と対策の分離

通常の場合、何かの問題に責任のある人がいる場合、その人に何とかしてもらうのが筋です。

それが原則です。

ただ、責任のある人が多数である場合など、その人たちに何とかしてもらうことが難しい場合、発想を「責任」から「対策」に切り替える必要があります。


はい、ちょまど氏の件です。


人間を人間として扱わないからサークラ問題が起きるんだよ


確かに、ちょまど氏は合法手しか打っていないので責任はありません。

責任はちょまど氏をアイドル扱いする側にあります。

ただ、「アイドル扱いをやめろ」「人間扱いしろ」という言葉で、問題が魔法のように解決するというわけではありません。


さて、ちょまど氏がこの状況を意識的に作っているなら、合法手だけを打っているちょまど氏を止める方法はありません。

でも、ちょまど氏は本当にこの状況を望んでいるの? というのが、前記事の問いかけでした。


ちょまど氏がこの状況を望んでいないのであれば——もちろん、ちょまど氏には何の責任もないのですが——この状況を変える鍵はちょまど氏にあるのではないか。

というのが、私の考えです。


で、ちょまど氏が望んでいないのであれば、という前提で。

そうであれば、ちょまど氏は現状分析ができていないと思われます。

(できていれば、今の行動になっていないはずなので)

だから、現状分析(表層意識で意図していなくても、結果としてチヤホヤされる行動になっている)を提供しようと思ったわけです。


で、なぜその表層意識と行動のずれがあると私は考えているか。

そこで初めて、男性恐怖の話が出てくるわけです。


整理すると、以下のようになります。


1. ちょまど氏は今の状況に対する責任はない。

2. よって、ちょまど氏が今の状況を望むなら、誰もそれに干渉できない。→終わり

3. ちょまど氏が今の状況を望んでいないのであれば、行動を変えるという選択肢がある(変えなければそのまま)。

4. 行動を変えるという選択肢を選ぶ場合、現状分析が必要なので、私なりにそれを提供したい。

5. 私なりの現状分析は、ちょまど氏の表層意識と潜在意識にずれがあるというものである。

6. その原因は、ちょまど氏の男性恐怖である。


つまり、3 の前提が外れている場合(ちょまど氏が今の状況を望んでいる)や、4 の前提が外れている(行動を変えるという選択肢を選ぶつもりはない)のであれば、前の記事は「見当違いかつお節介」でしかなかったわけです。

そこは賭けなのでしょうがないですね。

私としては、3 と 4 の前提が当たっている(ちょまど氏は今の状況を望んでおらず、何かそれに対してできることがあるならしたいと思っている)ことを願っています。