pythonでテキスト解析用環境作って単語数の分析してみた。

いろんなところで使い古されているテキストマイニングなぞを今更ながらやってみようかと思って環境を構築してサンプルプログラムを作ってみました。これも先人が色々されているMecabでやってみたです。もはや時代遅れ以外の何物でもないです。
環境はHyper-V上にUbuntu18.04LTSServer立ててそこでpython3.6にて構築してみた。まぁずぶの素人が3日ほど格闘して何とか形になりましたよ。後はここから流行りのWordCloudとかに持って行ければ面白いんだろうなぁ。ひとまずは単語の出現数を降順で並べるだけまでを先に実装しました。といってもほとんどコピペです。

1.環境構築
 そこまでてこずらないかと思いきや、Cabochaのインストールに手間取ったのと
 aptに時間がかかりまくったのが鬼門でした。

◆参考サイト
 https://qiita.com/furipon308/items/0d626f4a943c99fe32c6
 http://tech.wonderpla.net/entry/2017/10/10/110000
 https://mojitoba.com/2019/01/29/solve-error-installation-mecab-python3/
 http://godan09.hatenablog.com/entry/2017/06/24/152201
 https://qiita.com/Sylba2050/items/4aaff94769726b8c9581
 https://www.trifields.jp/install-cabocha-in-ubuntu-1038
 https://qiita.com/woody-kawagoe/items/09c0f89a55701bcf72eb
 https://qiita.com/january108/items/85c80769ea870c190eaa
 https://qiita.com/segavvy/items/2f686cfb0065c8cbe698
 https://kakubari-ryusei.hatenablog.com/entry/2017/10/04/192447
 https://qiita.com/Sak1361/items/47e9ec464ccc770cd65c
 http://yut.hatenablog.com/entry/20130215/1360884220  
https://datumstudio.jp/blog/python%E3%81%AB%E3%82%88%E3%82%8B%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%89%8D%E5%87%A6%E7%90%86%E5%82%99%E5%BF%98%E9%8C%B2
 https://qiita.com/Anharu/items/b558ab64430ff1c09b89
 
◆実際の手順
(1)形態素解析エンジンmecab準備(aptにかなり時間がかかる)
・インストール
$ sudo apt-get -y install mecab mecab-ipadic-utf8 libmecab-dev python-mecab
$ sudo apt-get -y install python-pip python3-pip
$ sudo apt -y install swig
$ sudo pip3 install mecab-python3 --proxy=proxyaddr

・動作確認
$ vi mecab_sample.py
-------------------------------------------------------
# coding: utf-8
import sys
import MeCab

mecab = MeCab.Tagger("-Ochasen")

print(mecab.parse("すもももももももものうち"))
-------------------------------------------------------
$ python3 mecab_sample.py
すもも  スモモ  すもも  名詞-一般
も      モ      も      助詞-係助詞
もも    モモ    もも    名詞-一般
も      モ      も      助詞-係助詞
もも    モモ    もも    名詞-一般
の      ノ      の      助詞-連体化
うち    ウチ    うち    名詞-非自立-副詞可能
EOS

(2)係受け解析エンジンCaboChaインストール
・インストール
$ wget -O CRF++-0.58.tar.gz 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ'
$ tar xvzf CRF++-0.58.tar.gz
$ cd CRF++-0.58
$ vim node.cpp
------------------------------
#include 
#include 
#include 

(3)後始末とライブラリインストール
$ cd
$ rm -Rf CRF*
$ rm -Rf cabocha*
$ pip3 install neologdn
$ pip3 install numpy
$ pip3 install matplotlib
$ pip3 install pandas
$ pip3 install scipy
$ pip3 install scikit_learn
$ pip3 install tensorflow
$ pip3 list
$ pip3 install wordcloud
$ sudo apt -y install fonts-ipaexfont
$ pip3 install pillow

(4)辞書追加
$ cd
$ git clone https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ sudo bin/install-mecab-ipadic-neologd
$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"


2.プログラム本文
 環境構築よりこっちの方が大変でした。まぁコピペしかしていませんがwww
 エラー処理は一切組み込まれていないので、なんかあるとスタックトレースはいて
 落ちます。がまぁ個人利用ならいいのではないかと勝手に思っています。
 いい加減にセンスが身についてほしいがセンスはないです。
 同じディレクトリ内にテキストファイルかまして、プログラム名+ファイル名で
 動きます。 
 
 例:$python3 samplemecab.py target.txt

