MeCabの中国語分割辞書を作る話

広告

この話題も何度目になるかわかりませんが

MeCab的诸多优点以及它的通用性一直深深吸引着我,但是除了日文资料,相关的中文或英文资料相当匮乏,曾经尝试过基于MeCab的中文翻译文档以及代码中测试用例中的例子来训练一套中文分词系统,但是第一次以失败告终。这几天,由于偶然的因素又一次捡起了MeCab,然后通过Google及Google翻译发现了这篇日文文章《MeCabで中国語の形態素解析(分かち書き)をしてみる》,虽其是日语所写,但是主旨是通过MeCab构造一套中文(貌似是繁体)形态(中文分词+词性标注)分析系统,给了我很大的帮助。

用MeCab打造一套实用的中文分词系统

という中国語のエントリを見つけました。これは以前書いたエントリ「MeCabで中国語の形態素解析(分かち書き)をしてみる」を中国の方が読んで役に立ったと書いてくださったものです。あんな冗談みたいなエントリが少しでもお役に立てて何よりです。

中国語の形態素解析辞書をめぐる事情

趣味で20くらい中国語の形態素解析ツールを試してみたことがありますが、正直なところどれも十分な精度があるとは言えない状況でした。米ベイシス・テクノロジーの基本言語解析モジュールは商用でも使われているそうですが、Web上で評価版を使ってみたところこれもだめでした。例えば日本語でも「英語等の言語で」のように「など」を使うことがありますが、中国語でも同様な使い方をします。しかし現代中国語では「等」は「待つ」という動詞で使われることが多く、基本言語解析モジュールでは「など」の「等」を動詞として切り分けていたり、ほんのちょっとのテストでも間違いがボロボロ出ます。

個人的な仮説ですが、中国語の形態素解析ツールが十分な精度が出ないのは品詞タグが十分についていないからだと推測します。

例えば「数学是利用符号语言研究數量、结构、变化以及空间等概念的一門学科」という中国語の文章を分割してみます。これは中国語版Wikipediaのダンプファイルで最初に出てくるエントリ「数学」の冒頭部分で恣意的に選んだわけではありません。これを米ベイシス・テクノロジーの基本言語解析モジュールのdemoに入れてみると

のようになります。ここでは単に「等」の品詞を間違えたというだけではなく、品詞タグがVERBしかついていないことに着目したいと思います。

形態素解析の手法には色々ありますが、最近ではCRFでコストを学習した辞書を用いて、ラティス構造を作り最短パスを求めることで正しい解析結果を得るものが多いと思います。この辺の動作については「日本語形態素解析の裏側を覗く!MeCab はどのように形態素解析しているか」に詳しくありますので、御覧下さい。

MeCabでは単語自体の生起コストと連接コストを使います。生起コストは単語の現れにくさを表し、大きいと候補には上がるものの選ばれにくくなります。例えば「国立国会図書館」を「国立 国会 図書 館」と切るのか1つの単語で扱うかを考えてみます。辞書には「国立国会図書館」「国立」「国会」「図書」「館」のエントリがあるとします。「国立 国会 図書 館」という結果を得るためには

  1. [文頭]-<連接>-[国立]-<連接>-[国会]-<連接>-[図書]-<連接>-[館]-<連接>-[文末]の合計
  2. [文頭]-<連接>-[国立国会図書館]-<連接>-[文末]の合計

前者の総コストが後者より小さい場合には短単位の結果が選ばれます。もちろん「国立国会図書館」という語を辞書から削除してもいいのですが、ここでは説明のために両方あるという仮定をします。

日本語の形態素解析辞書でよく使われるipadicでは品詞の数は1315くらいあります。MeCabはbigramマルコフモデルで解析しますので、前の単語と後ろの単語のつながりを評価し、その組み合わせは1300^2 = 約170万にものぼります。ipadicのmatrix.defを見ると実際に170万通りもの品詞の組み合わせに1つ1つ連接コストが設定されています。unidicに至っては6000もの品詞がありますので、組み合わせは膨大です。

例えばソフトバンクの社長の名前「孫正義」を考えるとします。これはコンピュータに読ませると「まご・せいぎ」と読んだりするように上手く解析ができないケースが多々あります。しかし、品詞情報が正しく解析できていれば、普通名詞→普通名詞の「まご・せいぎ」より、姓→名の「そん・まさよし」のほうがありそうだとわかるはずです(名詞が名詞を修飾することはよくあります。高度→情報→処理→技術者→試験、など)。「孫」が「名詞・固有名詞・人名・姓」である場合「名詞・固有名詞・人名・名」の連接コストはかなり低く設定されていますが、逆に名→姓はそれほど低くありません。もしこれが単に「名詞」しか品詞タグがない場合はこうした細かい言葉の常識を捉えることができないことになります。

翻って中国語の他のツールの品詞タグを見ると極めて数が少ないのです。仮に50個の品詞しかないとしたら、bigram Markovモデルでは2500種類の連接コストしか持つことができず、これが原因で形態素解析ツールが中国語文法を十分に理解でないのではないかと思っています。

