HYT MachineWorks

やったこととか思いついたことをメモしておくブログです。

自然言語処理100本ノックをWindows/Python3で 第五章を解く

自然言語処理100本ノックとは、

東北大学の乾・岡崎研究室にて公開されている自然言語処理の問題集です。

www.cl.ecei.tohoku.ac.jp

前回に引き続いて第五章をこなしました。

 

第5章: 係り受け解析

github.com

コードは、私のGitHubリポジトリにアップロードしています。

四章分は下のリンクから

NLP_100/codes/chapter_05 at master · hytmachineworks/NLP_100 · GitHub

引っかかった点

・そもそものCaboChaをwindows上で使う
この書き方は、正確では無いんだけど、Windows 64bitでMeCabpythonバインディングを使える様にした状況で、CaboChaが使えない。実際は使えない訳ではなくて、MeCabを配布された32bit版のままインストールして、CaboChaも配布されたまま使えば動作します。

ですが、MeCabを64bitでビルドするとlibmecab.dllをCaboChaも見に行くので64bitと32bitがあってないので動作しません。色々やったけど、結局あきらめてWindows Subsystem for Linux(WSL)を使ってインストールして実行した結果を元に課題を解きました。インストールメモは下の記事を参考にしてください。機会を見つけてもう一度やってみたい。

hytmachineworks.hatenablog.com

・GrahpVizでの作図

出題では、pydotがいいと言っていますが、私はせっかくpygraphvizを入れてあるのでnetworkxから作図しました。手順としては、

 1.リストで表現されたエッジ(矢印の元と先)をすべて一つにしたリストで作る
 2.networkxの有指向グラフDiGraphを初期化
 3.1で作ったエッジのリストを読み込ませる
 4.pygraphvizのa_graphに変換
 5.日本語のフォントに対応させるためフォントを指定
 6.出来たグラフを書き出し

ってことをやったサンプルが↓の通りです。

# coding = utf-8

import networkx as nx

src_list = ["", "", "", "a", "", "", ""]
dst_list = ["a", "a", "a", "i", "i", "i", "i"]

all_edges = [[src, dst] for src, dst in zip(src_list, dst_list)]

g = nx.DiGraph()
g.add_edges_from(all_edges)

a_graph = nx.nx_agraph.to_agraph(g)

a_graph.node_attr.update(fontname="MS Gothic")
a_graph.layout("dot")
a_graph.draw("test.png")

で出来た結果が、

f:id:hytmachineworks:20171209102013p:plain

こんな感じ。

GraphVizで日本語を表示
いままでは、Windows7でMeiryoを使っていたので気にしてなかったんだけど今度はNotoSansCJK JPでやろうと思ったらドハマリした

でも結局Noto Sans CJK JPだけダメだった。Noto Serif CJK JPは大丈夫なのに。。。

認識のさせかたは、Pangoを利用したソフトなら共通で、別のソフトではあるがInkscapeの例を参考に設定した。

nahcew.com

  GraphViz本体のインストールフォルダ\fonts\conf.d

にある 51-local.confをテキストエディタで開いて

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- /etc/fonts/conf.avail/51-local.conf file to configure system font access -->
<fontconfig>
<!-- Load local system customization file -->
<include ignore_missing="yes">local.conf</include>
<dir>C:\Windows\Fonts\</dir>
</fontconfig>

赤字の<dir>C:\Windows\Fonts\</dir>を<fontconfig>に追加してください。
それで認識されるようになります。

認識されるフォントの指定方法は下記サイトを参考にした

cassa.at.webry.info

認識される文字列は、Pangoを利用したソフトで認識できる名前を指定する必要があって、例えばPangoを利用したソフトであるInkScapeで表示させると

f:id:hytmachineworks:20171209103523p:plain

こんな感じ出ててくる名前をそのまま指定してあげる感じになります。
Inkscapeでも見ようと思うと同じくInkscapeのfont.dの51-local.confを編集が必要になります。

あとは、ここまで解けているひとならできる内容と思います。

というか時間を掛けすぎて細かい所忘れちゃった。思い出したら追記します。

そんな感じで第六章に進みます。