日本語のテキストのかんたんな形態素解析(Morphological Analysis)を行うAppleScriptです。
日本語の形態素解析は、欠くことのできない重要な要素技術であるため、さまざまなプログラム(道具)を評価していきたいところです。
OS X 10.6以降、AppleScript自体の「words of」の機能が日本語のテキストにもまともに対応し、OS内蔵のMecabを使ってparseするように変わったようです。確証はないのですが、どうもほぼ同時にspotlightのインデックス作成のためにOS Xに導入されたMecabの機能を利用するようになったもよう。
ただし、AppleScriptで日本語のテキストに対してwords ofを実行した場合、読点「、」や句読点「。」はなぜか読み飛ばすため、これが気に入らないケースも出てきます。
さらに、OS X内蔵の形態素解析エンジンも、AppleScriptからはいじくりにくい(Blocks構文の記述が必要なので呼べない)ため、他の道具をいろいろさがしてみたくなります。
Mecabの作者の工藤 拓氏が作られた、JavaScriptだけで書かれた分かち書きソフトウェア「TinySegmenter」を、さらにiOS向けにObjective-Cで書き直した「TinySegmenter.m」(By Tatsuya Tobioka)を、私がMac用にほんの少しだけ書き直して(ARC環境下でビルドおよび実行できるよう、deallocのハンドラの内容をすべてコメントアウトしただけ)、Framework化した「JparseKit.framework」をでっちあげました(開発とかいうレベルではなく、単なる作業。数分で終わった)。
この、JparseKitを呼び出してみたのがこのAppleScriptです。
AppleScriptのwords of(たぶんMecab)の結果と並べてみましたが、ほとんど一緒です。辞書を持たないタイプの分かち書きエンジンらしいのですが、かなり驚きの出力結果が得られます。ただし、口語体の文章には弱い(原理上、ひらがなだけで書かれた文章にも弱そう)とのことなので気を付ける必要があります。
# 逆に、ASのwords ofが使っているロジックがこのTinySegmenterっぽいものである、という可能性も否定できなくなってきました、、、
呼び出しているObjective-Cのファイルも1つだけなので、ASで書き直して手を入れて使ったほうが(AddressBookから姓名を抽出して、形態素解析のために併用するとか)よさそうな気もします。
例によって、OS X 10.10以降用にビルドしたバイナリを用意しておきましたので、興味のある方はアーカイブを展開したあとで、~/Library/Frameworksに入れておためしください。
–> Download jparseKit.framework binary<
AppleScript名:TinySegmenterのじっけん |
— Created 2015-11-18 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version “2.4” use scripting additions use framework “Foundation” use framework “JparseKit” –tnantoka/TinySegmenter.m –https://github.com/tnantoka/TinySegmenter.m set aSegmenter to current application’s TinySegmenter’s alloc()’s init() set a1SegList to (aSegmenter’s segment:“これはテストですよ”) as list –> {“これ”, “は”, “テスト”, “です”, “よ”} set a2SegList to words of “これはテストですよ” –> {“これ”, “は”, “テスト”, “です”, “よ”} set b1SegList to (aSegmenter’s segment:“私の名前は長野谷です。”) as list –> {“私”, “の”, “名前”, “は”, “長野”, “谷”, “です”, “。”} set b2SegList to words of “私の名前は長野谷です。” –> {“私”, “の”, “名前”, “は”, “長野”, “谷”, “です”} set c1SegList to (aSegmenter’s segment:“このプログラムは、AppleScriptで記述してあります。”) as list –> {“この”, “プログラム”, “は”, “AppleScript”, “で”, “記述”, “し”, “て”, “あり”, “ます”, “。”} set c1SegList to words of “このプログラムは、AppleScriptで記述してあります。” –> {“この”, “プログラム”, “は”, “AppleScript”, “で”, “記述”, “し”, “て”, “あり”, “ます”} |