いっきのblog

技術とか色々

Wikipediaからコーパスを作る

前回、文章を単語分割するためにMeCabをインストースルしたが、大元となるデータ(コーパス)も欲しい。Wikipediaでは全文データをダウンロードすることができるので、それを利用する方法について書いていきたいと思う。

kzkohashi.hatenablog.com

コーパスとは

Wikipediaからの引用によると、

コーパス(英: corpus)は、言語学において、自然言語処理の研究に用いるため、自然言語の文章を構造化し大規模に集積したもの。構造化し、言語的な情報(品詞、統語構造など)を付与している。言語学以外では「全集」を意味することもあり、言語学でも日本語を扱う場合には、「言語全集」「名詞全集」「動詞全集」などと呼ぶとよい[1]。コンピュータ利用が進み、電子化データとして提供している[2]。

引用: コーパス - Wikipedia

何を分析するかで変わるが、整形された元となるデータをコーパスというっぽい。

日本版Wikipediaのデータをダウンロード

Wikipediaクローラーしないで欲しい代わりに、以下のURLで全文データを提供している。

Index of /jawiki/

基本的に最新の方のデータが良いのでlatestディレクトリからダウンロードする。
今回使用するデータは本文データが欲しいので、そちらを使う。

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

ダウンロードしたデータはXML構造になっているため、XMLをパースするためのWikiextractorを利用する。(作成者様ありがとう)

github.com

git clone git@github.com:attardi/wikiextractor.git
python setup.py install
# ダウンロードしたファイルは人よって場所違うので注意
python WikiExtractor.py jawiki-latest-pages-articles.xml.bz2

上記のコマンドを行うと、textディレクトリ配下にたくさんのデータがばらけてしまうため集約させておく。

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

これでWikipediaの本文データがwiki.txtに出力される。中身を少しだけ見ると

[data]head wiki.txt                                                                                              12:01:28  ☁  master ☂ ⚡
<doc id="3216890" url="https://ja.wikipedia.org/wiki?curid=3216890" title="2015年アムトラック脱線事故">
2015年アムトラック脱線事故

2015年アムトラック脱線事故(2015ねんアムトラックだっせんじこ)は、現地時間で2015512日夜にアメリカ合衆国ペンシルベニア州フィラデルフィ アの付近で、全米鉄道旅客公社(アムトラック)が運行するワシントンD.C.からニューヨークに向かう列車が脱線した鉄道事故である

事故当時、この列車にはおよそ240人が乗っていた。

2015512日の午後910分ごろ、アムトラック北東回廊を運行する北行きの「ノースイースト・リージョナル」 188(ユニオン駅 (ワシントンD.C.)発 ペンシルベニア駅 (ニューヨーク)行き)はフィラデルフィアの30丁目駅を発車した。列車は7両の客車を1年前製造のACS-64型電気機関車 (No. 601) がけん引するものであった。

約11分後、列車はから南東にある複々線の本線を走行しており、ポート・リッチモンド地区にあるフランクフォード・アベニューとウィートシーフ・レーンの交差点の近く、にある4度(半径約440m)の左カーブに進入した。

<doc>タグには記事のURLとタイトルがはいり、その下からは本文となっている。

MeCabを使って分かち書きを出力する

このままだと人間は単語と単語の違いを認識できるが、機械ではできないため単語に分割する。この時に、単語間を空白で区切ることを「分かち書き」という。

MeCabがまだの人はこちらでインスールのやり方を紹介している。 kzkohashi.hatenablog.com

さっそくMeCabを使って先ほどの「wiki.txt」を分かち書きする。

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

だいたい1時間かからずに終わる。
「-b」はメモリサイズを決めるオプションで、以下のようなエラーがでてしまったため付与してある。

input-buffer overflow. The line is split. use -b #SIZE option.

utf8対策やスペースがうまく区切られてないケースがあるらしいのでおまじないで以下のコマンドも打っておく。
nkfのインスールについては省略)

nkf -w --overwrite wiki_wakati.txt

結果はこんな感じ

[data]head wiki_wakati.txt                                                                                       12:01:31  ☁  master ☂ ⚡
< doc id =" 3216890 " url =" https :// ja . wikipedia . org / wiki ? curid = 3216890 " title =" 2015 年 アムトラック 脱線 事故 ">
2015 年 アムトラック 脱線 事故

