2020年11月23日月曜日

DXWnd で古の名作アクションをプレイしよう

Freem! で時々見かけるアクションエディター作品。 特にアクションエディター+ で作られた作品は動かないのでプレイできていなかったのですが、最近、解決方法があると知りました。 以下の記事で紹介されている DxWnd です。
アクションエディター+ 作品は、昨今の Windows 環境では全画面で表示される上に互換性の問題で猛烈に動作が遅くなってしまいます。 しかし DxWnd を導入すると、アクションエディター+ 作品を自由なウィンドウサイズでスムーズにプレイできます。 詳しい導入方法は上記事を参照してください。 自分のために画像で設定の要点だけまとめておくと、だいたい以下のような感じ。 Edit → Add で Path に起動したい exe ファイルを登録し、あとはダブルクリックでゲームを起動できます。



最近ひそかに様々な作品をプレイしていたのですが、どの作品も非常に面白かったです。 古めの作品は難しいのが多いけど、中にはサクサク系のもあります。 アクションエディター+ の名作って結構たくさんあって、特におすすめの作品は以下です。 以前紹介したこともある VampunishX の前作品もアクションエディター+ だったのですね。 Vampunish は Direct3D だと DxWnd を使わなくても動作するので、DirectShow 回りが良くないみたいです。


古の名作は、今プレイしてもまったく色褪せない完成度です。 特に 血の鎮魂歌 青の勇者+ の作者様であるまくろじゃさんは、非常に多くの作品 (18作品!) を公開しています。 昔の悪魔城ドラキュラくらいの難易度の作品をがっつり楽しめます。

2020年11月21日土曜日

形態素解析辞書の使用感まとめ

最近、自然言語処理でよく利用される辞書やコーパスを利用して、ニ文字熟語や三文字熟語、用例の生成を試みてきました。 三文字熟語が少し強敵で、これまでたくさんの辞書を利用して実験しています。 たくさんアプリを作ってクロスチェックできるようになり、バグも減り知見も溜まってきたので、結論をまとめておきます。

成果物

ちなみに熟語生成の成果物はこちら。 以下のライブラリを利用して 12こくらい アプリを作ったりもしてます
また熟語生成やゲーム制作を通じて、既存の自然言語処理には様々な問題があると改めてわかりました。 そこで痒いところに手が届く、ライブラリも色々と作りました。 作る気はまったくなかったのですが、既存のライブラリではできないことが多すぎて作らざるを得なかったものたちです。 コンセプトは O(1) で検索できて省メモリです。

自然言語処理によく使われる辞書まとめ

熟語生成について語る前に、良い機会なので自然言語処理においてよく使われる形態素解析辞書や語彙辞書についてまとめておきます。 形態素解析辞書や語彙辞書を使うと、簡単に熟語生成ができます。 JMDictFurigana は有名ではないけど、かなりたくさんの語彙が登録されています。 有料では BCCWJ などありますが、利用が限定されているので扱いません。 有用な辞書はすべて入れたつもりですが、他にもあるでしょうか。

名称語彙数ライセンス
Juman (dic) ver 7.0141,434BSD 3-Clause
JMdictFurigana ver 2.2.1195,098CC-BY SA
Juman (all) ver 7.01215,838BSD 3-Clause
IPADic ver 2.7.0334,221IPADic License
NAIST-jdic ver 2010-07-30485,863BSD 3-Clause
JMndictFurigana ver 2.2.1581,408CC-BY SA
SudachiDict (small) ver 2020-07-02768,030Apache Licence 2.0
UniDic (cwj) ver 2.1.2872,831GPL / LGPL / BSD 3-Clause
UniDic (csj) ver 3.0.1.1875,923GPL / LGPL / BSD 3-Clause
SudachiDict (+core) ver 2020-07-021,619,350Apache License 2.0
SudachiDict (+full) ver 2020-07-022,927,811Apache License 2.0
mecab-unidic-neologd ver 2020-09-103,384,963Apache License 2.0
mecab-ipadic-neologd ver 2020-09-105,572,307Apache License 2.0


