「JavaScript で形態素解析もどき」を少し改良してみました。今までは漢字、ひらがな、カタカナ、英数字、記号などで分けていただけなので、
「今日はいい天気でした。」
という文章を解析すると
「今日|はいい|天気|でした|。」
となって、「はいい」などと変な区切りができたりしていました。
そこで、助詞で区切ってから、その後で漢字、ひらがな、などで分けるようしてみました。そうすると
「今日|は|いい|天気|で|した|。」
という感じで分けることができます。
ただ、
「とても大きい」
という文章だと
「と|て|も|大|きい」
となってしまったりで、問題もありますが。
JavaScript のソースはこんな感じです。
function SimpleAnalyzer() {
this.re = new RegExp;
this.re.compile("[一-龠々〆ヵヶ]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+|[a-zA-Z0-9]+|[,.、。!!??()()「」『』]+|[ ]+", "g");
this.joshi = new RegExp;
this.joshi.compile("(でなければ|について|ならば|までを|までの|くらい|なのか|として|とは|なら|から|まで|して|だけ|より|ほど|など|って|では|は|で|を|の|が|に|へ|と|て)", "g");
}
SimpleAnalyzer.prototype.parse = function(str) {
if (typeof(str) == "string") {
var s = str.replace(this.joshi, "$1|");
var ary = s.split("|");
var result = [];
for (var i = 0; i < ary.length; i++) {
var token = ary[i].match(this.re);
if (token) {
for (var n = 0; n < token.length; n++) {
result.push(token[n]);
}
}
}
return result;
}
};
使い方は
var str = "今日はいい天気でした。";
var s = new SimpleAnalyzer();
s.parse(str);
// ["今日","は","いい","天気","で","した","。"]
という感じになります。もっとこうした方がいい、ここはおかしいなどありましたらコメントなどいただけるとありがたいです。
分ける助詞などは
日本語プログラム言語「なでしこ」の助詞・単位のリスト
や
ボキャブラリ解析
などを参考にさせていただきました。
このページでこの JavaScript と MeCab のわかち書きを比較してみることができます。どれくらいの性能かわかるかも。比較するまでもないですが…。
ですが、助詞で分かち書きする機能、ちょっとだけうまく動いていないようです。
例えば、下の文を解析すると
MECAPIによって、JavaScriptだけで形態素解析ができるようになったので、JavaScriptで形態素解析もどきをする意味もあまりなくなったような気もします。
MECAPI|に|よって|、|JavaScript|だけ|で|形態素解析|が|で|きるように|なったの|で|、|JavaScript|で|形態素解析|もどきを|する|意味|もあまりなくなったような|気|もします|。
この様に、「もどきを」「もあまりなくなったような」などで切れていません。
それでは。
「も」が抜けていたんですね。やはり「も」も加えておいた方がいいですかね?
参考にしたサイトがなぜこの助詞で区切っているかほとんど考えもせずに、同じ助詞を使ってしまっているので、ちゃんと考えた方がいいですね。
> すみません。「に」や「の」や「を」では切っていても、もともと「も」では切っていないのですね。失礼しました。
考えがあって「も」で区切っていないわけではないので、教えて貰わなければ気が付かなかったです。感謝です。
まずは、日本語について勉強しないとですね。
「も」については元々リストにないのでそうなのですが、上の例だと、『|で|きるように|』の「に」、『|なったの|』の「の」、『|もどきを|』の「を」で分かち書きしないのもちょっと不思議です。
スクリプト自体に、思い当たるところがこちらではないので、全部疑問を投げっぱなしにする形になって申し訳ありません。
そもそもこのツールは形態素解析のような厳密な解析のために作ったのではなく、もともとはワードカウンタを目的としていました。
助詞での切り分けは、ひらがなの単語を抽出するためにどうすればいいかと考えて作ったものです。ちなみに助詞は、このエントリでも参考にされているサイトから拾ってきたような記憶があります。
あとJavaScriptを勉強したてで作ったのでソースがひどい……
なにか面白いアイデアがあれば改良もかねて実装したいと思ってます。
> 参考にしたサイトがなぜこの助詞で区切っているか……
助詞の単語の選定もそうなのですが、助詞扱いされる単語が連続した場合の処理などを考えてやれば、もう少し賢くなるような気がします。
これは区切り方が助詞の後でしか区切っていないからおかしくはないんです。
あくまでスクリプト的には、ですが。
でも、考えたら前後で区切るのが普通ですよね。
適当過ぎですね、すいません。
助詞のリストも含めて変更しておこうと思います。
walter さんにはいろいろ気付かせてもらって本当にありがとうございます。
自分で気付けって感じですけど…。
コメントありがとうございます。
まさか monado さんからコメントがいただけるとは恐縮です。
以前、ボキャブラリ解析ツールを見た時にこんな事が出来るんだ!と驚いた記憶があります。
その後、漢字、ひらがな、カタカナなどを抽出する正規表現を知って、形態素解析もどきを作ってみました。
しかし、ひらがなの単語がうまく抽出できなかったので、そういえば、前に見たボキャブラリ解析ツールはどうしていたのだろう?と思い出し参考にさせていただきました。
ありがとうございました。
> 助詞扱いされる単語が連続した場合の処理などを考えて…
なるほど。その辺をもっと改良すればまだ賢くなりそうですね。
厳密さを追求しても仕方ないようにも思いますが、改良できるところはしていこうと思っています。
>これは区切り方が助詞の後でしか区切っていないからおかしくはないんです。
そういう仕様だったのですね、勘違いしていました。申し訳ありません。
しかし、助詞の扱いを簡単なスクリプトでやっていくのはチューニングが大変そうですね。
http://www.geocities.jp/niwasaburoo/hosetu.html
ここの“§0-7 助詞の分類”にある助詞をただ詰め込んだだけでは、ひらがな部分がズタズタに分割されるだけでしょうし・・・。
陰ながら応援しています。
追記。「すもももももももものうち」をきちんと分割するMECAPIは恐ろしいですね。
助詞の前後で分けるか後だけで分けるかはもう少し考えた方がいいかな、とも思っています。
前後で分けると細かくなり過ぎてしまう気もしますし。
教えていただいたサイトは参考になりそうですね。いつもありがとうございます。
取り合えずこの助詞を参考にして分けてみようと思っています。
でも、ひらがなが分断され過ぎるというは確かにありますね。なかなか難しい。
MECAPI(MeCab)は「すもも(以下略)」もちゃんと解析出来るんですね。さすがですね。
辞書があるから出来るって事なのでしょうか?やっぱり。
まぁ、「もどき」にはそこまでは求めていないのでいいかと思っていますが。