[PHP]中国語単語分割ライブラリ – guoba

Pocket

中国語の文字列を単語単位に分割するためのライブラリ guoba を公開します。

ダウンロード:guoba 1.03(ZIPファイル:3.60MB)

動作環境:PHP7.3.25にて動作確認。動作にはライブラリimdrが必要となります。同梱しているフォルダdatにはデータファイルが収められています。guoba.phpと同じフォルダに置いてください。

インストール先のフォルダ
├─guoba.php
├─dat
│  ├─emit.dat
│  ├─start.dat
│  ├─init.dat
│  ├─trans.dat
│  └─trie.dat
└─imdr.php

使用例:

require_once 'guoba.php';
$test = new guoba();

#メソッドcutで文字列を単語に分割する
$str = "北京一直是作为中国的首都在发挥作用";
$res = array();
$res = $test->cut($str);
print_r($res);

Array
(
    [0] => 北京
    [1] => 一直
    [2] => 是
    [3] => 作为
    [4] => 中国
    [5] => 的
    [6] => 首都
    [7] => 在
    [8] => 发挥
    [9] => 作用
)

Pythonで作られた中国語の形態素解析ツール「jieba(結巴)」を参考にしており、HMM(隠れマルコフモデル)で未登録語を認識します。

オンラインデモ:

オンライン辞書「北辞郎」の一括検索では、実際にguobaを使って単語分割を行っています。

メンバメソッド:

メンバメソッドについては以下を参照ください。

cut($str, $nohmm=FALSE)

中国語の文字列$strを単語に分割します。返値は単語の配列です。$nohmmにTRUEを指定すると未登録語の識別処理を行いません。

add($word, $pos, $freq, $force=FALSE)

単語データを渡してguobaに学習させます。引数は単語($word)、品詞($pos)、頻度($freq)です。デフォルトでは英数字のみからなる単語は無視されるため、英数字のみの単語も登録したい場合は、オプションの$forceにTRUEを渡します。

※$posに用いる記号については现代汉语语料库基本加工规范2003年版.pdfを参照してください。$freqは単語の出現回数です。

require_once 'guoba.php';
$test = new guoba();

#単語登録の例
$test->add("新冠", "j", "10");
$test->add("ATM", "n", "10", "TRUE");
$test->add("李腾", "nr", "5");

remove($word)

登録されている単語($word)のデータを削除します。

learn($fn)

単語分割済みのコーパスを読み込み、その内容を学習します。コーパスは北京大学の人民日報コーパスと同様の書式のテキストファイルとします(ただし、単語間の区切りは半角スペース1つのみ)。文字コードはUTF-8(BOMなし)とします。下記の例をご参照ください。なお、learnしただけでは学習した内容は保存されませんので、メソッドsaveを用いて学習内容を保存する必要があります。

中办/j 通知/n 要求/v 各级/r 党委/n 组织/v 干部/n 群众/n 认真/d 学习/v 悼念/v 邓/nr 小平/nr 同志/n 重要/a 文献/n
各族/r 人民/n 大/a 团结/an 是/v 我们/r 的/u 共同/b 法宝/n
2013年12月29日/t 和/c 30日/t ,/w 在/p 俄/b 伏尔加格勒/ns 市/n 火车站/n 和/c 无轨电车/n 上/f 连续/a 发生/v 了/ul 两次/mq 恐怖/a 爆炸事件/n ,/w 共/d 致使/v 34/m 人/n 死亡/vi ,/w 70余人/m 受伤/vi 。/wj
コーパスの例

※人民日報コーパスで使われているブラケットを用いて複合的な名詞を表す記法は使用しません。

save($fn)

メソッドaddやlearnで学習した内容をファイル($fn)に保存する。

jiebaとの違い

jiebaは、英数字など漢字以外の文字を処理しませんが、それでは「A股市场」のような単語を扱えないため、guobaでは英数字も処理対象としています。

また、HMMの学習データは、北京大学の人民日報コーパス(1998年1月の記事)のみとしています。jiebaは人民日報コーパス以外に小説のデータなどをICTCLASで分割し、学習データとして利用しているそうですが、誤ったデータを学習している危険もあるため、信頼性が高い北京大学のデータのみ利用しました。今後は北辞郎のシステムに組み込み、そこでのデータを学習していきます。

辞書データは、北辞郎のデータから繁体字や英字のみの単語を除き、品詞情報を変更した上で登録しています。

guobaの名前は「锅巴(おこげ)」から取ってます。jiebaを参考にさせていただいたので、なんとなく関係がありそうな名前にしたかったのと、単純に私がおこげのあんかけが好きだったためです。

今後の予定

品詞タグ付けをできるようにします。また、未登録語の識別がうまく動作しないことが多いので改善したいと思っています。

変更履歴

2021/10/15 ver1.03 非推奨の関数を使用している箇所があったため一部修正。
2021/10/15 ver1.02 未登録語の処理を見直し。メソッドremoveの戻り値を変更。
2021/10/13 ver1.01 メソッドcutの引数に$nohmmを追加し、未登録語の識別処理なしを選択できるようにしました。

コメントする

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください