wikiコーパス作成に挑戦

MeCab

この内容は、2023年4月、windowsでのものです。

ちなみにこのようなことをしなくても、

wiki40Bという、tensorflowのデータセットがあるようです。

これは単純にやってみたいということでやっています。

参考記事

wikipediaのデータからword2vecコーパスを作成する

仮想環境を使おう

実はwikiコーパス作りは、何度か挑戦していて、

ことごとく失敗しています・・・

そんなわけで、今回は仮想環境を使用します。

参考記事はAnacondaを使用しています。

私はAnacondaは使ってないので、

pipで環境を作りました。

そちらの挑戦記録は

pipでのPython仮想環境おんwindows

に記載しています。よろしければどうぞ。

wikiデータのダウンロード

curlはwindowsでも使えるので参考記事そのまま。

curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2

とても時間がかかります。

久々にシーツを取り換え洗濯し、掃除機をかけ

食料品の買い出しに行き、100均に寄り道しても

まだ、十分な時間です。

通信が途切れるのが怖くなければ、

裏でダウンロードしながらマインクラフトを楽しむのもよいでしょう。

データーの解凍

下準備

まだ入れていなければ、gitを入れといてくださいね。

windowsの場合はGUIでインストールできます。

WindowsにGitをインストールする手順(2023年04月更新)

wikiExtractorで解凍

まずは、wikiExtractorをインストールします。

ここで、gitが出てきますね。

pip install git+https://github.com/prokotg/wikiextractor

※ 注意点

インストールの際、python3.11ではエラーが出るかもしれません。

私は、真っ赤な文字で思いっきりエラー出ました・・・

その場合はpython3.10の仮想環境をもう一つ作ります。

pythonダウンロード

こちらを参考。

やり方はpython3.10を普通にexeファイルでインストールします。

Add Python PATHのチェックは入れてください。

(東京工業大学の画像借りちゃいました!)だから3.9なんです。

他のバージョンのpythonもアンインストールとかしません。

どちらか選んで使う感じです。

仮想環境の作り方ですが、

私の場合は

py -3.10 -m venv py310env

で新しい仮想環境を作りました。アクティブ化するときも

.\py310env\Scripts\activate

と名前をそろえてあげてください。

そして解凍。

うまくwikiExtractorがインストール出来たら

wikiデーターの解凍をします。

python -m wikiextractor.WikiExtractor jawiki-latest-pages-articles.xml.bz2

解凍されたデーターは新しくできた、textというフォルダにあります。

わかち書きとファイルの統合

ここで、MeCabをインストール。

以前にもインストールしてはいますが、

(その時の記事。MeCabインストール

仮想環境に改めてインストール。

(コマンドで仮想環境を有効化してそのままインストールの意味)

pip install mecab-python3

MeCabはわかち書きに使用します。

参考では、pythonでプログラムを書いて

MeCabでわかち書きして、UTF-8で書き込み処理しています。

wiki1_wakati_gather.pyと題してあります。

そのままコピーしたら動かなかったので、

デバックしながら少し修正したのが下記です。

import glob
import logging
import os

import MeCab

if not os.path.exists("./wakati"):  # ディレクトリが無かったら作成
    os.mkdir("wakati")


logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)

tagger = MeCab.Tagger("-Owakati")

AllData = ''
Folders = glob.glob('text\*')  # textディレクトリ内のフォルダを取得


start_num = 0  # 開始するフォルダの番号を指定
# 一度で実行する場合は0,途中で止まった後に再開するときはその番号


for FolderName in Folders[start_num+0:]:
    files = glob.glob(f"{FolderName}\*")  # フォルダの中身を取得
    for file in files:
        f = open(file, 'r', encoding='UTF-8')  # 読み込むので"r",UTF-8を指定
        data = f.read()
        #AllData += data + '\n'
        wakatiData = tagger.parse(data)
        AllData += wakatiData + '\n'
        logger.info(file)
        f.close()

    #wf = open(f'data/wiki_data_{FolderName[5:7]}.txt', 'w', encoding='UTF-8')
    wf = open(f'wakati/wiki_data_{FolderName[5:7]}.txt', 'w', encoding='UTF-8')
    wf.write(AllData)
    wf.close

wf = open('wiki_data.txt', 'w', encoding='UTF-8')
wf.write(AllData)

結果ですが、wakatiというフォルダが作成され、

その中にAAからなる分割ファイルがtxtで保存されています。

そしてwiki_data.txtというのが統合ファイルですね。

統合ファイルは大きすぎるので、

分割ファイルの中身を見てみます。

うまくいったようですね。

でもまだ文頭の<doc>やカッコなどが邪魔なんですね。

タグや記号の除去

こちらも参考から引用します。

以前の失敗は、このタグ消去で、

sedを使った処理が終わらなくて困っていました。

こちらはタグ消去にMeCabを使用していますね。

wiki2_remove_tag.pyと名づけてあります。

import re

import MeCab


f = open("wiki_data.txt", 'r', encoding='UTF-8')
data = f.read()
f.close()


# 最初にあるタグを消す
data = re.sub(r"<.*?>", r"", data)
# 半角記号削除
data = re.sub(r'[!"#$%&\'\\\\()*+,-./:;<=>?@[\\]^_`{|}~「」〔〕“”〈〉『』【】&*・()$#@。、?!`+¥%]', '', data)
# 全角記号削除
data = re.sub("[\uFF01-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF40\uFF5B-\uFF65\u3000-\u303F]", '', data)

# print(data[0:10000])

#ファイルに書き込み
wf = open('wiki_tag_removed_data.txt', 'w', encoding='UTF-8')
wf.write(data)
wf.close()

プログラムはすんなり通りました。データーの容量比較です。

下が不要なものを削除したファイル。かなり小さくなっています。

ついでにWord2Vec

参考ではWord2Vecでベクトル化までやっています。

私もやってみます。

Word2Vecが初めての方は私の挑戦記録

ChatGPTにWord2Vecを教えてもらったは参考にならないかしら?

こちらのプログラム名は、wiki3_make_vector.pyとしていますね。

参考と違う点は、参考ではファイル名を変更しているところ、

私は混乱を避けるために、もとのまま

wiki_tag_removed_data.txtとしています。

from gensim.models import word2vec
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus('./wiki_tag_removed_data.txt')

model = word2vec.Word2Vec(sentences, vector_size=200, min_count=20, window=15)
model.wv.save_word2vec_format("./wiki.model", binary=True)

おたのしみの類似語検索

プログラム名は、ruiji_otanosimi.py としまして、

‘大谷’といえば?

from gensim.models import KeyedVectors

wv = KeyedVectors.load_word2vec_format('wiki.model', binary=True)
results = wv.most_similar(positive='大谷')
for result in results:
  print(result)

美人といえば?

成功といえば?

といった感じになりました。

語句によっては、そもそもエラーになったりします。

さらに追及ですね。

コメント

タイトルとURLをコピーしました