プログラミング備忘録

プログラミングでやったことを書いていきます。Python,機械学習など

Wikipediaのあるカテゴリーに属する記事のタイトルを取得する方法

はじめに

Wikipediaのdumpデータを用いて,あるカテゴリに含まれる記事のタイトルを取得します.

環境

CentOS7
Python3.6

事前準備

まず,word2vec-wikification-pyをインストールします.pipでできます.
Wikificationをしてみよう ~Wikipediaを利用した情報抽出 & 曖昧性解消まで ~ - Qiita

pip install word2vec-wikification-py

Mysqlwikiのdumpデータの用意は他を参照してください.
(他の人が用意してくれたのを使ったのでわかりません)

記事のタイトルを出力する

以下のプログラムを動かすことであるカテゴリに属する記事のタイトルを全て出力します.

from word2vec_wikification_py.initialize_mysql_connector import initialize_pymysql_connector
import pymysql.cursors

mysql_username = 'username'
mysql_hostname = 'hostname'
mysql_password = 'password'
mysql_db_name = 'db_name'


serch_words = ['政府']


print("serch_words:" + str(serch_words))
for word in serch_words:
    try:
        mysql_connector = initialize_pymysql_connector(hostname=mysql_hostname,
                                               user_name=mysql_username,
                                               password=mysql_password,
                                               dbname=mysql_db_name)
        with mysql_connector.cursor() as cursor:
            sql = "SELECT cl_to AS parent, page_title AS child FROM page JOIN categorylinks ON categorylinks.cl_from=page.page_id WHERE categorylinks.cl_type != 'subcat' AND categorylinks.cl_to ='" + word + "'"
            cursor.execute(sql)
            results = cursor.fetchall()
    finally:
        mysql_connector.close()

for page_title in results:
    print(page_title[1].decode('utf-8'))

以下の部分は自分で用意したsqlに応じて変えてください

mysql_username = 'username'
mysql_hostname = 'hostname'
mysql_password = 'password'
mysql_db_name = 'db_name'

今回は政府というカテゴリに含まれる記事を出力します.
以下が結果です.
f:id:tkm-kyudo:20181113140042p:plain

取得した結果が右のターミナルに出力されています.
wikiのページと見比べると大丈夫そうですね.
使用するdumpデータによって結果は多少変わると思います.

まとめ

wikipediaのdumpデータを使用することで,wikipediaのあるカテゴリに属する記事のタイトルを取得できました.
Mysqlに関して丸投げしたので,自分でもやってみようと思います.

ライブコーディング環境を導入してみた(TidalCycles)

はじめに

ゼミでライブコーディングの話が出てたので,とりあえずやってみよう精神で導入して見ました.

環境

MacOS Sierra
Python 3.6
homebrew

tidal-bootstrapの導入

とりあえず公式サイトに行ってみる.
https://tidalcycles.org/getting_started.html#running

公式サイトのMac OS,Tidal-bootstrap - automated install on a macのところにある
"You can download tidal-bootstrap here." をクリック.
移動したら,Download .zipをクリックしてzipファイルをダウンロードする.
ここで,homebrewが必要らしいので,入っていない場合は導入してください.

zipファイルを解凍すると次のようになっていると思うので,tidal-bootstrap.commandを起動.
f:id:tkm-kyudo:20180706131517p:plain

ここで一つ目のエラー.どうやらpython2系で動いている(時代遅れ)スクリプトなので,

#!/usr/bin/env python

となっているところを

#!/usr/bin/env python2.7

に変更する.

もう一度tidal-bootstrap.commandを起動する.以下のように表示されれば無事完了.

[Process completed]

SuperDirtのインストール

先ほど解凍したzipファイルの中にある,install-superdirt-quark.scdをダブルクリックすると,
SuperColliderが起動して以下のように表示されます。

// Place your cursor on the line below and press Shift-Enter
include("SuperDirt")

二行目をクリックしてカーソルを移動させ,Shift + Enterを押すとSuperDirtがインストールされる.
結構時間がかかるので気長に待ちましょう.コンソールに

  • > SuperDirt

と表示されれば完了なので,SuperColliderを再起動する.

SuperDirtを起動する

SuperColliderで新規ファイルを開いて、以下のコマンドを入力し,Shift + Enterを押す。

SuperDirt.start

コンソールのところに以下の表示が出ていれば無事完了.

SuperDirt: listening to Tidal on port 57120

TidalCycles Atom pluginのインストール

Atomがインストールされているはずなので,Atomを起動する.
起動したら,上部のタグからPackages->Setting View->Install Packages/Themesをクリック.
tidalと検索するとtidalcyclesが出てくるのでインストールする.
f:id:tkm-kyudo:20180706134120p:plain

やってみる

pluginのインストールが終わったら,Atomで新しいファイルを開き,sample.tidalとして保存する.

d1 $sound "bd cp"

と入力し,command+Enterを押すと,うまく行っていれば音がなる.

しかし,音がならない.