ちなみに語彙量が多ければそれで良いかというと、そうでもないと思います。 たとえば neologd にはほとんど同じ語彙で「〜」の数だけ違うものが大量に登録されています。 これはなぜかというと、既存の形態素解析器は「やゔぁあああい」「わーーーーーい」といった文字列は本質的に解析が難しいからなんですよね。 おそらくこの問題を少しでも改善しようと統計的に出現頻度の高いパターンを語句として登録しているのだと思います。 ただ形態素解析以外でこれが使えるかというと、ほとんどのケースで使えないでしょう。 よって用途に応じた選択こそが大事なのだと思います。 実際にいろいろ触って気付いたこともメモとしてまとめておきます。


熟語や用例の生成に一番良いのは形態素 N-gram

では熟語を生成するのに一番良いのはどれでしょうか。 結論を先に言ってしまうと、語彙辞書からではなく Web から抽出した N-gram からの抽出が最も適していると思います (爆)。 成果物たる marmooo/ngram-idioms では、NWC 2010 という形態素 N-gram コーパスを利用しています。 いきなりちゃぶ台返しのような結論ですが、実際にやってみてわかった事実なのでどうしようもない。 N-gram は実際に使う言葉の頻度分布をそのまま反映するので、自然な熟語が生成できます。 N-gram 以外の形態素解析辞書には読みデータが付いている利点があるのですが、分布の利点はどうしても捨てられませんでした。 ちなみに N-gram 以外の方法では、私が作った熟語生成ライブラリの紹介順で生成結果が良かったです。 Juman 辞書では熟語生成をしていませんが、これは単にやる気の問題です。 固有名詞が扱いにくく、ふりがなも一部にしかないので、やる気が出なかった。

N-gram が一番良かったと結論を述べてしまいましたが、辞書ごとにどのような違いがあったか軽く説明したいと思います。 事前に特徴を知っていると、どのような利用シーンでどの辞書を使えば良いか、わかりやすくなります。 こちらの情報のほうがはるかに有用です。

辞書の特徴

NAIST-jdic, IPADic

熟語の生成はそれなりに安定していますが、N-gram より使われない熟語がよく出てきます。 ニ文字熟語だと問題にならないのですが、三文字熟語になると顕著です。 NAIST-jdic と IPADic はかなり近いデータではありますが、NAIST-jdic が上位互換になっています。 IPADic より語彙数も多いですし、より正確な生起コストが記載されている利点があります。 IPADic と NAIST-jdic で迷ったら、普通は NAIST-jdic で良いと思います。 NAIST-jdic は同音異義語や表記ゆれをきちんと扱っており、クオリティの高い辞書だと感じました。 ただ実際に生成してみると、三文字熟語に関しては IPADic のほうがずっと良いです。

熟語に限らない話でもいくつか気になることはあります。 どちらの辞書も、色々遊んでみると形態素の基準が怪しいことが多いし、ふりがなのデータが怪しい印象です。 精度を求めていくとやや限界があるかも。

JMndictFurigana, JMndictFurigana

JMndictFurigana, JMndictFurigana は有名ではないものの、かなり大きな辞書です。 JMndictFurigana は固有名詞を大量に含んでいるので、熟語生成に使うとしたら JMdictFurigana になります。 「気配り上手」など形態素ではなく用例がたくさん登録されている辞書なので、形態素解析には向きません。 生成される熟語は、実用上は使わなそうなものがそれなりにありますが、生成結果は N-gram, IPAdic, NAIST-jdic の次くらいにいい感じです。 熟語より用例に使える辞書ということでしょうか。 ただコスト値がないため頻出熟語のみを抽出といったことはできません。 この特徴は、熟語生成には少し使い勝手が悪いです。 あとライセンスにも注意が必要です。

SudachiDict

SudachiDict は非常に網羅性の高い辞書です。 ただ品詞 (特に固有名詞) についてはたまにノイズがある印象です。 ちなみに full は使うことがほぼないものばかりなので、生成に使ったのは small + core です。 使いやすい辞書であることは間違いありませんが、生起コストはあまり納得がいかない。 形態素に分離することで生起コストが歪むとかあるんだろうか? この問題が大きいため、熟語生成に関しては N-gram に軍配が上がります。 コスト値などを強く意識する必要がなく網羅性の重要な解析用途では、真っ先に利用を検討すべき辞書だと思います。 実例としては、こども漢字辞書 です。 何となく作ってみた辞書ですが、常用外漢字はとにかく用例が不足するとわかりました。 N-gram では頻度順に抽出できて自然な用例を生成できる一方、頻度が下がってくると若干信頼性に不安が出てきます。 SudachiDict を使って補完すれば、常用外漢字もサポートしやすく、とてもうまく機能しています。 同音異義語や表記ゆれ、そして正規化まできちんと扱っており、クオリティの高い辞書だと感じました。

