LoginSignup
1

More than 3 years have passed since last update.

FNLPでMecabのような中国語の形態素解析

Posted at

概要

日本語の形態素解析(MeCab)のようなことを中国語でもやりたいのでFNLPを利用する

環境

OS : Windows7 64bit
言語: Java8
IDE: Ecplise4.8.0

目的

OpenNLPでMeCabのような英語の形態素解析と同じ

日本語の文章をMecabにかけて得られる「形態素」「品詞」「基本形」を中国語でも行いたい
オープンソースの「FudanNLP(FNLP)」を利用して、中国分から「形態素」「品詞」を取得する

目次

  1. 中国語の事前知識
  2. Javaの実装
    1. 準備
    2. 分かち書き
    3. 品詞分解

1. 中国語の事前知識

文字は2種類

  • 簡体字と繁体字

本記事では、簡体字の文章に限定して考える

時制がない

  • 過去、現在、未来は文脈で判断する
  • 過去形: 我昨天去了上海
    • 私は昨日上海へ行った
  • 現在形: 我去上海
    • 私は上海へ行く
  • 未来形: 我明天要去上海
    • 私は明日上海へ行かなければならない

このため本記事では、中国語の形態素は全て「基本形」で取得できるものとして考える

2. Javaの実装

1. 準備

直接MavenRepository内のfnlp-coreをpom.xmlで指定するとエラーになる為、一度ソースコードをビルドして、fnlp-core-2.1-SNAPSHOT.jarファイルを作成する

※ fnlp-core-2.1-SNAPSHOT.jarの作成は、FNLPで中国語形態素解析の「ダウンロード」「ビルド」を行う

mavenプロジェクトを作成し、作成したfnlp-core-2.1-SNAPSHOT.jarファイルをdicフォルダ配下に配置する

pom.xmlに以下を追加する

<dependency>
    <groupId>net.sf.trove4j</groupId>
    <artifactId>trove4j</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>commons-cli</groupId>
    <artifactId>commons-cli</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>org.fnlp</groupId>
    <artifactId>core</artifactId>
    <version>2.1</version>
</dependency>
<dependency>
    <groupId>org.fnlp</groupId>
    <artifactId>core</artifactId>
    <version>2.1</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/dic/fnlp-core-2.1-SNAPSHOT.jar</systemPath>
</dependency>

また、https://github.com/xpqiu/fnlp/releases で公開されているモデルファイル3つ(pos.m, seg.m, dep.m)をダウンロードし、dicフォルダに配置する

2. 分かち書き

CNFactory factory = null;
// モデルファイルのパスを指定し、形態素解析器を呼び出す
try {
    factory = CNFactory.getInstance("./dic");
} catch (LoadModelException lme) {
    lme.printStackTrace();
}
String message = "今天天气真好啊!";
String[][] tokens = factory.tag(message);
System.out.println(Arrays.asList(tokens[0]));
>> [今天, 天气, 真, 好, 啊, !]

3. 品詞分解

CNFactory factory = null;
// モデルファイルのパスを指定し、形態素解析器を呼び出す
try {
    factory = CNFactory.getInstance("./dic");
} catch (LoadModelException lme) {
    lme.printStackTrace();
}
String message = "今天天气真好啊!";
String[][] tokens = factory.tag(message);
System.out.println(Arrays.asList(tokens[1]));
>> [时间短语, 名词, 副词, 形谓词, 语气词, 标点]

参考リンク

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1