TIM Labs

2018年4月アーカイブ

Python_text_mining.jpg
Pythonによる
 
テキストマイニング入門


著者  山内 長承

発行  2017/11

サイズ  A5, 256頁  

ISBN  978-4-274-22141-5

価格  2,500円(本体)  


AI,AIととても騒がしくなり、AIの新刊書が次々と出ているが、その殆どがディープラーニングが対象で、とりわけ画像処理系の本が多い。

しかし、人間のビジネス活動、社会活動、学術活動などを考えると、画像処理関連だけではなく、人間を人間たらしめている言葉、テキストを扱わないわけにはいかない。

自然言語処理、テキストマイニングなどのタイトルの本も、多くはないが、それなりに増えている。

それで、Pythonでテキスト処理の説明をしている本として、本書を入手し、読んでみた。

内容は、

第1章 テキストマイニングの概要
第2章 テキストデータの構造
第3章 Python の概要と実験の準備
第4章 出現頻度の統計の実際
第5章 テキストマイニングの様々な処理例

となっているのだが、第3章までは、Pythonの基本的な説明が中心である。
そして、第4章が統計である。
そして、最後の第5章だけがテキストマイニングになっているのだ。

それでも、統計のために、形態素解析ソフトMeCabを使った例があった。

ということで、テキストマイニング自体の説明は、全体の1/3程度、70ページ位しかないのだった。

第5章の最後に一応Word2Vecの節が設けられており、簡単な説明がされていた。
つまり、やっと話が始まったと思ったら、本が終わってしまったのだ。

巷にはPythonの本が溢れているのだから、Pythonの基本や統計の基本的なことまで載せる必要はないと思う。
それに、ちょこちょこっと載せるだけになるので、とても中途半端なものになってしまう。

ということで、Pythonに慣れていて、統計の基礎も知っていれば、本書は一気に読み飛ばしてしまえる。
まあ、入門書だからそれで良いのかもしれないが、同じページ数で、テキストマイニングについてもっと丁寧な本にして欲しいところだ。

まず、以下の文字を見てみよう。

dakutenhandakuten-1.png通常はありえない場合がいっぱいである。
これを見ると、どうやらあらゆる文字に濁点( ゛ )と半濁点( ゜ )を付けることができるようだ。

どうやったらこんな文字(?)を表示できるかを説明する前に、なぜこういうことを調べることになったかの経緯を説明しよう。

ちょっと自然言語処理の練習をするのに、サンプルデータがいろいろあった方が良いので、このところ流行のWebスクレイピングでサンプル集めをした。
そして、集めた文章を、PythonのGUIであるTkinterのTextウィジェットに表示してみたら、こんな状況になってしまった。

dakutenhandakuten-2.pngブラウザ上やエディタ上では(a)のように見えていたのが、TkinterのTextウィジェット上では(b)の表示になってしまった。
半濁点が1つの文字として、1文字分の文字幅を確保して表示されてしまった。

つまり、「パ」が1文字ではなく、「ハ」+「濁点文字」の2文字になっていたからだ。
それでも、多くのブラウザやエディタでは、直前の文字に重ねて濁点・半濁点を表示していたのだが、一部の文字表示ソフトでは、何も考えず、別の文字として表示処理をしているということだ。

これは、Mac系でよく見られる現象であり、こういう状態のWebページに出会ってしまったのである。

上の (b)を(a)に変換する問題に取り組む前に、Pythonでの文字の扱いをちょっと練習しておこう。

今回は突然だが、文字コードの話をする。
というのは、ちょっとPythonでAI日本語処理らしきことをやっていたら、引っかかってしまったからである。
図に、3つの土を、そのUTF-8のコードと共に示す。

tsuchi-utf8.png引っかかった文字は土の異体字の一つの下図の右端の字である。
今では多くのソフトがUTF-8を標準として採用し、たとえ英語圏で開発されたソフトでも日本語処理に困らないことが多い。
しかし、それは、3バイトの漢字までで、4バイトになってしまう「土の異体字 」は扱えないことに出くわすことが多い。

最近、世のブームに引きずられてという訳ではないのだが、AI、言語処理系の何かをするとき、Pythonはツールが揃っているので使うことが多い。
Python自体は、4バイトの漢字も扱えるのだが、Pythonに非常にたくさんあるパッケージの中には扱えないものもある。

Pythonで文字処理をしていたのだが、GUIを用意しないと不便だなと思い、PythonのGUIツールキットのTkinterを使って簡単なGUIを作りつつあるところだ。
それで、用意してあるテキストファイルを処理しようとしたら、「土屋(異体字)」さんの情報を処理しようとしたところで止まってしまった。

実際には、長いテキストをTextウィジェットに貼り付けるメソッドを呼び出しただけなのだが、エラーが出てしまった。
直接Textウィジェットに、「????」を挿入したらとりあえず文字は表示されたのだが、その後テキストを編集してみたら、消去やカーソル移動が発狂してしまった。

要するに、UTF-8の4バイトコードに対応できていない。
地名、人名などを扱う、つまり事務処理、文字情報の整理などをしようとすると、UTF-8の4バイト文字に必ず遭遇してしまう。

UTF-8は、4バイトどころか、6バイト文字までサポートしているので、完全サポートというなら、そこまでちゃんとやらないとダメなのだが、ASCII文字だけで暮らしているエンジニアが多国語対応すると、こういうことになっているので、気をつける必要がある。

このあたり、東アジアの漢字圏のエンジニアが対処しないときちんとしたものにならないようだ。
昔は、データベースの対応もボロボロだったが、今は良くなっているのかな。






自然言語処理をやろうとすると、日本語の場合全ての文字がベタッとくっついているため意味のある最小単位の形態素(単語)に区切ってから処理する必要がある。
そのために、最初に日本語文字列の形態素解析を行う。
ChaSen, KAKASI, MeCab などがあるが、今はMeCabを使うことが多いのではと思う。
とりあえずフリーで使え、よく利用されているMeCabを紹介しようと思う。

インストールついては、環境によって違うので、MeCab公式サイトを参考にして欲しい。

ということで、さっそく使ってみよう。
実行例はUbuntu上である。
$ mecab 
吾輩は人工知能である。
吾輩	名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
人工	名詞,一般,*,*,*,*,人工,ジンコウ,ジンコー
知能	名詞,一般,*,*,*,*,知能,チノウ,チノー
で	助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある	助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
。	記号,句点,*,*,*,*,。,。,。
EOS

mecab[Return]とすると、入力を受け付けるので、何かを入れて[Return]すると、形態素解析した結果が示され、また次の解析対象文字列の入力待ちになる。
入力した文字列には下線をつけた。

このアーカイブについて

このページには、2018年4月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2018年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。