Help us understand the problem. What is going on with this article?

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

概要

日本語の形態素解析(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]));
>> [时间短语, 名词, 副词, 形谓词, 语气词, 标点]

参考リンク

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした