normalizeNumexp 詳しい説明

対象とする表現について

数量表現、時間表現を以下のように定義します。(厳密な定義はまだできていません)

  • 数量表現:あるものの数量について述べている表現。
  • 時間表現:以下の3つの表現の総称
    • 絶対時間表現:時間軸上での絶対的な位置の表現
    • 相対時間表現:時間軸上での相対的な位置の表現
    • 持続時間表現:(時間軸に関係しない)ある持続した時間の量

normalizeNumexpはこのうち、表現の中に数量が含まれる表現を認識・規格化することを目的としています。例えば「20歳」「1月1日」「1ヶ月後」は対象としますが、「ハタチ」「元旦」「来月」は対象としていません。 また、認識は過不足なく行うことを目的としており、「およそ300人以上」という表現に対しては、表現全体を認識します。

規格化について

normalizeNumexpは、全ての数量表現・時間表現を以下のような規格化表現に変換します。

「表現タイプ, 表現, 文中での開始位置, 終了位置, 単位, 数量(時間)の下限, 数量(時間)の上限, オプション」

表現のタイプはnum(数量表現), abstime(絶対時間表現), reltime(相対時間表現), duration(持続時間表現)の4種類あります。 以下でこれらの分類について、また下限~上限の表記について説明します。

num(数量表現)について

下限と上限には、単純に数値が入ります。 単位については、基本的と思われる単位の統一は行っています(kgやグラムやトンのような表記は、全てgに直されます)

30キログラム
> numerical*30キログラム*0*7*g*30000*30000*」
> END
3人目
> numerical*3人目*0*3*人*3*3*ordinary」
> END

abstime(絶対時間表現)について

時間表現の下限・上限の表記はISO 8601にのっとった表記で表されます。 「1989年7月21日」「18世紀後半」「AM3:20」などが絶対時間表現となります。 これらを規格化すると、それぞれ以下のようになります。

1989年7月21日
> abstime*1989年7月21日*0*10*none*1989-07-21*1989-07-21*
> END
AM3:20
> abstime*AM3:20*0*6*none*03:20:XX*03:20:XX*
> END
18世紀後半
> abstime*18世紀後半*0*6*none*1751-XX-XX*1800-XX-XX*
> END

reltime(相対時間表現)について

「2時間前」「3年以上後」などが相対時間表現となります。 規格化表現は「絶対時間表現 + 持続時間表現」で表されます。

2時間前
> reltime*2時間前*0*4*none*XX:XX:XX,P-2h*XX:XX:XX,P-2h*
> END
3年以上後
> reltime*3年以上後*0*5*none*XX:XX:XX,P3Y*INF,P3Y*
> END
来年3月
> reltime*来年3月*0*4*none*XXXX-03-XX,P1Y*XXXX-03-XX,P1Y*
> END

duration(持続時間表現)について

「2時間」「3週間以上」などが持続時間表現となります。 持続時間表現の規格化形は、「P + 時間の量 + 時間の単位(年だったらY、月だったらM、日がD、時間がh、分がm、秒がs)」で表されます。

2時間
> duration*2時間*0*3*none*P2h*P2h*
> END
3週間以上
> duration*3週間以上*0*5*none*P21D*INF*
> END

アルゴリズムの詳細

ルールベースで実装しており、文中の数量を認識した後に、その数量の前後の表現と辞書に格納されているパターンを比べ、一致するパターンを抽出&規格化します。 若干の処理はしているものの、基本的に前後の文脈を考慮しない抽出処理になっています。これによる誤った抽出は、エラー分析にて考察しています。

辞書の拡張について

src/dic以下を自由に編集して下さい。辞書はjson形式で記述されています。

その他

漠然とした表現について

「約」「およそ」や「xx世紀中盤」といった表現の処理について。 normalizeNumexpではこれらの表現を「だいたいこれくらい」という値に変換しています。これらの表現が指す数量の範囲に対して、厳密な定義を行っているわけではありません。 例えば、「約100人」という表現は「70〜130人」として、「18世紀中盤」という表現は「1725年〜1775年」として規格化します。この値の正当性については議論されていません。

その他

数量表現ではない表現の知識を渡してやることが可能です。(「〜の五州が◯◯した」の「五州」は数量表現として取りたいが、「九州」は数量表現として取りたくない時、辞書に「九州」を追加します)

エラー分析

パフォーマンス実験における主な認識ミスを挙げていきます。認識ミス全体(87事例)のうちの割合を示しています。

  1. 単純な知識不足:23事例(26%)
    • 例:「9カウント」(カウントという助数詞が辞書に存在せず)
    • 例:「2008-11-05」(想定外の時間表現パターン)
    • このような例は、辞書に追記するだけで容易に認識が可能になります。
  2. 新たな処理を追記する必要がある表現:23事例(26%)
    1. パターン周りの処理を追記する必要がある事例 14事例
      • 例:「¥4500」数量表現は必ず数字の後ろに単位表現を持つと仮定していたため、このような表記は数量表現として認識できない。
      • 例:「Aug.1996」英単語に対応させる必要(この部分は数をもたない時間表現なので、今回対象としなくても良い? 定義が不十分です。。)
      • こういった場合は、辞書とソースファイル両方に追記する必要があります。
    2. 記号周りの処理を追記する必要がある表現(ピリオドの問題):9事例
      • 例:「2007.01.01」数と数の間にあるピリオドは小数点だと認識させているので、時間表現だと認識できない。
      • こういった処理は、システム側を改善させていくしか方法はありません。
  3. 表現の曖昧性への対応:37事例(43%)
    1. 固有名詞の誤認識:6事例
      • 例:「技能五輪国際大会出場」 ここでの「五輪」は固有名詞だが誤認識
      • 数量表現でない単語として辞書に登録することで無視することはできる、が、そうすると「五輪の菊」などの数量表現である「五輪」を認識できない。
      • 例:「一時帰国する」 時間の「1時」として誤認識
    2. 単位や表現タイプを誤認識する問題:6事例
      • 例:「2試合行なって1勝1分だった」 「1分」を時間だと誤認識
      • 例:「あと10年は戦える」 西暦の「西暦10年」と誤認識
    3. 人間の常識的知識が必要な問題(曖昧性??):25事例
      • 基本的に、文脈をみないと人間でも判断できないもの。人間でも確実にその量・時間を示していると言えない事例
      • 例:「2012」 人間なら西暦だとわかる
      • 例:「09/7/21」 人間なら「2009年」だとわかる
      • 例:「ナタリー・ガルビス(45)」 人間なら「45歳」だとわかる

以上より、 今後の課題としては以下の3つを考えています。

  1. 知識不足の解消
  2. 拡張性の向上
  3. 曖昧な表現を扱えるシステムの構築

補足・今後の予定

  • 数値をdouble型で格納しているため、丸め込みが起きることがあります。
  • 曖昧な表現への対応(例:3/5は分数か?日付か?)
  • 認識が弱い部分:SI単位系
  • MeCabによる解析結果を規格化に使用したい(ver2.0では対応)(例:「三日月」を「三日」として認識するミスをなくすため)

© Inui Laboratory 2010-2018 All rights reserved.