熟語生成特有の問題としては「年生」が固有名詞または接尾辞、「一年生」が固有名詞として出現するため、少し排除が難しかったりします。 IPADic や NAIST-jdic では「年生」は接尾辞、「一年生」は普通名詞です。 接尾辞・接頭辞の完璧な合成は難しい (例えば接頭辞「黒」と「年生」はどう考えてもつかない) し、一般固有名詞は会社名が大量に混ざってくるので取り扱いが難しい。 あと「千島風露」みたいな珍しい花名が普通名詞に入ってきたりもするので、色々と排除の手段を考える必要があります。

UniDic

UniDic は辞書が大きく、語句のカバー率は N-gram より高いのが利点です。 IPADic より厳格な方式で作られた辞書ですが、生成される熟語はまず使わないものばかりが上位に来てしまいます。 二文字熟語はいい感じですが、三文字熟語はとても使う気になりません。 この問題はおそらく UniDic の「短単位」基準による構築が原因となっています。 IPADic では「小学校」を語彙として登録していますが、UniDic では「小+学校」として分離するため、「学校」のみ語彙登録されています。 つまり UniDic に登録されている三文字の語彙は、短単位の考え方から漏れた例外しか登録されていません。 まず使わない熟語ばかり生成されるのは、当然とも言えます。 熟語生成には向きません。

UniDic は中身もかなり他の辞書と違うので、注意が必要です。 まず語彙素を基本単位として、それが表層形として登場するという考え方で作られています。 表層形は書字形出現形の活用を受けたものということです。 かなり注意が必要なので「以下」という言葉を例に挙げてみます。 表層形は「下」という語彙素を持ち、「シモ」という語彙読みを持ちます。 UniDic の読みデータは語彙素に付随したものになっているので、表層形に対応する読みは「シモ」になります。 しかし当然ながらそのような読み方をすることはありません。 よって「以下」の読みを知るためには、語彙素 lemma と表層形が一致しているものだけを見ないといけない。 動詞などはさらに活用があるし、表記ゆれも多発します。 「表層形に付随する読みがない」のが原因で、特定ケースでは取り扱いが難しい辞書です。 あと色々なライブラリを作って比較するとわかるけど、ちょっとノイズ多いかな。

先に例として挙げた「一年生」問題はさらに複雑で、UniDic では「一 / 年 / 生」とすべて分離して扱います。 短単位だと確かに正しい気はするのですが、熟語生成に使える辞書ではないことが、こういったところからもわかるかと思います。 SudachiDict と同様に網羅性が重要なときか、短単位で処理したいときに使う辞書ですね。

mecab-ipadic-neologd, mecab-unidic-neologd

現状で最もサイズが大きい辞書は mecab-ipadic-neologd です。 mecab-unidic-neologd もおそらく中身は一緒なのですが、UniDic に合わせて作っているので数が違うのだと思う。 これらの辞書は、普段使う語彙を蓄積した辞書というよりは、未知語や新語を蓄積した辞書です。 冒頭で述べたように neologd にはほとんど同じ語彙で「〜」の数だけ違うものが大量に登録されています。 熟語生成には向きません。


熟語の読み推定の課題

熟語の生成は N-gram が一番良いとわかったものの、N-gram には読みデータがないという致命的な問題があります。 「それなら形態素解析器を使って読み推定すれば良いのでは?」と思われる方もいるかも知れません。 しかしここまでの説明で勘の良い人は気付いたでしょうが、三字熟語の読み推定はそう簡単ではないです。 巷でよく使われる Mecab、というより形態素解析器そのものが、読み推定に主眼をおいて作られている訳ではありません。 IPADic を使えば読みのデータが不足しますし、UniDic を使っても短単位に即した読みしかできません。 熟語の推定には問題が生じやすいことがわかります。 実際に試してみると、Mecab (+IPADic / UniDic) は、あまり使えないかな…。 これは三字熟語の読みは必ずしも短単位によって決まらないものが多くあるからだと予想できます。 mecab-ipadic-neologd も短単位での登録なので、精度が上がるとは思えません。 三字熟語は読みデータ自体がないので、諦めるか手動登録しかないかな。 ちなみに諦めました。

