FrontPage / Open Resources / normalizeNumexp

normalizeNumexp 数量表現・時間表現の規格化を行うツール

概要

normalizeNumexpは、日本語の文中に含まれる数量表現・時間表現を高速かつ正確に抽出、規格化するツールです。 具体的な入力・出力例は以下のようになります。自然言語文の入力に対し、抽出した数量表現・時間表現とその規格化表現を表示します。

$ normalizeNumexp
>一万円
numerical*一万円*0*3*円*10000*10000*
END
>2001年5月1日
abstime*2001年5月1日*0*9*none*2001-05-01*2001-05-01*
END
>魔女狩りは15世紀〜18世紀にかけてみられ、全ヨーロッパで4万人が処刑された
numerical*4万人*29*32*人*40000*40000*
abstime*15世紀〜18世紀*5*14*none*1401-XX-XX*1800-XX-XX*
END

数量表現を正確に認識すること、また具体的にどのような数量・時間を指しているのかを計算機に理解させることは、様々な言語処理アプリケーションで有用です。例えばこのツールを含意関係認識のタスクにおいて用いると、例の3つ目の文章と「魔女狩りは12世紀以降キリスト教会の主導によって行われ、数百万人が犠牲になった」という文章に矛盾が生じること(時間の範囲は正しいが、犠牲者数が違うため)を導くことができます。

normalizeNumexpには、以下のような特徴があります。

  • 高速な認識・規格化アルゴリズム
  • 高い認識精度:様々な形の数量表現が存在するweb上の文章を対象にした評価実験で高い精度と再現率を実現しています。詳しくは参考文献[1]をご覧ください。
  • 豊かな拡張性:パターン辞書を編集する事で(必要があればパターンに対応する関数も追加する事で)抽出・規格化できる表現を簡単に増やすことができます。
  • 正確に認識・規格化できる表現の例:「68、880円」「約三百九十億円」「12万8千円以下」「2007/9/2」「2:10」「12世紀末」「一九六〇年代」「3分の2」「秒速50センチメートル」「-50.0cm/s」「30~40個」
  • C++ヘッダによる実装。normalizeNumexpはすべてC++のヘッダファイルとして実装されています。pythonでの使用もサポートしています。

その他、詳しい説明については詳しい説明を参照して下さい。

更新履歴

  • normalizeNumexp 3.0 (2012-12-22) 株式会社Preferred Infrastructureのインターンシップ中に書き直したコード。更にシンプルな実装に。
  • normalizeNumexp 2.0 (2012-7-17) c++でリファクタリング。大幅に高速化&拡張性を高めました。
  • normalizeNumexp 1.0 (2012-4-29) 最初のリリース。pythonで実装。

ダウンロード

normalizeNumexp (github)

  • 現在のnormalizeNumexpのバージョンは3.0です。
  • normalizeNumexpは修正BSDライセンスで配布されます。

インストール

wafでビルドできます。別途uxpficommonがインストールされている必要があります。

$ ./waf configure
$ ./waf build
$ ./waf install

以下でインストールのチェックを行えます。

$ ./waf --checkall

利用方法

標準入力から一行一文として文字列を読み込み、規格化表現を出力します。規格化表現の読み方は詳しい説明をご覧下さい。

C++ライブラリ

normalizeNumexpはC++のライブラリを提供しています。また, SWIGを通して Python から利用することも可能です。以下はC++のサンプルコードです。

#include <iostream>
#include <string>
#include <normalize_numexp.hpp>

int main(){
	normalize_numexp::NormalizeNumexp nn("ja");
	std::string sentence("魔女狩りは15世紀〜18世紀にかけてみられ、全ヨーロッパで4万人が処刑された");
	std::vector<std::string> result;
	nn.normalize(sentence, result);
	for(int i=0; i<result.size(); i++){
		std::cout << result[i] << std::endl;
	}
}

コンパイル例

$ g++ check_normalizeNumexp.cpp -I/usr/local/include/ -I/usr/local/include/normalizeNumexp/ -lnormalize_numexp `pkg-config pficommon --cflags --libs ux --cflags --libs`

参考文献

  1. Is a 204 cm Man Tall or Small ? Acquisition of Numerical Common Sense from the Web. Katsuma Narisawa, Yotaro Watanabe, Junta Mizuno, Naoaki Okazaki and Kentaro Inui. In Proceedings of ACL 2013, August 2013. PDF, Supplementary material 1, Supplementary material 2

© Inui Laboratory 2010-2018 All rights reserved.