2015 年 アムトラック 脱線 事故 ( 2015 ねん アムトラック だっ せんじ こ ) は 、 現地 時間 で 2015512 日 夜 に アメリカ合衆国 ペンシルベニア 州 フィラデルフィア の 付近 で 、 全米 鉄道 旅客 公社 ( アムトラック ) が 運行 する ワシントン D . C . から ニューヨーク に  向かう 列車 が 脱線 し た 鉄道 事故 で ある

事故 当時 、 この 列車 に は およそ 240 人 が 乗っ て い た 。

2015512 日 の 午後 910 分 ごろ 、 アムトラック 北東 回廊 を 運行 する 北 行き の 「 ノースイースト・リージョナル 」 188 ( ユ ニオン 駅 ( ワシントン D . C .) 発 ペンシルベニア 駅 ( ニューヨーク ) 行き ) は フィラデルフィア の 30 丁目 駅 を 発車 し た 。 列車 は 7 両 の 客車 を 1 年 前 製造 の ACS - 64 型 電気 機関 車 ( No . 601 ) が けん引 する もの で あっ た 。

約 11 分 後 、 列車 は から 南東 に ある 複々線 の 本線 を 走行 し て おり 、 ポート ・ リッチモンド 地区 に ある フランク フォード ・ ア ベニュー と ウィートシーフ・レーン の 交差点 の 近く 、 に ある 4 度 ( 半径 約 440 m ) の 左 カーブ に 進入 し た 。

無事分かち書きできてるっぽい。ただ「現地時間」が「現地」と「時間」になっているなど、最新の単語に対応していないため比較用に「mecab-ipadic-NEologd」で分かち書きしたものも用意しておく。

mecab -d /usr/local/mecab/lib/mecab/dic/mecab-ipadic-neologd/ -Owakati wiki.txt -o wiki_wakati_neo.txt -b 16384
nkf -w --overwrite wiki_wakati_neo.txt

結果も見とく

[data]head wiki_wakati_neo.txt                                                                                   21:18:06  ☁  master ☂ ⚡
< doc id =" 3216890 " url =" https :// ja . wikipedia . org / wiki ? curid = 3216890 " title =" 2015年アムトラック脱線事故 ">
2015年アムトラック脱線事故

2015年アムトラック脱線事故 ( 2015 ねん アムトラック だっ せんじ こ ) は 、 現地時間 で 2015512日 夜 に アメリカ合衆国 ペンシルベニ ア州 フィラデルフィア の 付近 で 、 全米鉄道旅客公社 ( アムトラック ) が 運行 する ワシントンD.C. から ニューヨーク に 向かう 列車 が 脱線 し た 鉄道事故 で ある

事故 当時 、 この 列車 に は およそ 240人 が 乗っ て い た 。

2015512日 の 午後910分 ごろ 、 アムトラック 北東回廊 を 運行 する 北 行き の 「 ノースイースト・リージョナル 」 188 ( ユニオン駅 ( ワシントンD.C. ) 発 ペンシルベニア 駅 ( ニューヨーク ) 行き ) は フィラデルフィア の 30 丁目 駅 を 発車 し た 。 列車 は 7 両 の 客車  を 1年前 製造 の ACS - 64 型 電気機関車 ( No. 601 ) が けん引 する もの で あっ た 。

約 11分 後 、 列車 は から 南東 に ある 複々線 の 本線 を 走行 し て おり 、 ポート ・ リッチモンド 地区 に ある フランクフォード ・ アベ ニュー と ウィートシーフ・レーン の 交差点 の 近く 、 に ある 4度 ( 半径 約 440m ) の 左 カーブ に 進入 し た 。

「2015年アムトラック脱線事故」は一つの固有名詞になってしまうのか・・・。正しい気はするが、利用方法によっては扱いづらくなりそう。「現地時間」はしっかりと「現地時間」と単語に分割されたのでこちらのほうがあってそうな感はある。

終わりに

MeCabのインストールとWikipediaからコーパスを生成することができたのでこれで下準備が整った。
次回はTF-IDFの説明でも書こう。