Re:ゼロから始めるML生活

Standing on the shoulders of Giants

livedoor ニュースコーパスで遊んでみる

前回はこんなことやっていました。

tsunotsuno.hatenablog.com

すでにベクトル化されていたので、やりやすかったですが、実際はベクトル化されていません。 今回はベクトル化されていないデータセットで遊んでみます。

日本語系のデータセットはこの辺をご参照ください。

gengo.ai

そんでもって今回はlivedoor ニュースコーパスを使用して遊んでみます。

www.rondhuit.com

方針

都合の良いことに、livedoor ニュースのコーパスは9種類の分野の記事に分かれているので、これらを分類してみて、9種類の分布を見てみたいと思います。

参考にしたのはこちら。基本的に環境構築とかもこちらを参考にしました。

deepage.net

※1 : KNPはURLが変わっていたので、こちらをご参照。 nlp.ist.i.kyoto-u.ac.jp

※2 : jumanが必要と言われたので下記のコマンドでインストール

brew install juman

手順

今回の手順としてはこんな感じです。

  1. 環境構築
    • Docker
  2. 形態素解析で単語に分割
    • sudachi
  3. doc2vecで文書ごとベクトル化
    • gensim
  4. 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を可視化します。

可視化にあたってはこの辺を参考にしました。

yag-ays.github.io

するとこんな感じで可視化されました。

※簡単のため、データは大幅にカットしました。

f:id:nogawanogawa:20190316043008p:plain

なんでか知りませんが、モデルを保存して再読込するとラベルが変なことになってました。 原因はよくわからりません…なんでだ…

どなたかわかる方いらっしゃいましたら教えていただければと思います...

感想

単純にいろいろ使っていたので難しかったです。 おかげで上手く分布できてるかの確認はできなかったっす。