そのような調査をしている時に、形態素解析器だととにかく遅いことに気付きました。 単純な熟語の読み推定は案外利用シーンが多い気がして、形態素解析器を使わないほうが良いのではと思いました。 短単位の問題以外にも、「おととい」「いっさくじつ」のように複数の読み方がありながら、無視されてしまう問題もあります。 たかだか数文字の語彙に形態素解析器で読み推定するのはあまり効率が良いとは思えません。 色々考えた結果、パターンマッチングで上記の辞書のふりがなを O(1) で検索できるふりがな辞書を作りました。 辞書は marmooo/yomi-dict で配布しています。 今回はふりがな辞書として公開していますが、ほんの少しコードを書き換えれば IME 用の辞書もすぐに作れます。 真面目に説明すると話が長くなるので、詳しくはこちらのページを見てください

他にもデータチェックやデータ生成のために色々なライブラリを作っています。 熟語生成に興味のある人がいるかわかりませんが、興味があれば使ってみてください。

2020年11月17日火曜日

タッチ書道ドリルを作った

タッチ書道ドリル を作りました。 タッチ漢字ドリルタッチ習字ドリル では王道たる教科書体・明朝体を学びますが、 タッチ書道ドリル は一味違います。 プロの書道家の文字を、手軽にドリルで学べます。 書道もデジタル化の時代ですね。



ちなみにどんな文字が学べるかと言うと、特に格好良いのがこちら。もちろん他にもたくさんの文字種があります。 いざ作って表示させてみると、プロの文字は子供が真似るのに良いものもあれば、教育には向かないものもあり、玉石混交です。 ただいずれにしても、プロが書く字をゲーム感覚で学べるのって結構面白いんじゃないかな。



遊ぶときは タッチ書道ドリル と同様、芯先の細いスタイラスペンをおすすめします。 凝り始めるとキリがないので、安くて対応機種の多いものをまとめてみました。



様々なフォントに対応するために、技術的には面白い処理をしています。 フォントの太さは作者に委ねられており、毛筆・楷書・行書フォントは太さがかなりバラバラです。 また bold などの weight が存在しないフォントのほうが多いです。 バラバラの仕様のフォントに対して統一的な処理で解答を作るのは、それなりに頭を使います。 対応するアルゴリズムとしては、線の太さを推定して、擬似的な bold を canvas で実現することで、統一的に処理できる解答を内部で生成しています。 最初はまさかそのような画像処理が必要とは思っていなかったので、なかなか面白かったです。

処理の統一化はできたけど、書き順がないため完璧は難しく、採点は少し甘いかも。

2020年11月12日木曜日

タッチ習字ドリルを作った

タッチ習字ドリル を作りました。 基本機能はタッチ漢字ドリルと一緒ですが、 筆圧まで考慮するのでタブレットで習字ができます。



指でもできますが、おとなしく芯先の細いスタイラスペンやタッチペンを買ったほうが良いです。 芯先の太いタッチペンだと最初の反応までに時間が掛かりやすいこともあって、あまりうまく書けません。 芯先の細いスタイラスペンはやや割高ですが、習字セット+お絵描きセットを揃える気持ちで購入する必要があります。

ただ芯先の細いスタイラスペンって選び方が難しいです。 まずは対応機種をよく見て購入しないとまったく動かないで涙目になります (1敗)。 対応機種が広いものを選べば、のちのち書い直す必要がなくて良いんじゃないかな。 安くて良さげなものをまとめておきます。



スタイラスペンは凝り始めるとキリがなくて、筆圧感知の感度によって値段がとにかくブレるし、方式によって対応機種がどんどん減っていきます。 高いものによっては 1万円くらいする。 私はコスパの良いものが好きなので、上記をおすすめしときます。 ただ書き味は、ふつー…でしょうか。 芯先の太いタッチペンよりかは明らかに書き味は良いものの、 アプリの使い勝手としては「ちょっと筆ペンっぽいかな」くらいの精度です。 もっと高いペンだと凄いのかも知れませんが、試してません。 スタイラスペンはもちろんのこと、タブレットのほうも筆圧感知の方法がバラバラなので、確認していたらお金が溶ける。

