親です。

子ども産まれたんで育児とかについて書きます。映画とか心理学とかITとかの趣味についても書きます。

【Python】自然言語処理わけわかんねえからまとめる。

どもっす。自然言語処理のまとめ。
『入門 自然言語処理』(オライリー)と『自然言語処理の基礎』(コロナ社)、あとはこのページとかを元に情報を整理する。なお今回のブログの各章は書こうと思えばそれだけで一本ブログ書けそうなので、どんな論点が存在すんのか? ってポイントだけ簡単に押さえておく。そうすれば自然言語処理で何ができるのかとか、どんなことが課題なのかとかをとりあえず把握できて、後からスコープを限定して勉強ができる。
(ちなみに、『入門 自然言語処理』はデータの活用方法的なところまで書いてくれているが、『自然言語処理の基礎』は解析のアルゴリズム的なところがメインになっている。なんかよう分からん数式とかも出てきてよう分からんな?と思うけど、それなりに面白い。)

自然言語処理_処理の流れ

()でくくってあるところは『自然言語処理の基礎』で語られているところ。他はだいたい『入門自然言語処理』から。

前処理

  1. 解析対象のテキストを見つける
  2. 生テキストの処理(形態素解析①)

自然言語処理のところ

  1. 単語の分類とタグ付け(形態素解析②)
  2. テキスト分類の学習
  3. テキストからの情報抽出
  4. 文構造の分析(構文解析
  5. 素性ベースの文法の構築
  6. 文の意味の解析(意味解析)
  7. 言語データの管理
  8. (文脈解析)

その後

  1. データマイニング的なことをする。

それぞれ解説

解析対象のテキストを見つける

解析したいテキストをどう見つけるか? んなもん好きにしろい、というところだが一応あげておく。電子ブック、WebスクレイピングによるHTML情報の取得、検索エンジンの結果、RSSフィード、ローカルファイルからの読み込み、PDFやMSWordなどバイナリフォーマットから、ユーザからの入力、などなど。

生テキストの処理(形態素解析①)

生のテキストを手に入れたからといって、そのままでは分析できない。まず行われるのが形態素解析だ。
形態素解析ってのは、文章を形態素っていう最小単位に分割(トークン化)し、それぞれの品詞を判別(次の章で説明)して、単語の原型を取得することだ。文章が単語レベルに分割されていればどんな言葉が書かれているのかプログラミングで抜き出せるし、単語の出現頻度がわかったりする。そんな感じで、活用可能。
たぶん例を見てもらった方が早いから、コードをのせる。

import MeCab

text = 'たぶん例を見てもらった方が早いから、コードをのせる。'
m = MeCab.Tagger()
m_text = m.parse(text)

print(m_text)

んで結果がこれ。

たぶん    副詞,一般,*,*,*,*,たぶん,タブン,タブン
例 名詞,一般,*,*,*,*,例,レイ,レイ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見 動詞,自立,*,*,一段,連用形,見る,ミ,ミ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
もらっ   動詞,非自立,*,*,五段・ワ行促音便,連用タ接続,もらう,モラッ,モラッ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
方 名詞,非自立,一般,*,*,*,方,ホウ,ホー
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
早い  形容詞,自立,*,*,形容詞・アウオ段,基本形,早い,ハヤイ,ハヤイ
から  助詞,接続助詞,*,*,*,*,から,カラ,カラ
、 記号,読点,*,*,*,*,、,、,、
コード   名詞,一般,*,*,*,*,コード,コード,コード
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
のせる   動詞,自立,*,*,一段,基本形,のせる,ノセル,ノセル
。 記号,句点,*,*,*,*,。,。,。
EOS

便利。ちなみにこういう風に単語を分割できるのは、言語処理用のライブラリ(今回ならMeCaB)が内部に辞書を持ってるから。そこで検索かなんかしてるっぽい。案外ゴリゴリ系だ。

単語の分類とタグ付け(形態素解析②)

形態素解析ではトークン化以外にも色々やってる。それが単語の分類とタグ付けだ。さっきの処理結果を見てもらえば分かるが、分割された単語には品詞の情報(品詞タガー、POSタガー)がついている。
これらは品詞ごとに色々利用方法があるっぽい。
それと、自動タグ付けなるものがあるらしい。え? 品詞タグはそら自動でつくでしょ、と思ってしまうんだがどういうことなんだろうか。またここはいつか読み込む。

テキスト分類の学習

対象のテキストがどんなテキスト(新聞記事だとかブログ記事だとか小説だとか)なのか、パターンを検出する。これは機械学習的なやつ。『入門 自然言語処理』では検出パターンの発見方法、それを自動的にこなすための言語モデルの構築、そのモデルから言語に関する何を学ぶことができるか、を整理してる。

パターンの発見方法ーー教師あり学習

「分類器が入力に対する正しいラベルを含んだコーパスを使った訓練に基づいて構築されたもの」を教師ありの分類器と呼ぶ。うーんつまり、テキストがどんなテキストなのかを分類する分類器があり、そいつにはまず学習をさせなきゃならない。んで、学習に使うコーパス(たくさんの文章)にあらかじめタグがつけられていれば、教師ありってことかな。
この分類のタスクにはいくつかあり、 1. マルチクラス分類 1. オープンクラス分類 1. 系列分類 など。『入門 自然言語処理』にはこれらが名前だけ紹介されてるけど、詳細な部分は省かれている。機械学習の本とかで勉強しよう。
この教師あり学習で分類できる事柄の例と、その活用方法についても別途勉強する必要がある。
たぶんここはかなり深いし面白いところだ。

テキストからの情報抽出

自由気ままに書かれたテキストから、どう情報を抜き出すかについて。情報抽出の際には事柄の「実体と関係」に注目する必要がある…って何言ってんだから分かんないんだけど、エンティティ−リレーションモデルみたいなのがDBにあった。つまり、データベースみたいな感じに正規化された関係性に注目せよ…みたいな話かな?

文構造の分析(構文解析

文構造をどのようにデータとして表現するか、ということ。構文木ってやつを使う。また、それをどうやってプログラミングするのかについて。
文脈自由文法ってやりかたがあるらしい。

素性ベースの文法の構築

文脈自由文法でダメなところを素性構造によりうんたらする。これをどうプログラミングするか、どんな種類の言語的パターンや文法生成規則を扱えるか。

文の意味の解析(意味解析)

意味をどう表現するか。うーむ。

言語データの管理

コーパスの設計、構築、管理について。コーパスってのは教師あり学習に使ったりできる見本みたいな文章データで、解析対象をうまく代表できる文章であるほど解析の精度があがるよ。

(文脈解析)

前後の文から文脈を得る! みたいなの。よくわからんね。

以上。これから各章をよく見ていって、学習する。