├── get_similar_words.py └── README.md /get_similar_words.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # coding: UTF-8 3 | 4 | import gensim 5 | 6 | model = gensim.models.Word2Vec.load_word2vec_format('jawikisep.bin', binary=True, unicode_errors='ignore') 7 | counter = 0 8 | 9 | with open('jawiki_meishi.txt', 'r') as f: 10 | for line in f: 11 | meishi = line.strip().split(' ')[1] 12 | # 数字と1文字のアルファベットを除く 13 | if not meishi.isdigit() and not (len(meishi) == 1 and ('a' <= meishi <= 'z' or 'A' <= meishi <= 'Z')): 14 | result = model.most_similar(positive=[meishi]) 15 | for similar_word, distance in result: 16 | counter += 1 17 | print(counter, meishi, similar_word) 18 | 19 | with open('similar_words.txt', 'a') as f: 20 | f.write(meishi + '\t' + similar_word + '\n') 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #get similar words from wikipedia ja 2 | Word2Vecを用いて日本語版 wikipediaのデータを学習させ、単語の共起関係を求め、単語をカテゴリ分けした。 3 | 4 | ##ファイル 5 | ### get_similar_words.py 6 | Word2Vecの学習データを用いてカテゴリ別に単語を出力する。gensimとCythonが必要。 7 | 8 | ``` 9 | $ pip install gensim 10 | $ pip install cython 11 | ``` 12 | 13 | ##similar_words.txt 14 | get_similar_words.pyが出力した、100610個のカテゴリ分けされた単語が入っているファイル。 15 | 各行のtabの左にあるのがカテゴリで右にあるのが単語となっている。 16 | 17 | ##学習データ取得方法 18 | まず、ダウンロードしてきたjawiki-latest-pages-articles.xml.bz2を、wp2txtを用いてテキストに変換、そして得たmecabを用いて得たテキストの分かち書きを求める。最後に分かち書きをword2vecに学習させる。 19 | コマンドは以下。 20 | 21 | ``` 22 | $ wp2txt -i jawiki-latest-pages-articles.xml.bz2 23 | $ cat jawiki-latest-pages-articles.xml-* > jawiki.txt 24 | $ mecab -Owakati -d /usr/local/Cellar/mecab/0.996/lib/mecab/dic/mecab-ipadic-neologd -b 81920 jawiki.txt > jawikisep.txt 25 | $ word2vec -train jawikisep.txt -output jawikisep.bin -size 200 -threads 4 -binary 1 -window 5 -sample 1e-3 26 | ``` 27 | 28 | ##単語をカテゴリに分類する 29 | 単語の共起関係を求めることで単語をカテゴリ分けする。 30 | どの単語との共起関係を求めるか考えたところ、出現回数が多い単語の共起関係を求めたほうが正確になるとの考えに至った。 31 | 以下のコマンドで名詞をwikipediaのテキストから出現回数順に出力した。jawiki.txtが5.47GBあるので時間がかかった。 32 | ファイルを分割して並列でやるべきだった。 33 | 34 | ``` 35 | $ cat jawiki.txt | mecab -d /usr/local/Cellar/mecab/0.996/lib/mecab/dic/mecab-ipadic-neologd -b 81920| grep $"\t名詞"| cut -f1 | sort | uniq -c | sort -nr > jawiki_meishi.txt 36 | ``` 37 | 38 | 出力された jawiki_meishi.txt の中身、行数は以下のようになっている。 39 | 40 | ``` 41 | $ head jawiki_meishi.txt 42 | 3046624 2 43 | 3014297 1 44 | 2620012 こと 45 | 2575308 年 46 | 2101172 ref 47 | 1935276 3 48 | 1682829 http:// 49 | 1577551 4 50 | 1427831 ため 51 | 1176034 www 52 | $ wc -l jawiki_meishi.txt 53 | 5534241 jawiki_meishi.txt 54 | ``` 55 | 56 | 出現頻度が高い名詞の中には、数値やアルファベット一文字のものがあったが、これらをカテゴリ分けしても意味が無いと思ったので、これらを除く単語の共起関係をファイルに出力するスクリプトを書いた。 57 | 58 | ``` 59 | $ python get_similar_words.py 60 | 1 こと 事 61 | 2 こと ため 62 | 3 こと もの 63 | 4 こと ところ 64 | 5 こと ので 65 | 6 こと よう 66 | 7 こと 場合 67 | 8 こと はず 68 | 9 こと 可能性 69 | 10 こと が 70 | 11 年 年間 71 | 12 年 8年 72 | 13 年 か月 73 | 14 年 ヶ月 74 | 15 年 ヵ月 75 | 16 年 歳 76 | 17 年 元年 77 | 18 年 カ月 78 | 19 年 1877年 79 | 20 年 年頃 80 | 21 ref REF 81 | 22 ref blockquote 82 | 23 ref noinclude 83 | 24 ref reF 84 | 25 ref small 85 | 26 ref nowiki 86 | ``` 87 | 88 | このスクリプトはjawiki_meishi.txtに含まれる5534241個の名詞に関連する単語を出力するが、今回はそこまでやる必要がなかったので、100610件出力した時点で終了した。 89 | 90 | ``` 91 | $ head similar_words.txt 92 | こと 事 93 | こと ため 94 | こと もの 95 | こと ところ 96 | こと ので 97 | こと よう 98 | こと 場合 99 | こと はず 100 | こと 可能性 101 | こと が 102 | 103 | $ wc -l similar_words.txt 104 | 100610 similar_words.txt 105 | ``` 106 | 107 | 108 | ##参考資料 109 | - [Statistical Semantic入門 ~分布仮説からword2vecまで~](http://www.slideshare.net/unnonouno/20140206-statistical-semantics) 110 | - [自然言語処理をなにも知らない私がword2vecを走らせるまで: 最尤日記](http://saiyu.cocolog-nifty.com/zug/2014/02/word2vec-1867.html) 111 | - [Ubuntu + word2vecで日本語版wikipediaを自然言語処理してみた - from umentu import stupid](http://blog.umentu.work/ubuntu-word2vec%E3%81%A7%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88wikipedia%E3%82%92%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/) 112 | - [青空文庫のデータを使って、遅ればせながらword2vecと戯れてみた - 東京で働くデータサイエンティストのブログ](http://tjo.hatenablog.com/entry/2014/06/19/233949) 113 | 114 | ##Licence 115 | "THE BEER-WARE LICENSE" 116 | 117 | If we meet some day, and you think 118 | this stuff is worth it, you can buy me a beer in return. 119 | --------------------------------------------------------------------------------