リアルな習字感を求めている人は、 現時点ではやや高価なタブレットとスタイラスペンが必要になりそうです。 現状では若干お手軽感がないかも知れないアプリですが、 何年後かに手頃な値段でできると嬉しいな。

2020年11月1日日曜日

タッチ漢字ドリルを作った

タッチ漢字ドリル を作りました。 小さなアプリの割には、珍しく時間の掛かった作品です。 色々思いはありますが重要なことを最初に言うと、 統計的な出る順で覚え、自動採点をしてくれるドリルです。

採点はかなり真面目に作っていて、文字の大きさや書き順、書く位置、綺麗さをすべて考慮します。 手書き認識だと、文字が綺麗かどうかの判定は不安定であまり使えません。 自画自賛ながら割とよくできた採点システムになってると思います。 ちなみにトメハネは綺麗さの点では評価しますが、重視していません。 トメハネは元来それほど重視されておらず、文化庁も重視していませんが、現代の教師だけが重視しているのが現状です



なぜ作ったか=手書き指導は重要だけど大変

まずは文字を綺麗に書くという作業も、怠れば学力に大きく影響があると私は思っています。 色々な子を見ていると、勉強が苦手な子ほどこの基礎からできていないことが多い。 しかし文字を綺麗に「書かせる」のは思ってるより大変です。 書き順を見張るのは大変だし、口うるさくいうのもストレスを溜めるだけです。 先生が対処するのは思ってるよりずっと大変ではないでしょうか。 考えれば考えるほど、各自の努力が必要な領域だと思っています。 できるまでやるシステムこそが必要ではないでしょうか。

改善のために必要な力は、多くの場合は注意力と集中力であるように思います。 勉強が苦手な子や文字が汚い子ほど、文字を写す作業そのものに問題があることが多い。 なんでそんな右端に文字を書くんやとか、大きさがバラバラやんけ、みたいな。 私はこれ、文字を写すゲームのルールの勘違いによって起きている問題だと思っています。

とはいえ「幼児期の手先の器用さに個人差が大きい」問題があるし、 最近はパワハラとかも大変だろうから、口の出し過ぎにはやはり気を付ける必要がある。 真面目に何十人も見てたら大変だろうなあと思ったので、自動化してみました。 手先の器用さは強く要求しない一方、注意力/集中力は要求する採点をしています。

今後の予定

課題がない訳でもありません。 文章で問題を出題していないので、同音異義語や難問は出題しにくいです。 この辺の実装はかなり迷いましたが、今回作ったアプリは漢字を綺麗に書いて覚えることに主眼を置きました。 漢字単位で覚えるのと、熟語単位で覚えるのは少し違うと思い、難問の出題はしませんでした。

漢字の理解度にも色々あって、たとえば「家」に付随する漢字を綺麗に書けるようになっても、 テストをしてみると「家族」の漢字が書けないことは高頻度で起きそうです。 UI もごちゃごちゃになりそうで、漢字と熟語の練習は切り分けようと思いました。 一つのアプリに組み込み過ぎないほうが、実装的にも楽です。 今回のアプリには実装してませんが、実のところ検討に 99% くらいの時間が掛かってます。 そのうち追加アプリを公開したい。

タッチ漢字ドリル は、文字を綺麗に書く練習として復習気味に使うのがおすすめです。 今のところドリルの重要性が高い中学生まで対応しています。 ぜひ使ってみてください。

Tips

手書きアプリは画面のへんなところを触って誤爆する問題が起きがちですが、タッチ漢字ドリル はだいたい対処済みです。 ただ iOS は 4本指 / 5本指で触るとアプリを切り替える機能を OS が提供しています。 これだけは防ぐことができません。 気になる人は、[設定] → [一般] → [マルチタスクとDock] → [ジェスチャ] を無効にしてください。

高価なタッチペンやスタイラスペンは必要ありません。 芯先はなるべく細いもののほうが見やすくて良いですが、例えば以下で十分です。