◆参考サイト
 https://qiita.com/Sak1361/items/2519f29af82ffe965652
 https://qiita.com/kenmatsu4/items/9b6ac74f831443d29074
 https://qiita.com/TkrUdagawa/items/aa483630b5ec7d337c9e
 http://cadenza-lab.com/2018/02/04/textmining/
 https://www.pc-koubou.jp/magazine/2646
 https://akamist.com/blog/archives/2659
 https://qiita.com/hatchinee/items/a904c1f8d732a4686c9d
 https://blog.aidemy.net/entry/2018/05/11/162024
 http://blog.aqutras.com/entry/2016/05/16/210000
 https://qiita.com/yonedaco/items/27e1ad19132c9f1c9180
 https://qiita.com/jabba/items/2ddd0b8fb855febb4d43
 http://pynote.hatenablog.com/entry/python-wordcloud
 https://qiita.com/yniji/items/3fac25c2ffa316990d0c
 https://www.utali.io/entry/2016/10/03/001210
 http://aifaruba.hatenablog.com/entry/2015/07/22/161700
 https://ameblo.jp/javaee7/entry-12419180587.html
 https://akamist.com/blog/archives/2656
 http://loudspeaker.sakura.ne.jp/devblog/2015/04/29/extract-noun-with-python_mecab/
 http://tech.innovation.co.jp/2017/07/28/mecab.html
 http://mabonki0725.hatenablog.com/entry/2017/07/26/120333
 https://hivecolor.com/id/86
 https://gassandesu.hatenablog.com/entry/2019/01/08/003647
 https://takaxtech.com/2018/11/03/article271/
 https://hibiki-press.tech/learn_prog/python/sorted_sort/594

◆ソースコード
2019/4/8 CSVファイルを出力できるようにしてみました。これで結構使用用途が
広がるなぁ。

import collections
import collections
import csv
from operator import itemgetter
import sys
import traceback

import MeCab

def word_tokenaize(doc):
    """
    Mecabを使用して与えられたテキストを解析する
    名詞のみを取り出してリストに格納する

    """
    try:
        tagger = MeCab.Tagger(" -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd")
        tagger.parse("")
        node = tagger.parse(doc)
        results = []
        lines=[]
        lines=node.split('\n')
        for item in lines:
           cw = item.split('\t')[0]
           if len(item) > 5:
              ps = item.split('\t')[1].split(',')[0]
              if  ps == '名詞':
                  results.append(cw)
        return results
    except Exception as e:
        t, v, tb = sys.exc_info()
        print(traceback.format_exception(t,v,tb))
        print(traceback.format_tb(e.__traceback__))

#主処理(テキストファイル読込部分)
def main():
    """
    主処理
    第1引数から入力ファイル、第2引数から出力ファイルを取得する
    word_tokenaizeで解析した単語数を降順で並べ替えて出力する。
    """
    try:
        o = []
        r = []
        csvlist = []
        input_file = sys.argv[1]
        output_file = sys.argv[2]
        for line in open(input_file, 'r'):
            r = word_tokenaize(line)
            o.extend(r)
        result = collections.Counter(o)
        f = open(output_file, 'w')
        writer = csv.writer(f, lineterminator='\n')
        for word, cnt in sorted(result.items(),key=lambda x: x[1], reverse=True):
            writer.writerow([word,cnt])
            print(word, cnt)
        f.close
    except Exception as e:
        t, v, tb = sys.exc_info()
        print(traceback.format_exception(t,v,tb))
        print(traceback.format_tb(e.__traceback__))

if __name__ == '__main__':
   main()


後はCabocha使ってもう少し高度に分析してみたいのと、それとWordCloudかなぁ。同義語解析とかその辺もやれると少し使用用途が広がるかもしれないかなぁ。
あ、辞書追加して精度上がるのか試してみたい。
Neologdは速攻追加、ピエール瀧とかでも出てくるし。精度も標準辞書より上なので必須ですね。後はユーザ辞書の作成が効率化できれば、かなりテキストマイニングが楽にできる様になるね。これはよいぞぉ。

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)