スポンサーリンク

NLPIR(ICTCLAS)で,中国語の文章を形態素解析・分かち書きするJavaプログラムを作る手順 …Windows日本語環境で動くサンプルコード

中国語のテキストを,フリーツールで形態素解析してみよう。


つまり,文章を単語に分解(分かち書き)して,
それぞれの単語の品詞を推定・分類する。

これをプログラムで自動的に処理させる。


日本語のWindows環境で,NLPIR(旧称はICTCLAS)という無料ツールを使えばよい。


難しい設定をせずに,Java・C・C#・Pythonなどのプログラミング言語で実現できる。

プログラムといっても,たった2〜30行をコピペするだけなので簡単だ。


下記の手順では,DLLをダウンロードし,JavaでDLLを呼び出している。

Eclipseは不要。

(JavaからDLLを呼び出すためにはJNIという技術を使うが,JDKがあれば何もしなくてよい。)

ダウンロードやJDKのインストールを除外すると,5分ぐらいで全て完了する。

中国語のテキストマイニングに役立ててほしい。


※実行結果の例↓



(ステップ1)作業用フォルダを作る

まず,自分の作業用ディレクトリ(★)を確保。

例えば

D:\hoge\

とする。フルパスに日本語が含まれないように。

(ステップ2)最新版のNLPIR本体をダウンロード

下記のサイトにアクセス。

NLPIR汉语分词系统
http://ictclas.nlpir.org/newsdownload...

  • NLPIR/ICTCLAS2015分词系统下载包
  • 软件环境: Windows,linux
  • 语言: C/C++/C#/Java
  • 发部日期: 2014-12-30

ダウンロードボタンを押下。

20141230101836_ICTCLAS2015.zipのダウンロードが完了する。


このzipを解凍すると,ICTCLAS2015 というフォルダが現れる。

そのフォルダ内に,Dataというフォルダがある。

この中には,NLPIRが動作するための辞書データが含まれている。


Dataフォルダをコピー。

自分の作業フォルダ★上に「data_file」というフォルダを新規作成し,その中に,コピーしたDataフォルダを貼り付け。

D:\hoge\data_file\Data

という辞書データフォルダが出来上がる。

(ステップ3)JNI用のDLLをダウンロード

次に,JNI用のDLLをダウンロードするために,下記のページにアクセス。

NLPIR汉语分词系统
http://ictclas.nlpir.org/newsdownload...

  • NLPIR-ICTCLAS2013-Win-64bit-JNI(u0416)
  • 软件环境: Win 64bit Java (※ソフトウェアの動作環境)
  • 语言: java (※言語はJavaである。)
  • 发部日期: 2013-04-16
  • NLPIR汉语分词系统(又名ICTCLAS2013),在Windows环境下,64位,供Java调用的API,具体见示例。 (※「中国語の形態素解析システムであるNLPIRもしくはICTCLAS2013。Windows64ビット環境で,Javaから呼び出すためのAPI。サンプル付き。」)
  • 说明:本下载包仅仅是补充包,还需要下载 NLPIR汉语分词系统(又名ICTCLAS2013版)下载包 ,替换其中的dll即可。(※「このダウンロードは補足的なものであり,NLPIRの本体をさらにダウンロードする必要がある。本体の中のDLLを,このDLLに置き換えること。」)

ダウンロードボタンを押下。

20130416090323_Win-64bit-JNI-lib.zip のダウンロードが完了する。


このzipを解凍すると,Win-64bit-JNI-lib というフォルダが現れる。

そのフォルダ内に,下記の2つがある。

  • NLPIR_JNI.dll ・・・NLPIRのネイティブメソッドが詰め込まれたDLLファイル。
  • kevinフォルダ ・・・DLL内のネイティブメソッドをJavaから呼び出すためのクラスファイルが入ったパッケージ。

この2つを,自分の作業フォルダ★上にコピー。

D:\hoge\NLPIR_JNI.dll

D:\hoge\kevin

となる。

(ステップ4)JNIを利用するJavaコードを作成

自分の作業フォルダ★上に,sampleというフォルダを作り,

その中に UseNLPIR.java というファイルを作成。


エディタで,UTF-8で開いて,下記の内容をペーストして保存。


UseNLPIR.java:

package sample;

import kevin.zhang.NLPIR;

