--- ## Wikipedia日本語版ダンプからgensimコーパスを作成する ### 1. ダンプファイルのダウンロード Wikipedia日本語版の全記事データは,Wikimedia Dumpsから取得する。 ``` jawiki-latest-pages-articles.xml.bz2 ``` ダウンロードURL: https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 bz2圧縮されたXML形式であり,ファイルサイズは約4.5GBである。 ### 2. gensim付属スクリプトによる変換 gensimにはWikipediaダンプをbag-of-wordsおよびTF-IDF形式に変換するスクリプトが付属している。 ソースコード: https://github.com/piskvorky/gensim/blob/develop/gensim/scripts/make_wikicorpus.py ```bash python -m gensim.scripts.make_wikicorpus /path/to/jawiki-latest-pages-articles.xml.bz2 jawiki ``` 生成されるファイルは以下のとおりである。 ``` jawiki_wordids.txt.bz2 # 単語-ID対応表 jawiki_bow.mm # bag-of-words(Matrix Market形式) jawiki_bow.mm.index # インデックス jawiki_bow.mm.metadata.cpickle # 記事タイトル jawiki_tfidf.mm # TF-IDF(Matrix Market形式) jawiki_tfidf.mm.index # インデックス jawiki.tfidf_model # TF-IDFモデル ``` ただし,このスクリプトのデフォルトtokenizerはアルファベット圏の言語向けであり,日本語には対応していない。日本語を処理するにはカスタムtokenizerが必要である。 ### 3. 日本語対応のPythonコード `WikiCorpus`のコンストラクタは`tokenizer_func`引数でtokenizerを差し替えられる。以下はJanomeを使用した例である。JanomeはPure Python実装の形態素解析器であり,`pip install janome`だけで辞書を含めてインストールできる。 ```python # jawiki_corpus.py # Wikipedia日本語版ダンプからbag-of-wordsおよびTF-IDFコーパスを生成する # # pip install gensim janome from janome.tokenizer import Tokenizer as JanomeTokenizer from gensim.corpora import Dictionary, MmCorpus, WikiCorpus from gensim.models import TfidfModel # --- 設定 --- DUMP_PATH = "/path/to/jawiki-latest-pages-articles.xml.bz2" OUTPUT_PREFIX = "jawiki" DICT_SIZE = 100000 # --- 日本語tokenizer --- _janome = JanomeTokenizer() def tokenize_ja(text, token_min_len, token_max_len, lower): """名詞・動詞・形容詞の原形を抽出する""" tokens = [] for token in _janome.tokenize(text): if token.part_of_speech.startswith(("名詞", "動詞", "形容詞")): word = token.base_form if token.base_form != "*" else token.surface if lower: word = word.lower() if token_min_len <= len(word) <= token_max_len: tokens.append(word) return tokens # --- コーパス構築 --- wiki = WikiCorpus(DUMP_PATH, tokenizer_func=tokenize_ja) wiki.dictionary.filter_extremes(no_below=20, no_above=0.1, keep_n=DICT_SIZE) # bag-of-words形式で保存 MmCorpus.serialize(OUTPUT_PREFIX + "_bow.mm", wiki, progress_cnt=10000, metadata=True) wiki.dictionary.save_as_text(OUTPUT_PREFIX + "_wordids.txt.bz2") # TF-IDFモデルの構築と保存 dictionary = Dictionary.load_from_text(OUTPUT_PREFIX + "_wordids.txt.bz2") mm = MmCorpus(OUTPUT_PREFIX + "_bow.mm") tfidf = TfidfModel(mm, id2word=dictionary, normalize=True) tfidf.save(OUTPUT_PREFIX + ".tfidf_model") MmCorpus.serialize(OUTPUT_PREFIX + "_tfidf.mm", tfidf[mm], progress_cnt=10000) ``` `WikiCorpus`は辞書の構築にダンプ全体を走査するため,数時間を要する場合がある。`MmCorpus.serialize`はコーパスをMatrix Market形式で保存し,`metadata=True`を指定すると記事タイトルが`.metadata.cpickle`ファイルに出力される。