テキストとシステムと自然言語処理

# 言語処理に至る道

世の中にテキストを全く取り扱わないシステムはほとんどないと思われますが、例えば、「テキストを保存、表示するシステム」は言語処理をしているとは言えないでしょう。
この記事ではテキストを取り扱うシステムについて、一般的に言語処理に用いられるツールの出力を交えつつ、少しづつ掘り下げて言語処理とはどういう領域を取り扱うものかを私見としてまとめました。

## 大雑把まとめ

* 言語処理にはレイヤーがある
* レイヤーごとに扱う情報が異なる
* レイヤーごとに取得できた情報をまとめ上げると言語処理をするシステムが実現できる。


## 前提

本記事内では自然言語とはテキスト化された日本語の自然言語を指します。
新聞記事、教科書、法律文、人間の会話、SNSの発言などを想定しています。
構造やシステム的なフォーマット（XMLやJSON、表のような構造）がないものです。


## 自然言語処理の前に

どんなシステムでも自然言語は出てきますが、よくあるパターンとしてはテキストエリアに人間が読むためのテキストを入力、保存、表示すること、といったところです。

これはシステムが言語をとりつかうというよりは、画像や音声データのように単に再生するためであって言語自体を取り扱っているとは言い難いところです。

どういったところまで扱えば言語処理と大手を振って言えるのかは人によって判断が分かれると思いますが、よくあるシステムで実装される、入力文字の制限や入力可能な文字数の長さを制限するのは、言語処理ではなく単なる文字列への処理とでも言うべきものでしょう。

## 正規表現

それでも多少はシステムで自然言語を扱います。そういった場合の多くは正規表現で対応を行うと思います。
半角カナを全角カナに置換するとか、禁止文字を検出して警告を出す等です。

正規表現があれば、文字列から決まった部分の抽出や置換など **テキストとして表層に現れること** に対しては何でもできます。

しかし、逆に言うと正規表現では自然言語で **表層に現れた情報** までしか取り扱うことができません。
取り扱う文字列が名詞なのか助詞なのか、そもそも単語の境目はどこなのかそういった情報が使えません。

`すももももももももはもも`

と、書いてあっても、正規表現では太刀打ち出来ないでしょう。

というわけで、システムで言語を取り扱うために最初には形態素解析が広く利用されています。

## 形態素解析をする

テキストに形態素解析を行うことで、「単語区切り」「品詞」「原型」などの情報が活用可能になります。

日本語相手の形態素解析に最も用いられる`mecab` を使えば、なんでも言語処理っぽくなるのは、やっぱり強力なツールだからですね。
以下に `mecab`の出力を提示します。

``` mecab.output
$ mecab
すももももももももはもも
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
EOS
```

この通り、 `すもも` や `もも` という名詞と、 `も` や `は` という助詞で文が構成されていることがわかりました。