// NLPIR(ICTCLAS)で,中国語の文章を
// 形態素解析・分かち書きするサンプル。
public class UseNLPIR {  

    public static void main(String[] args) throws Exception
	{
		NLPIR nlpir = new NLPIR();
		
		// 初期化。辞書Dataを読み込む
		if ( ! NLPIR.NLPIR_Init( "./data_file/".getBytes("utf-8"), 1 ) )
		{
			System.out.println("NLPIRの初期化に失敗。辞書データを確認してください。");
			return;
		}
		
		// 入力用のテキストファイル
        String file_in = "./text_file/utf8_orig.txt";  
		
		// 出力用のテキストファイル
        String file_out = "./text_file/utf8_result.txt";
		
		// 処理を実行
		nlpir.NLPIR_FileProcess(
			file_in.getBytes("utf-8"), 
			file_out.getBytes("utf-8"), 
			1
		);  
		
		// 終了
		System.out.println("終了しました。");
		NLPIR.NLPIR_Exit();
	}

}


これをコンパイルする。

あらかじめ,JDKのインストールを済ませておき,javacコマンドとjavaコマンドにPATHを通しておく。


作業フォルダでコマンドプロンプトを開いて,

javac -encoding UTF8 sample\UseNLPIR.java

で,コンパイル実行。classファイルが出来上がる。


これでNLPIRの実行環境が整った。

(ステップ5)解析対象のテキストを準備

プログラムに入力するための中国語テキストを準備しよう。


作業フォルダ★上に,text_file というフォルダを作成。

そのフォルダ内に,utf8_orig.txt というファイルを作成。

これは,プログラムの解析対象となるテキストだ。

UTF-8でエディタで開く。


中身には,自分が解析対象としたい中国語の文章を入力する。

題材としては,「人民日報」のような中国語ニュースサイトの内容をコピペするとよい。

人民网
http://www.people.com.cn/


たとえば記事を選んで,「中国の大気汚染があまりにもひどいので,政府が対策をしている」という内容のニュース記事を使ってみよう。

向污染宣战 须精准打击(一周绿评)--观点--人民网
http://opinion.people.com.cn/n/2015/0...


“向污染宣战”关键是落实--环保--人民网
http://env.people.com.cn/n/2014/0606/...


この文章をコピペ。

2月2日,环保部公布2014全国空气最差的10个城市名单,京津冀地区占了8席。值得注意的是,甘肃兰州连续数年稳定退出全国十大污染城市行列。根据兰州市前不久公布的监测数据,去年兰州空气质量优良天数达到313天,创下有监测记录以来最好成绩。   “兰州经验”中,精准治污、科学治污引人注目。在兰州市环境监察局监控中心,重点管控的排污企业烟囱、污水口等关键环节的实时情况清晰可见,各项排放数据不断刷新。重点企业里,由环保部门派出的驻厂监察员24小时对企业排污状况进行巡查。


今年世界环境日中国主题为“向污染宣战”,这体现了政府对治理污染紧迫性和艰巨性的清醒认识,也表明了政府决心。工业的发展带来与日俱筯的环境问题,然而我们一直叫喊的治污行动并未阻止这一趋势,所以,“向污染宣战”更要强调落实。   “向污染宣战”首先要摸清污染的老底。不管是安装在线监测设备还是实时通报空气质量,科技的发展足以让我们对污染源了如指掌。但硬件上的智能并不意味着污染的真相已被揭开,否则为何华丽的数据背后却是环境不断恶化的事实。到底还有多少失真的监测数据?还有多少暗排管埋在地下?还有多少烟囱深夜冒着鄢烟?摸不清污染的老底,治污就找不到病根。

テキストファイル内にUTF-8で保存しておく。

(ステップ6)解析を実行

作業フォルダ上で,コマンドラインから下記のコマンドを実行。

java sample.UseNLPIR

すぐに「終了しました。」というメッセージが表示される。


ここで,text_fileフォルダ内を見ると,utf8_result.txt というテキストファイルが生成されている。

エディタで開いてみると・・・

向/p 污染/v 宣战/vi 须/d 精/a 准/a 打击/vn (/wkz 一/m 周/qt 绿/an 评/v )/wky --/wp 观点/n --/wp 人民/n 网/n