さきほど「品詞」と簡単に書きましたが、日本語の場合は単に「名詞・固有名詞・人名・姓」のような分類の他に動詞や形容詞は活用なども含めて品詞としています。しかし中国語にはそのような活用はありませんので、ipadicのように1300もの品詞を適切に設定することは難しいと思います。私は色々やってみましたが220程度の品詞を付けるのが精一杯でした。それでも著名な中国語の形態素解析ツールよりはずっと多くの品詞タグを持つことになり、それが精度の向上に貢献するはずです。

中国語の形態素解析辞書の設計

既存の形態素解析ツールより優れたMeCabの形態素解析辞書を設計するのに品詞タグの充実度が大事であるという仮説を立てました。その仮説に基づいてデータを作る場合には、中国語の言語学者の協力が必要でしょう。私の中国語は極めてお粗末ですし、またネイティブであっても自身の使う言語について熟慮したことのある人は少ないはずです。

私は自分で学習データを作るのを諦めて、Tagged Chinese Gigaword Version 2.0を使ってみました。普通に買うと4,000ドルしますが、私は正規に購入した人の協力を得て使うことにしました。ですので、作成した辞書については配布できません。あくまで手順を紹介するのみです。

このコーパスは

head LDC2007T03/data/cna/cna_cmn_200408
<DOC id="CNA_CMN_20040801.0001" type="story" >
<HEADLINE>
禽流感(Na) 過後(Ng) 羽絨(Na) 原料(Naa) 緊張(VH) 價格(Nac) 看漲(VH11)
</HEADLINE>
<DATELINE>
中央社(Nca) 台北(Nca) 一日(Nd) 電(Naa)
</DATELINE>
<TEXT>
<P>
由於(Cbba) 受(P02) 前(Nes) 些(Nfd) 時候(Nad) 在(P21) 中國(Nca) 內地(Ncb) 部分(Neqa) 地區(Ncb) 發生(VJ1) 禽流感(Na) 影響(VC2) ,(COMMACATEGORY)

のようなXMLフォーマットになっていますので、適切にパースして、テキストを得ます。テキストはタブ区切りで、カッコ内に品詞タグがついています。例えば「部分(Neqa)」のように名詞(N)の後にも細かい分類がありますので、これを品詞タグとして採用します。

学習データづくり

LDC2007T03コーパスをスクリプトで処理して

李	名詞,專有名稱,c,*,李,*,*,*,*,*,*
總統	名詞,a,b,*,總統,*,*,*,*,*,*
今天	名詞,d,a,bd,今天,*,*,*,*,*,*
過	動詞,C,1,*,過,*,*,*,*,*,*
農曆	名詞,a,d,*,農曆,*,*,*,*,*,*
生日	名詞,a,c,*,生日,*,*,*,*,*,*
,	符號,COMMACATEGORY,*,*,,,*,*,*,*,*,*
EOS
多	名詞,數量定詞,*,*,多,*,*,*,*,*,*
位	名詞,f,a,*,位,*,*,*,*,*,*
出席	動詞,C,2,*,出席,*,*,*,*,*,*
執政黨	名詞,a,c,*,執政黨,*,*,*,*,*,*
中常會	名詞,專有名稱,a,*,中常會,*,*,*,*,*,*
的	副詞,的之得地,*,*,的,*,*,*,*,*,*
中常委	名詞,a,b,*,中常委,*,*,*,*,*,*
都	副詞,a,b,*,都,*,*,*,*,*,*
當面	副詞,g,*,*,當面,*,*,*,*,*,*
向	介詞,62,*,*,向,*,*,*,*,*,*
李登輝	名詞,專有名稱,a,*,李登輝,*,*,*,*,*,*
拜壽	動詞,B,11,*,拜壽,*,*,*,*,*,*
,	符號,COMMACATEGORY,*,*,,,*,*,*,*,*,*
EOS

トレーニングデータを作成します。

続いて辞書データはこのトレーニングデータをsort | uniqすれば作れますが、巨大データのソートは時間がかかるため、Set(集合)に放り込むことで重複のない辞書を作成しました。

設定ファイルづくり

学習データと辞書データができたら、mecab-dict-indexを実行して学習用バイナリ辞書を作成し、続いてmecab-cost-trainを実行してCRFパラメータの学習に進みますが、ここで非常に多くの苦労をしました。

MeCabは大変よくできているツールですが、エラーメッセージが見にくく、何が問題であるかわからないことが多々ありました。Format errorとか、cannot rewriteなんとか山ほど出てきました。その都度、MeCabのソースコードを追いかけて何が原因で止まっているのか調べて、それでもわからず悩むこともありました。

ありがちなエラーとしては、学習データが間違って生成されていたことです。1行で1つのセグメントを表すはずが、なぜか改行が入らず連続して書かれていたとか、謎のエラーがありましたが、データ量が多いのでなかなか気づかず大変でした。

