にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

ウィキペディア日本語版 tf-idfのidf辞書の公開

nora(野良)-idf-dic

モチベーション

ダウンロードリンク

  • Dropboxにアップロードしております。

www.dropbox.com

フォーマット

  • idfはjsonのdict型(ハッシュマップとも言います)です。
idf = { term1: weight1, term2:weight2, ... }

このようなフォーマットになっており、単語とidfの重みがペアになって格納されています。

式の説明

  • tf-idfはヒューリスティックなものなので、そもそも明確なんてないんですが、一番、わたしとわたしの周りが使う式を示します。
  • 発展的な知識が必要ならば、英語版Wikipediaを見て更にどういうことなのか理解してみるとよいです。

f:id:catindog:20170215222337p:plain

  • あんまり全体に渡って出現しない単語は、重要だろうという仮説に基づいています。そしてそれは、往々にしてうまくいきます。
  • tfはドキュメントdに於けるtの発生頻度です。

以下は実際にmecab等をインストールして、ゼロからidf辞書を作成する例なので、idf辞書を利用するのみなら参照する必要はありません。

プロジェクトの取得取得と、周辺ソフトウェアウェアのインストール

LevelDB(kvs)のインストール
(Ubuntu 16.04以上を想定しています)

$ git clone https://github.com/google/leveldb.git
$ cd leveldb
$ make 
$ cd include
$ sudo cp -r leveldb
$ sudo cp -r leveldb/ /usr/local/include/
$ cd ..
$ cd out-shared
$ sudo cp lib* /usr/local/lib/
$ sudo ldconfig
$ cd ~

mecabのインストール

$ sudo apt install mecab libmecab-dev mecab-ipadic
$ sudo apt install mecab-ipadic-utf8

mecab-python3, plyvelのインストール

$ git clone https://github.com/GINK03/tiny-japanese-wikipedia-tfidf-dic-generator
$ sudo pip3 install mecab-python3
$ sudo pip3 install plyvel

NeoLogdのインストール、及び辞書の書き換え

$ cd ~
$ git clone https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd/
$ ./bin/install-mecab-ipadic-neologd
[install-mecab-ipadic-NEologd] : Do you want to install mecab-ipadic-NEologd? Type yes or no.
>yes
$ sudo vi /etc/mecabrc
(元)dicdir = /var/lib/mecab/dic/debian -> (変更後)dicdir = /usr/lib/mecab/dic/mecab-ipadic-neologd

Neologdのテスト

$ echo "Fate/Grand Order" | mecab
Fate/Grand Order        名詞,固有名詞,一般,*,*,*,Fate/Grand Order,フェイトグランドオーダー,フェイトグランドオー ダー
EOS

動作確認

$ cd ~
$ cd tiny-japanese-wikipedia-tfidf-dic-generator
$ python3 nora-idf-dic.py
(何も表示されなけばOK)

Wikipediaのダンプ情報の取得

Wikipediaのスナップショットと呼ばれる情報を取得し、展開します。

$ wget https://dumps.wikimedia.org/jawiki/20170201/jawiki-20170201-pages-articles-multistream.xml.bz2
$ bunzip2 jawiki-20170201-pages-articles-multistream.xml.bz2

idf辞書を構築します。

$ python3 nora-idf-dic.py --wakati
(...60分ほど待ちます)
$ ls 
title_context.ldb(このディレクトリがあればOK)
$ python3 nora-idf-dic.py --build
(...3分ほど待ちます)
$ ls words_idf.json
words_idf.jsonls

tf-idfでベクトル化する

具体例を記しておきます。

$ echo "あなた狩りごっこがあまり好きじゃないけものなんだね"  | python3 nora-idf-dic.py --check
{'ね': 4.926646596986834, 'ない': 2.042401886218362, 'だ': 2.8119346405476735, 'が': 1.2142350698667934, 'じゃ': 6.054326132384362, 'あなた': 5.476151075317936, 'ごっこ': 8.627077870130083, 'ん': 3.364157726200682, '狩り': 7.11635016692977, '好き': 4.97306829447642, 'けもの': 9.584680272531994, 'あまり': 5.093448481495583, 'な': 1.6713533531785785}

keyを数値としてindexを振っていけば、libsvmやXGBoostやLightGBMで入力可能なフォーマットになります。
別にこのスクリプト経由で読み出すのではなく、jsonファイルだけ読み込んで、好きなように使っていただいて構いません。

コード

  • Wikipediaは巨大なコーパスなのでまともにはオンメモリでは処理できません。メモリに収まらない操作をコツコツとkvsを使いながらなんとかするという感じです。
  • githubにあげておきました。

github.com

ライセンス・その他

  • Text of Creative Commons Attribution-ShareAlike 3.0 Unported Licenseというライセンスに準拠
  • Wikipediaを参照してください

Wikipedia:クリエイティブ・コモンズ 表示-継承 3.0 非移植 - Wikipedia

  • Wikipediaのデータは2017/02/01時点のスナップショットです
  • 形態素解析エンジンにMeCab + NeoLogd(2016/12時点)を利用しました