Wikipediaからコーパスを作る
前回、文章を単語分割するためにMeCabをインストースルしたが、大元となるデータ(コーパス)も欲しい。Wikipediaでは全文データをダウンロードすることができるので、それを利用する方法について書いていきたいと思う。
コーパスとは
Wikipediaからの引用によると、
コーパス(英: corpus)は、言語学において、自然言語処理の研究に用いるため、自然言語の文章を構造化し大規模に集積したもの。構造化し、言語的な情報(品詞、統語構造など)を付与している。言語学以外では「全集」を意味することもあり、言語学でも日本語を扱う場合には、「言語全集」「名詞全集」「動詞全集」などと呼ぶとよい[1]。コンピュータ利用が進み、電子化データとして提供している[2]。
引用: コーパス - Wikipedia
何を分析するかで変わるが、整形された元となるデータをコーパスというっぽい。
日本版Wikipediaのデータをダウンロード
Wikipediaはクローラーしないで欲しい代わりに、以下のURLで全文データを提供している。
基本的に最新の方のデータが良いのでlatest
ディレクトリからダウンロードする。
今回使用するデータは本文データが欲しいので、そちらを使う。
curl https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2 -o jawiki-latest-pages-articles.xml.bz2
ダウンロードしたデータはXML
構造になっているため、XMLをパースするためのWikiextractor
を利用する。(作成者様ありがとう)
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ねんアムトラックだっせんじこ)は、現地時間で2015年5月12日夜にアメリカ合衆国ペンシルベニア州フィラデルフィ アの付近で、全米鉄道旅客公社(アムトラック)が運行するワシントンD.C.からニューヨークに向かう列車が脱線した鉄道事故である 事故当時、この列車にはおよそ240人が乗っていた。 2015年5月12日の午後9時10分ごろ、アムトラック北東回廊を運行する北行きの「ノースイースト・リージョナル」 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 ねん アムトラック だっ せんじ こ ) は 、 現地 時間 で 2015 年 5 月 12 日 夜 に アメリカ合衆国 ペンシルベニア 州 フィラデルフィア の 付近 で 、 全米 鉄道 旅客 公社 ( アムトラック ) が 運行 する ワシントン D . C . から ニューヨーク に 向かう 列車 が 脱線 し た 鉄道 事故 で ある 事故 当時 、 この 列車 に は およそ 240 人 が 乗っ て い た 。 2015 年 5 月 12 日 の 午後 9 時 10 分 ごろ 、 アムトラック 北東 回廊 を 運行 する 北 行き の 「 ノースイースト・リージョナル 」 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 ねん アムトラック だっ せんじ こ ) は 、 現地時間 で 2015年 5月12日 夜 に アメリカ合衆国 ペンシルベニ ア州 フィラデルフィア の 付近 で 、 全米鉄道旅客公社 ( アムトラック ) が 運行 する ワシントンD.C. から ニューヨーク に 向かう 列車 が 脱線 し た 鉄道事故 で ある 事故 当時 、 この 列車 に は およそ 240人 が 乗っ て い た 。 2015年 5月12日 の 午後9時 10分 ごろ 、 アムトラック 北東回廊 を 運行 する 北 行き の 「 ノースイースト・リージョナル 」 188 ( ユニオン駅 ( ワシントンD.C. ) 発 ペンシルベニア 駅 ( ニューヨーク ) 行き ) は フィラデルフィア の 30 丁目 駅 を 発車 し た 。 列車 は 7 両 の 客車 を 1年前 製造 の ACS - 64 型 電気機関車 ( No. 601 ) が けん引 する もの で あっ た 。 約 11分 後 、 列車 は から 南東 に ある 複々線 の 本線 を 走行 し て おり 、 ポート ・ リッチモンド 地区 に ある フランクフォード ・ アベ ニュー と ウィートシーフ・レーン の 交差点 の 近く 、 に ある 4度 ( 半径 約 440m ) の 左 カーブ に 進入 し た 。
「2015年アムトラック脱線事故」は一つの固有名詞になってしまうのか・・・。正しい気はするが、利用方法によっては扱いづらくなりそう。「現地時間」はしっかりと「現地時間」と単語に分割されたのでこちらのほうがあってそうな感はある。
終わりに
MeCabのインストールとWikipediaからコーパスを生成することができたのでこれで下準備が整った。
次回はTF-IDF
の説明でも書こう。