2月/t 2日/t ,/wd 环保/n 部/q 公布/v 2014/m 全国/n 空气/n 最/d 差/a 的/ude1 10/m 个/q 城市/n 名单/n ,/wd 京/b 津/b 冀/b 地区/n 占/v 了/ule 8/m 席/qt 。/wj 值得/v 注意/v 的/ude1 是/vshi ,/wd 甘肃/ns 兰州/ns 连续/a 数/m 年/qt 稳定/an 退出/v 全国/n 十/m 大/a 污染/vn 城市/n 行列/n 。/wj 根据/p 兰州市/ns 前不久/t 公布/v 的/ude1 监测/vn 数据/n ,/wd 去年/t 兰州/ns 空气/n 质量/n 优良/z 天数/n 达到/v 313/m 天/qt ,/wd 创下/v 有/vyou 监测/vn 记录/n 以来/f 最/d 好/a 成绩/n 。/wj     “/wyz 兰州/ns 经验/n ”/wyy 中/f ,/wd 精/a 准/a 治污/vn 、/wn 科学/n 治污/v 引人注目/vl 。/wj 在/p 兰州市/ns 环境/n 监察/vn 局/n 监控/vn 中心/n ,/wd 重点/d 管/v 控/v 的/ude1 排污/vn 企业/n 烟囱/n 、/wn 污水口/n 等/udeng 关键/n 环节/n 的/ude1 实时/n 情况/n 清晰可见/vl ,/wd 各项/r 排放/vn 数据/n 不/d 断/v 刷新/v 。/wj 重点/n 企业/n 里/f ,/wd 由/p 环保/n 部门/n 派出/v 的/ude1 驻/v 厂/n 监察员/n 24/m 小时/n 对/p 企业/n 排污/vn 状况/n 进行/vx 巡查/vn 。/wj



“/wyz 向/p 污染/v 宣战/vi ”/wyy 关键/n 是/vshi 落实/v --/wp 环保/n --/wp 人民/n 网/n

今年/t 世界/n 环境/n 日/ng 中国/ns 主题/n 为/v “/wyz 向/p 污染/v 宣战/vi ”/wyy ,/wd 这/rzv 体现/v 了/ule 政府/n 对/p 治理/vn 污染/vn 紧迫性/n 和/cc 艰巨性/n 的/ude1 清醒/a 认识/n ,/wd 也/d 表明/v 了/ule 政府/n 决心/n 。/wj 工业/n 的/ude1 发展/vn 带来/v 与日俱筯/vl 的/ude1 环境/n 问题/n ,/wd 然而/c 我们/rr 一直/d 叫喊/v 的/ude1 治污/vn 行动/vn 并/cc 未/d 阻止/v 这/rzv 一/m 趋势/n ,/wd 所以/c ,/wd “/wyz 向/p 污染/v 宣战/vi ”/wyy 更/d 要/v 强调/vd 落实/v 。/wj     “/wyz 向/p 污染/v 宣战/vi ”/wyy 首先/d 要/v 摸清/v 污染/vn 的/ude1 老/a 底/f 。/wj 不管/c 是/vshi 安装/v 在/p 线/n 监测/vn 设备/n 还/d 是/vshi 实时/n 通报/v 空气/n 质量/n ,/wd 科技/n 的/ude1 发展/vn 足以/d 让/v 我们/rr 对/p 污染源/n 了如指掌/vl 。/wj 但/c 硬件/n 上/f 的/ude1 智能/n 并/cc 不/d 意味着/v 污染/vn 的/ude1 真相/n 已/d 被/pbei 揭开/v ,/wd 否则/c 为何/ryv 华丽/a 的/ude1 数据/n 背/v 后/f 却/d 是/vshi 环境/n 不断/d 恶化/vi 的/ude1 事实/n 。/wj 到底/d 还有/v 多少/ry 失真/vi 的/ude1 监测/vn 数据/n ?/ww 还有/v 多少/ry 暗/ad 排/v 管/v 埋/v 在/p 地下/s ?/ww 还有/v 多少/ry 烟囱/n 深夜/t 冒/v 着/uzhe 鄢/a 烟/n ?/ww 摸/v 不/d 清/a 污染/vn 的/ude1 老/a 底/f ,/wd 治/v 污/ag 就/d 找/v 不到/v 病根/n 。/wj