他の形態素解析機である [jumanppでの解析結果](https://tulip.kuee.kyoto-u.ac.jp/demo/jumanpp_lattice?text=%E3%81%99%E3%82%82%E3%82%82%E3%82%82%E3%82%82%E3%82%82%E3%82%82%E3%82%82%E3%82%82%E3%81%AF%E3%82%82%E3%82%82)でも似たような結果が取得できます。

形態素解析を用いて、自然言語から「単語区切り」「品詞」「原型」の情報を得ることで、

* 人名の読みを推測する
* 機械学習のための入力に利用
* 係り受け、述語項解析、格解析、固有表現抽出のための入力に利用
 
などの応用がされています。

形態素解析器によって、自然言語のテキストから見えない情報を取得できるセンサーを得ることができました。
テキストの表層に現れている情報よりも、強力な情報をシステムで取り扱うことができるようになります。

## 係り受け解析

形態素解析の結果から単語や品詞がわかったあとは、その結果を用いて単語についての関係を係り受け解析で取得します。

[cabocha](https://taku910.github.io/cabocha/) や [KNP](http://nlp.ist.i.kyoto-u.ac.jp/?KNP) を使うと係り受け関係がわかります。

係り受け関係がわかると、どの文節がどの文節にかかるかわかってきます。
`大きな望遠鏡で建物を見た。` と `望遠鏡で大きな建物を見た。` のcabochaでの出力結果を示してみます。
例えば `大きな` が係る先は、２つの文でそれぞれ `望遠鏡` と `建物` と全く異なります。 

以下のcabochaの出力の `chunk` の `link` と `id` を見れば係り先が読み取れます。

``` cabocha.out
$ cabocha -f3
大きな望遠鏡で建物を見た。
<sentence>
 <chunk id="0" link="1" rel="D" score="1.338385" head="0" func="0">
  <tok id="0" feature="連体詞,*,*,*,*,*,大きな,オオキナ,オーキナ">大きな</tok>
 </chunk>
 <chunk id="1" link="3" rel="D" score="-1.647059" head="1" func="2">
  <tok id="1" feature="名詞,一般,*,*,*,*,望遠鏡,ボウエンキョウ,ボーエンキョー">望遠鏡</tok>
  <tok id="2" feature="助詞,格助詞,一般,*,*,*,で,デ,デ">で</tok>
 </chunk>
 <chunk id="2" link="3" rel="D" score="-1.647059" head="3" func="4">
  <tok id="3" feature="名詞,一般,*,*,*,*,建物,タテモノ,タテモノ">建物</tok>
  <tok id="4" feature="助詞,格助詞,一般,*,*,*,を,ヲ,ヲ">を</tok>
 </chunk>
 <chunk id="3" link="-1" rel="D" score="0.000000" head="5" func="6">
  <tok id="5" feature="動詞,自立,*,*,一段,連用形,見る,ミ,ミ">見</tok>
  <tok id="6" feature="助動詞,*,*,*,特殊・タ,基本形,た,タ,タ">た</tok>
  <tok id="7" feature="記号,句点,*,*,*,*,。,。,。">。</tok>
 </chunk>
</sentence>
```

```
$ cabocha -f3
望遠鏡で大きな建物を見た。
<sentence>
 <chunk id="0" link="3" rel="D" score="-1.908594" head="0" func="1">
  <tok id="0" feature="名詞,一般,*,*,*,*,望遠鏡,ボウエンキョウ,ボーエンキョー">望遠鏡</tok>
  <tok id="1" feature="助詞,格助詞,一般,*,*,*,で,デ,デ">で</tok>
 </chunk>
 <chunk id="1" link="2" rel="D" score="1.363216" head="2" func="2">
  <tok id="2" feature="連体詞,*,*,*,*,*,大きな,オオキナ,オーキナ">大きな</tok>
 </chunk>
 <chunk id="2" link="3" rel="D" score="-1.908594" head="3" func="4">
  <tok id="3" feature="名詞,一般,*,*,*,*,建物,タテモノ,タテモノ">建物</tok>
  <tok id="4" feature="助詞,格助詞,一般,*,*,*,を,ヲ,ヲ">を</tok>
 </chunk>
 <chunk id="3" link="-1" rel="D" score="0.000000" head="5" func="6">
  <tok id="5" feature="動詞,自立,*,*,一段,連用形,見る,ミ,ミ">見</tok>
  <tok id="6" feature="助動詞,*,*,*,特殊・タ,基本形,た,タ,タ">た</tok>
  <tok id="7" feature="記号,句点,*,*,*,*,。,。,。">。</tok>
 </chunk>
</sentence>
```

単なる形態素解析の結果では、「何が大きいのか？」はわかりませんが、 `cabocha` の係り受け解析結果ではシステムで取り扱える形で大きい対象が判断できる材料が得られます。

## 他の技術的な要素
形態素解析の結果を用いて行われる処理には以下のようなものもあります。
例示した `cabocha` や `knp` のマニュアルを読んでみると面白いです。

* 固有表現抽出
* 格解析

## 終わりに

ここまでいろいろ書いてきましたが、この記事で書いてあるようなことの全ては言語処理を行う上でツールしかありません。
各レイヤーごとに、取り扱える情報やその精度も異なるので、実際にシステムを構築する上ではツールの出力を使うだけではなく、複数の機能の出力をまとめ上げて活用するシステムの開発が重要です。

というわけで、第３次AIブームですし、よりよい自然言語処理ライフを！！:santa: