わ〜い! 自然言語処理ごっこ

複数の小規模なコーパスを用いた、Web議論掲示板における投稿の自動分類の研究についてのブログ。

文末境界推定の手法

はじめに

現代の日本語では、「。」を文の切れ目、すなわち文末境界(=文境界)とするのが一般である。

この文末境界を利用して文書を文ごとに分割(=文分割)することで、例えば重要な文を選択して自動で文書を要約したり、文を自動で分類したりといったことが出来るのである。多分。

しかし悲しいことに、TwitterなどのSNSにおける日本語の文は「。」で区切られることはほとんどない。

ロクに句読点を書かないオタクや、むしろ「。」を読点に使っちゃうポエマーJDなど、彼らの文章をどうやって文ごとに分割するか、これを我々は考えていく必要があるのだ。

Case 1: 無意味に「。」で一度文を区切る

忘れた頃に、もう一度逢えたら。

仲良くしてね?

さよならも言えなくて ごめんね…

これは、本来ならば「忘れた頃に、もう一度逢えたら仲良くしてね?」で一つの文である。 ポエムなんかはTwitterではなく、変な色に加工した空の写真と一緒にInstagramへ投稿するべきである。

Case 2: 文の中に文がある

いや〜二郎って行った直後はもうしばらくいいや。ってなるけどやっぱまた行きたくなってきたわっつーか今から行きてえ

ここまで来ると人間でもちょっと文境界を推定するのに時間が掛かる。文の中に文がある。ラーメンを食うのは勝手だが、深夜にラーメンの画像を貼るのは止めていただきたい。

Case 3: 箇条書きする奴

りんご。みかん。バナナ。全部好き。

言うまでもなく、本来これは一つの文である。「りんごも、みかんも、バナナも、全部好き。」と書け。ちゃんとしろ。社会でやっていけないぞ。

とまあこのように、文の境界は必ずしも「。」ではない。この文末境界を自動で推定することを、この記事では考えていく。

文末境界推定の手法たち

手法1: 記号で区切る

単純に句点「。」「.」や感嘆符「!」や疑問符「?」で区切る手法である。

言うまでもなく、前述の問題を抱えているため精度が出ないので推奨しない。

括弧を識別することで、文中にふくまれている会話などを考慮することでCase2へ対策する方法もあるが、やはりCase1やCase3には対処できない。

手法2: SVMによる推定

SVMを用いた日本語書き言葉の文境界推定

文末境界推定問題について、形態素列に対する文をチャンクと考えたチャンキング問題として考え、SVMを用いて文末を推定する手法である。 内部的にはYamChaを利用しているようである。

ここで、それぞれの形態素は次のようにラベリングされる。

  • I:チャンク内(文内)
  • O:チャンク外(文外)
  • B:チャンクの先頭(文頭)
  • E:チャンクの末尾(文末)
  • S:その要素だけで1つのチャンク(文)

この論文によれば、手法1と手法2を比較した場合、F値は以下の結果になったとある。

単なるルールベースとこの手法を比較した場合
手法1
 
82.49%
手法2
 
93.47%

手法3: CRFによる推定

マイクロブログに対する文境界推定および係り受け解析

文末境界推定問題を、系列ラベリング問題として考え、CRF(条件付き確率場)を用いて文末を推定する手法である。 素性は単語・品詞・文字種を用いたとある。

この論文によれば、手法1と手法3を比較した場合、F値は以下の結果になったとある。

単なるルールベースとこの手法を比較した場合
手法1
 
70.8%
手法3
 
87.0%

おわりに

手法3については近々実装・公開してみたい。