意外なところではchar.defなどを設定していなかったために起きた(ように思われる)エラーもありました。学習データの途中で

cannot rewrite pattern: *

のような謎のエラーが出たことがあります。ソースにprintfデバッグ仕込んでどこの行を処理しているときにこのエラーが出るのか調べましたが、ぜんぜん原因がわかりませんでした。該当のセンテンスだけの短い学習データを作成して実行しても止まるのを確認し、1行ずつ短くしてどの行を削ったらエラーが出なくなるのか確認することで、最終的に問題の行を特定しました。1行だけの学習データでもこのエラーで止まります。しかしその行を見ても何が問題かまったくわかりません。

結局、char.defを設定することでエラーが出なくなったので、文字種の問題ではなかったかと推察しています。その他、unk.defも作成する必要がありました。char.defで設定した文字種に対応したunk.defが必要になりました。

MeCabの辞書づくりに関するエントリはたくさんあるのですが、1から辞書を作っているエントリはあまりなく、大抵はちょっと単語追加してみました程度なので、本格的に設定ファイルをいじっているものは多くないのです。unidicのマニュアルはやや参考になりましたが、feature.defやrewrite.defの細かいことはわかりません。

Yahoo!の形態素解析をMeCabで無理やり再現してみる」も全体の流れを確認するのにはとても役に立ちましたが、細かい設定についてはここからは読み取ることができませんでした。

オリジナル辞書/コーパスからのパラメータ推定」が唯一の情報源と言っていいと思いますが、それでも不明点は多くありました。どのようにfeature.defを書くかなどはここだけでは十分には理解できませんでした。例えば “UNIGRAM W2:%F[0],%F?[1]/%F[6]” というテンプレートについて、%F[6]は6番目の要素であるのは書いてありますが、”/”が何のためにあるのかなどは不明のままでした。CRFそのものを理解すればわかるのかも知れません。

雑感

MeCabは大変優れたツールで、できあがった辞書を使って色々するのは素人でも簡単ですが、辞書づくりからやるとなるとその筋の専門家しかできないようなハードルの高さがあります。ドキュメントの少なさもそれに拍車をかけます。

書いても売れないのでしょうが、もしMeCabの詳解マニュアルのようなものを書けばごく一部からは熱烈に歓迎され、その分野では有名人になれるかも知れません。できれば日本語だけでなく、英語や中国語訳も付けるといいでしょう。中国語は非常に多くの人が使用する言語ですが、そのツールとなるとあまり発達していないのは、日本人が情報を日本語でしか書かないからだと思います。

それと同時にMeCabをベースに、エラー対策をわかりやすくしたり、設定ファイルを簡単に作れるように変更を加えたバージョンを作るのも大事かも知れません。

ともあれ現状では中国語の形態素解析は、中国語という言語自体が重要な言語にもかかわらず、商用ツールでも大したことがない(言っちゃった)状況にあるので、誰かまともな形態素解析ツールを作ればその分野の有名人になれるでしょう。その際にはツールの説明を、日、英、中など複数言語で書いてGitHubあたりに置いておけば星がいっぱい付くと思います。有名人になれば就職に有利になるなどのメリットがあるかも知れません。

機械学習には正確なトレーニングデータが不可欠です。コーパスにはライセンスの問題がつきまといますので、できればトレーニングデータを自分自身で作るほうがよいでしょう。upworkなどのフリーランスを探すツールがありますが、中国国内にも同様のサービスはきっとあり(中国は大抵自分で作っちゃう)、そこでうまく頼むことができれば比較的リーズナブルなコストで人手によるコーパス作成ができるかも知れません。

品詞タグの定義、分割ルールの作成などは専門家が必要です。まずはその人に一定の時間を使ってもらい、詳細な中国語の(名詞・固有名詞・地域・国名のような)品詞タグの階層やその他CRFの素性に使える情報を数百種類作ってもらいます。続いて、ネイティブのアルバイトを雇います。upworkで言語関連を探すと翻訳ばかり出てきて時給も20ドルとか高いですけど、中国国内のバイト探しツールでもあれば安くやってくれるかも知れません。北京のアルバイトの時給が3ドルくらいだとか聞いたことがありますので、田舎の文系大学生を時給5ドルとかで雇うことができれば、数千ドルのコスト投下でトレーニングデータが作れると思います。ルールに従って文章を分割してタグを付けるだけであれば、几帳面な性格であれば高校生でもできると思います。日本でも地方だと時給700円台でバイトしている人もいますから、ドルに直すと6ドル程度ですから、中国国内のバイト市場においては、在宅で好きなペースでできて時給が日本のアルバイトと同じくらいなら悪くない話だと思います。

日本円で50万円投下して世界一の中国語形態素解析ツールを作ったとして、どのくらいのリターン(お金だけではなく、知名度など)が得られるかは未知数ですが、どなたかやってみませんか?

続くかも知れない。