TPTブログ

テックポート株式会社のブログです。 技術情報や製品・サービス情報、 また未経験社員がデータサイエンティストを 目指す奮闘記など、更新していきます。

▲心くじけず言語処理100本ノック==5章下準備==

f:id:TBT_matsu:20200515145048p:plain
こんにちは!
テービーテックの村松です。

「言語処理100本ノック2020]」
nlp100.github.io
に挑戦中!
途中でくじけないか見守ってください・・・。
そして、皆さんも一緒に挑戦してみましょう!

本日は第5章: 係り受け解析 の下準備です!
CaboChaをColabで使用するにあたって下準備がちょっと長かったので本題は次回から!

間違い・コード改善点などありましたら教えていただけると嬉しいです。

第5章: 係り受け解析

「夏目漱石の小説『吾輩は猫である』の文章(neko.txt)をCaboChaを使って係り受け解析し,その結果をneko.txt.cabochaというファイルに保存せよ.このファイルを用いて,以下の問に対応するプログラムを実装せよ.」
4章続いてpopular-names.txtを使用して問題に取り組んでいきます。

CaboChaをインストール(GoogleColab)

・MeCab
・CRF++
・Cabocha
以上の3つをインストールしていきます。

・MeCab のインストール

!apt install -y \
    curl \
    file \
    git \
    libmecab-dev \
    make \
    mecab \
    mecab-ipadic-utf8 \
    swig \
    xz-utils
!pip install mecab-python3

・CRF++ のインストール

import os
filename_crfpp = 'crfpp.tar.gz'
!wget "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ" \
    -O $filename_crfpp
!tar zxvf $filename_crfpp
%cd CRF++-0.58
!./configure
!make
!make install
%cd ..
os.environ['LD_LIBRARY_PATH'] += ':/usr/local/lib' 

・Cabochaのインストール

FILE_ID = "0B4y35FiV1wh7SDd1Q1dUQkZQaUU"
FILE_NAME = "cabocha.tar.bz2"
!wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=$FILE_ID' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=$FILE_ID" -O $FILE_NAME && rm -rf /tmp/cookies.txt
!tar -xvf cabocha.tar.bz2
%cd cabocha-0.69
!./configure --with-mecab-config=`which mecab-config` --with-charset=UTF8
!make
!make check
!make install
%cd ..
!cabocha --version

・最後にCaboChaのpython バインディングを有効化します

%cd cabocha-0.69/python
!python setup.py build_ext
!python setup.py install
!ldconfig
%cd ../..

これでColabでもCaboChaが使用できるようになりました。
では、4章と同様にデータの準備から始めましょう。

データの下準備:「neko.txt.cabocha」の作成

file_path = 'neko.txt'
#空のリストの用意
c_list = []
c = CaboCha.Parser()
#テキストデータの読み込み
with open(file_path) as f:
  text_list = f.read()
  #改行で切り分けて各行ごとに形態素解析を行います。
  for i in text_list.split('\n'):
    cabo = c.parse(i)
    #用意したm_listに格納します。
    c_list.append(cabo.toString(CaboCha.FORMAT_LATTICE))
  print(c_list[2])
##結果
* 0 2D 0/0 -0.764522
 	記号,空白,*,*,*,*, , , 
* 1 2D 0/1 -0.764522
吾輩	名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
* 2 -1D 0/2 0.000000
猫	名詞,一般,*,*,*,*,猫,ネコ,ネコ
で	助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある	助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
。	記号,句点,*,*,*,*,。,。,。
EOS

なお、解析結果の見方は、
「*」から始まるものが係り受け解析の行になります。

#例
* 0 2D 0/0 -0.764522

左から、スペース区切りで、
「* 文節番号 係り先の文節番号(係り先がない時は-1) 主辞の形態素番号/機能語の形態素番号 係り関係のスコア(大きい方が係りやすい)」
という情報が入っています。

その他の行は4章と同様に形態素解析の結果になります。

#例
吾輩	名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ

左から、
表層形(タブ)品詞,品詞細分類1.品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
という順番です。

最後に出力して終わり
#書き出し
path_w = '保存先/neko.txt.cabocha'
#リスト型を書き込むときはwritelines()
with open(path_w, mode='w') as f:
  f.writelines(c_list)

これで下準備完了です。
次回から問題に取り組みましょう。