前回はこんなことやっていました。
すでにベクトル化されていたので、やりやすかったですが、実際はベクトル化されていません。 今回はベクトル化されていないデータセットで遊んでみます。
日本語系のデータセットはこの辺をご参照ください。
そんでもって今回はlivedoor ニュースコーパスを使用して遊んでみます。
方針
都合の良いことに、livedoor ニュースのコーパスは9種類の分野の記事に分かれているので、これらを分類してみて、9種類の分布を見てみたいと思います。
参考にしたのはこちら。基本的に環境構築とかもこちらを参考にしました。
※1 : KNPはURLが変わっていたので、こちらをご参照。 nlp.ist.i.kyoto-u.ac.jp
※2 : jumanが必要と言われたので下記のコマンドでインストール
brew install juman
手順
今回の手順としてはこんな感じです。
- 環境構築
- Docker
- 形態素解析で単語に分割
- sudachi
- doc2vecで文書ごとベクトル化
- gensim
- tensorboardで可視化
- tensorboard
やってみた
というわけでやってみました。
環境構築
Dockerfileは紆余曲折あってこんな感じにしました。(なんか足りなかったらごめんなさい。ご愛嬌ということで。。。)
FROM ubuntu:18.04 WORKDIR /home RUN apt-get update RUN apt-get install -y git RUN apt-get install -y python3 RUN apt-get install -y python3-pip RUN apt-get install -y emacs RUN pip3 install tensorflow RUN pip3 install tensorboardX RUN pip3 install torch RUN pip3 install pandas RUN pip3 install pytz RUN pip3 install tqdm RUN pip3 install gensim RUN pip3 install -e git+git://github.com/WorksApplications/SudachiPy@develop#egg=SudachiPy RUN apt-get update \ && apt-get install -y locales \ && locale-gen ja_JP.UTF-8 \ && echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc COPY system.dic /home/SudachiPy/resources/system.dic
形態素解析で単語に分割
Pythonを使ってsudachiでの形態素解析はこんな感じでやるらしいです。
適当なファイルを形態素解析するとこんな感じになりました。
root@b414045c6d70:~# python3 tokenize.py ['http://', 'news', '.', 'live', 'door', '.com', '/', 'article', '/', 'detail', '/', '5143945', '/', '\n', '2010', '-', '11', '-', '17', 'T', '14', ':', '00', ':', '00', '+', '0900', '\n', '進化', 'し', '続ける', '「', 'レンジ', '専用', '食品', '」', '\u3000', '電子', 'レンジ', 'を', '“', '相棒', '”', 'に', 'する', '「', 'レン', 'ジェン', 'ヌ', '」', 'と', 'は', '!', '?', '\n', '「', 'チン', 'する', '」', 'と', 'いう', '言葉', 'は', '、', 'いま', 'や', '当たり前', 'の', 'よう', 'に', '認知', 'さ', 'れ', '、', '電子', 'レンジ', 'は', '日常', '生活', 'の', '中', 'で', 'なく', 'て', 'は', 'なら', 'ない', 'もの', 'と', 'なっ', 'て', 'いる', '。', '上', 'を', '見れ', 'ば', 'キリ', 'は', 'ない', 'もの', 'の', '、', '廉価', 'な', '商品', 'も', '多く', '、', 'とくに', '一人暮らし', 'の', 'キャリアウーマン', 'や', '、', 'お金', 'が', 'なく', '自炊', 'を', '心がける', '学生', 'の', 'ワン', 'ルーム', 'に', 'は', '、', 'まず', '必ず', '備え', 'られ', 'て', 'いる', 'はず', 'だ', '。', '\n\n', 'ヤフー', 'バリュー', 'イン', 'サイト', '(', '現', 'マクロ', 'ミル', ')', 'が', '7', '月', 'に', '発表', 'し', 'た', '「', '主婦', 'の', '調理', 'と', '電子', 'レンジ', '利用', 'に', '関する', '調査', '」', 'に', 'よる', 'と', '、', '首都圏', '(', '1', '都', '3', '県', ')', 'に', '住む', '20', '〜', '40', '代', 'の', '既婚', '女性', '1000', '人', 'の', 'うち', '電子', 'レンジ', 'の', '所有', '率', 'は', '約', '99', '%', 'と', '、', 'ほぼ', '一家', 'に', '一', '台', 'が', '当たり前', 'で', 'ある', 'こと', 'が', 'わかっ', 'た', '。', '\n\n', '同じく', '、', '電子', 'レンジ', 'に', '対する', '意識', 'を', '聞い', 'た', 'ところ', '、', '「', '無くなる', 'と', '困る', 'もの', '」', '(', '92', '%', ')', '、', '「', '調理', 'を', '楽', 'に', 'し', 'て', 'くれる', 'もの', '」', '(', '80', '%', ')', '、', '「', '相棒', 'の', 'よう', 'な', '存在', '」', '(', '40', '%', ')', 'と', 'いっ', 'た', '回答', 'が', '多く', '、', 'もはや', '今どき', 'の', '主婦', 'に', 'とっ', 'て', '“', '電子', 'レンジ', '”', 'は', '便利', 'と', 'いう', 'だけ', 'で', 'は', 'なく', '、', '「', '頼れる', 'パー', 'トーナー', '」', '的', 'な', '位置づけ', 'で', 'ある', '様子', 'が', 'うかがえる', '。', '\n\n', 'もちろん', '、', 'これ', 'は', '世', 'の', '独女', '達', 'に', 'とっ', 'て', 'も', '同じ', 'こと', 'だ', '。', '最近', 'で', 'は', '、', 'レンジ', 'で', 'チン', 'する', 'だけ', 'の', 'レシピ', '本', 'も', '登場', 'する', 'など', '、', 'ただ', '温める', 'だけ', 'の', '“', '家電', '”', 'から', '、', 'ひと', 'つ', 'の', '“', '調理器具', '”', 'と', 'し', 'て', 'の', '位置づけ', 'と', 'し', 'て', '、', 'その', '地位', 'が', '確立', 'さ', 'れ', 'つつ', 'ある', '。', '\n\n', 'この', '現象', 'に', '対し', '、', '流通', 'ジャーナリスト', 'の', '金子', '哲雄', '氏', 'は', '、', '「', '家族', 'と', 'の', 'コミュニケーション', 'の', '時間', 'や', '自分', 'の', '時間', 'を', '増やす', 'ため', 'に', '、', '電子', 'レンジ', 'を', '積極的', 'に', '活用', 'し', 'て', 'いる', '主婦', 'が', '増え', 'て', 'おり', '、', 'この', 'よう', 'な', '主婦', 'は', '“', 'レン', 'ジェン', 'ヌ', '”', 'と', '言わ', 'れ', 'て', 'いる', '」', 'と', '解説', 'し', 'て', 'いる', '。', 'さらに', 'は', '、', '電子', 'レンジ', 'を', '使っ', 'て', '簡単', 'に', '調理', 'が', 'できる', '電子', 'レンジ', '専用', '食品', 'が', '大手', '食品', 'メーカー', 'から', '次々', 'と', '発売', 'さ', 'れ', '、', '都市', '部', 'を', '中心', 'に', '電子', 'レンジ', '専用', '食品', 'の', '需要', 'は', 'どんどん', '増える', 'だろう', '、', 'と', '見', 'て', 'いる', '。', '\n\n', 'とくに', '8', '月', '末', 'に', '発売', 'し', 'た', '「', 'ニッ', 'チン', '食堂', '」', '(', '税込', ' ', '各', '199', '円', ')', 'は', '、', '「', '太', '麺', 'ソース', '焼そば', '」', '、', '「', 'たらこ', 'クリーム', 'パスタ', '」', '、', '「', 'カルボナーラ', ' ', 'フェットチーネ', '」', '、', '「', '太', '麺汁', 'なし', '担', '々', '麺', '」', 'の', '4', '種', 'が', 'ラインアップ', 'さ', 'れ', '、', '容器', 'に', '水', 'を', '入れ', 'て', '500', 'W', 'で', '約', '6', '分間', 'チン', 'する', 'だけ', 'で', '、', '手軽', 'に', '本格', '麺', 'を', '味わう', 'こと', 'が', 'できる', 'ため', '、', '“', 'レン', 'ジェン', 'ヌ', '”', 'だけ', 'で', 'は', 'なく', '、', '慌しく', 'も', '食', 'に', 'は', 'うるさい', '独女', 'に', 'とっ', 'て', 'も', '救世主', 'と', 'なり', 'そう', 'だ', '。', '\n\n', 'どんな', 'に', '疲れ', 'て', 'い', 'て', 'も', '水', 'を', '入れ', 'て', '約', '6', '分', 'チン', 'する', 'だけ', 'で', '本格', 'パスタ', 'や', '焼そば', 'が', '食べ', 'られる', '電子', 'レンジ', '専用', '調理', 'カップ', 'めん', '「', 'ニッ', 'チン', '食堂', '」', '、', '進化', 'する', '電子', 'レンジ', '専用', '食品', 'の', 'クオリティ', 'を', '、', '是非', 'とも', 'その', '目', 'で', '確かめ', 'て', 'ほしい', '。', '\n']
一点補足すれば、辞書をfullにすればもうちょっと長めの単語に分割されるようです。
doc2vecで文書ごとベクトル化
次にgensimでdoc2vecをやってみます。 特にこだわりは無いんですが、単純に他のライブラリを使うと数十行書かなきゃならんところがgensimだと数行で済むだけです。 tensorflowとかPytorchとか使えば、tensorboard出力のときの変更が不要なのでそちらでも良いかもしれません。
tensorboardで可視化
最後にtensorboardを使用してembeddingを可視化します。
可視化にあたってはこの辺を参考にしました。
するとこんな感じで可視化されました。
※簡単のため、データは大幅にカットしました。
なんでか知りませんが、モデルを保存して再読込するとラベルが変なことになってました。 原因はよくわからりません…なんでだ…
どなたかわかる方いらっしゃいましたら教えていただければと思います...
感想
単純にいろいろ使っていたので難しかったです。 おかげで上手く分布できてるかの確認はできなかったっす。