無事,中国語の文章が形態素解析され,分かち書きされている。

実行完了だ。


この出力結果の読み方は,ドキュメントになっている。

ステップ2でダウンロードしたNLPIR本体の中にある,ICTCLAS2015\doc 内の ICTPOS3.0.doc に,品詞分類表がある。

例えば 向/p とか “/wyz の意味を知りたい場合,

  • p 介词
  • wyz 左引号,全角

のように品詞が分類される。


このドキュメントはオンラインでも確認できる。

计算所汉语词性标记集ICTPOS3.0_百度文库
http://wenku.baidu.com/view/109063466...

補足

NLPIRをJavaで動作させるために,下記のページを参考にした。

NLPIR中文分词系统之Java接口的使用 - 竹叶青的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/zhyh1986/article...


Java以外にも,CとかPythonから呼び出すことも可能。

ICTCLASをpythonから使う - Argmax.jp
http://argmax.jp/index.php?ICTCLAS%E3...

  • 今はpipで入れられる: pip install pynlpir


[分词]NLPIR/ICTCLAS2014分词系统的C++ API 在Windows下初次使用 - 林羽飞扬 - 博客园
http://www.cnblogs.com/zhengyuhong/p/...

  • #include "NLPIR.h"

いちおうRuby用のgemも存在する。

写了一个中文分词的 gem――nlpir » 社区 » Ruby China
https://ruby-china.org/topics/12872

  • require 'nlpir' include Nlpir


nlpir | RubyGems.org | your community gem host
https://rubygems.org/gems/nlpir

  • "A rubygem wrapper of chinese segment tools ICTCLAS2014"


また,JNIのzip内に同梱されているサンプルコード(TestNLPIR.java)は,文字コードがGB2312で,秀丸エディタなどを使って編集できる。


が,そのサンプルコード内では,形態素解析の実行結果をコンソールにSystem.out.printlnしようとしている。

これは日本語版のWindowsでは無理。


コマンドプロンプト上でchcpで文字コードを変えようとしても,OSのデフォルトが日本語だとchcpが無効になる。

コンソールに出力された結果をリダイレクトしても,文字化けした部分が?になっており無駄だ。

コンソール上へのprintはあきらめよう。

GB 2312 - Wikipedia
http://ja.wikipedia.org/wiki/GB_2312

  • 中華人民共和国の国家規格として定められた簡体字中国語の符号化文字集合(いわゆる文字コード)で、主に中国大陸などで使われる。規格名は《信息交换用汉字编码字符集・基本集》という。GB0とも呼ばれ、GBコードといったときには、多くの場合この規格を指す。漢字を含む文字集合規格の基本となっていることや構造など、日本のJIS X 0208と共通点が多い。


windows7 - コマンドプロンプト起動時、自動的に文字コードをUTF-8にして日本語もちゃんと表示できるようにする方法 - Qiita
http://qiita.com/yui/items/86a455f948...

  • コマンドプロンプトのデフォルト文字コードは Shift_JIS chcp コマンドで文字コードを変更できる


CHCP = 現在の画面の言語設定(= 文字コード)を変更する - Windowsのコマンドプロンプト(bat,cmd) - to_dk notebook
http://tounderlinedk.blogspot.jp/2011...

  • 「無効なコードページです」 = 指定したコードページは非サポートです。

関連する記事:

Windowsで「kakasi」のコマンドを使い,日本語文章を単語に分解,ローマ字変換する方法 (kakasiで形態素解析するWindowsバッチのサンプルコード)
http://language-and-engineering.hatenablog.jp/entry/20150109/KakasiOnWindowsU...


中国語のWebサイトに,自動でピンインを付与する無料Webサービス&ブックマークレット (Webページの発音や翻訳を表示するオンラインツール)
http://language-and-engineering.hatenablog.jp/entry/20120709/AddPinyinToChine...


「自然言語処理論」の講義ノートPDF。形態素解析や文脈自由文法,知能機械による言語処理の扱い
http://language-and-engineering.hatenablog.jp/entry/20140511/NaturalLanguageP...


IT用語を中国語で覚えるための,単語の一覧表へのリンク集 (ピンイン付きのIT用語集)
http://language-and-engineering.hatenablog.jp/entry/20130524/ChineseWordLists...