エラー処理

エラーが起きたので,ログを見ると,ghciがないとあったので
brewにてghcをインストールする.

brew install ghc

再度トライ

ghcのインストールが無事終わったので,SuperDirtを起動し直す.
先ほどのsample.tidalファイルを開き,同様にcommand+Enterを押す.
しかし,うまくいかず,Could not find module.sound.tidalというエラーが発生.

再度エラー処理

色々調べて見るとどうも,tidalの導入がうまく行っていないみたいなので
manual installでやってみる.
ターミナルで以下のコマンドを入力.

cabal install tidal

これでtidalがインストールされたので,
同様に,SuperDirtを起動し直し,Atomでcommand+Enterを押すと……

無事音がなった!

やってみて

導入するにあたって,日本語の記事が少ない上に,自動化だと上手くいかなかった.
エラーを調べるも,数が少ないので手探り感がとても強かった.

時間はかかったが,無事導入できたので,ライブコーディングで遊んでみようと思う.
ライブコーディング導入に躓いている人の役に立てば幸いです.

Wikipediaコーパスを使った,word2vecのモデル作成

はじめに

今回は,word2vecのモデルをWikipediaの記事本文を使って作成していきます.
以下参考記事です.ほとんど以下の記事に沿って進めました.
qiita.com

環境

Linux(CentOS7)
Python3.6
今回はLinuxサーバ上で行いましたが,Macなどのターミナルでも同様にできると思います.

コーパスの準備

コーパス作成の流れ
1.日本語版Wikipedia記事のXMLをダウンロードする
2.WikiExtractorというツールを利用し,XMLファイルから記事本文だけを抽出する

まず最初に,WikiExtractorをgitからcloneしてきます.

git clone https://github.com/attardi/wikiextractor.git

wikiextractorというディレクトリができているので移動します.

cd wikiextractor

次に,Wikipedia記事のXMLファイルをダウンロードします.

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

とすることでダウンロードできます.
容量が約2GBほどあるので,時間がかかります.

ダウンロードが終わったら,先ほどcloneしてきたWikiExtractorを使用し,
XMLファイルから,記事本文を抽出します.
使い方は以下の通り,インストールし,コマンドを入力することで抽出できます.

sudo python setup.py install
python WikiExtractor.py jawiki-latest-pages-articles.xml.bz2

先程と同様抽出に時間がかかるので,しばらく待ちましょう.
抽出が終わると,textというディレクトリが新たにできます.

作成されたtextディレクトリには,複数ファイルに分割されているので
それを一つのtxtファイルにまとめます.

find text/ | grep wiki | awk '{system("cat "$0" >> wiki.txt")}'

とすることでwiki.txtという一つのファイルに出力できます.

以上でコーパスの準備は終わりです.

word2vecのモデル作成

コーパスを作成したので,これを利用してword2vecのモデルを作成します.

モデルの作成には,gensimを使用します.
pipでインストールできます.

pip install --upgrade gensim

gensimでモデルを作成する際には,コーパスわかち書きにする必要があるので
mecabを用いて,コーパスをわかち書きにします.
mecabのインストール方法は以下の記事などを参考にしてください.
qiita.com

mecabがインストールされたら,以下のコマンドでコーパスをわかち書きにします.

mecab -Owakati wiki.txt -o wiki_wakati.txt -b 16384

デフォルトの設定だと,MeCab Error “input-buffer overflow. The line is split. use -b #SIZE option.”
というエラーが発生してしまったので -b 16384というオプションをつけています.
このエラーは1行あたりの文字列が(デフォルトの) 8192 文字を超えた時に表示されるみたいです.
"-b"オプションを付けてバッファ・サイズ(一時処理領域)を(デフォルトの2倍の)16384文字にしています.

参考記事でも挙げられていますが,作成されたwiki_wakati.txtにはバイナリ文字が含まれています.
nkfを利用して,utf-8に変換します.
nkfが入っていない場合は以下のコマンドでインストールできます(CentOS7)

sudo yum localinstall -y http://mirror.centos.org/centos/6/os/x86_64/Packages/nkf-2.0.8b-6.2.el6.x86_64.rpm

使い方は以下の通り.

nkf -w --overwrite wiki_wakati.txt

これでutf-8のtxtファイルができたのでモデル作成ができます.
モデル作成のために,make_models.pyを作成します.

vi make_models.py

以下を記述します.

from gensim.models import word2vec
import logging

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

model = word2vec.Word2Vec(sentences, size=200, min_count=20, window=15)
model.save("./wiki.model")

make_models.pyが作成できたら,プログラムを実行します.

python make_models.py

しばらくすると,プログラムが終了し,wiki.modelが出来上がります.

おわりに

今回は,Wikipediaの記事を利用して,word2vecのモデルを作成してみました.
最初は難しそうな印象でしたが,調べてみると意外と簡単そうだったのでやってみました.
せっかく作ったので,実際に使って,遊んでみたいと思います.