【スクレイピング】頻出単語の抽出

スクレイピング
スクレイピング準備記事
関連記事

【やりたいこと】Wikipedeiaデータセットの文章から頻出単語抽出したい!

前々回でWikipediaのデータセットをダウンロードし、

前回は、mecabをインストールしました。

今回は、Wikipediaデータセットの文章からmecabを使用することで頻出単語を抽出します。

【10分でできる】頻出単語の抽出50%成功

※ダウンロード時間は10分の中に含まれていません。

1.使用したもの

・仮想環境 Ubuntu 14.04 64bit

・Virtual box

Oracle VM VirtualBox

・Vagrant

Vagrant by HashiCorp
Vagrant enables users to create and configure lightweight, reproducible, and portable development environments.

・Term Term

Tera Term (テラターム) プロジェクト日本語トップページ - OSDN
Tera Term は、オリジナルの Tera Term Pro 2.3 の原作者公認の後継版です。オープンソースで開発されており、UTF-8 表示に対応しています。 また、SSH1 対応モジュール TTSSH を拡張し、SSH2 プロトコルをサポートしています。

・Python3.4

・mecab

・mecab-python3

2.手順

※下記の記事の内容を完了しているものとして、進めていきます。

【スクレイピング】仮想マシンの起動
【やりたいこと】仮想マシンを起動させたい! 今回は、初めてのスクレイピング記事になります。 スクレイピング記事の大まかな流れとしては、 仮想マシンを構築→スクレイピング 以上の流れで進めていきます。 今回は、1記事...
【スクレイピング】仮想マシンでPythonスクリプトファイルの実行
【やりたいこと】Pythonスクリプトファイルを仮想マシンで実行させたい! 前回の記事「【スクレイピング】仮想マシンの起動」の続きです。 ホストOSでPythonスクリプトファイルを実行するには、そのファイルがあるフォルダに...
【スクレイピング】WikipediaのデータセットをPCにダウンロードしてみる+α
スクレイピング準備記事 【やりたいこと】データセットを使用したスクレイピングをしてみたい! これまでのスクレイピング記事では、サイトやブログを指定してスクレイピングを行いました。 今回は、元々用意されて...
【スクレイピング】mecab-python3のインストールエラー解決
スクレイピング準備記事 関連記事 【やりたいこと】頻出単語を調べるために、mecabをインストールしたい! 前回、Wikipediaのデータセットから文章を抜き出したファイルを作成しまし...

①Pythonスクリプトファイルの作成と実行

import sys
import os
from glob import glob
from collections import Counter

import MeCab


def main():
"""
コマンドライン引数で指定したディレクトリ内のファイルを読み込んで、頻出単語を表示する。
"""

input_dir = sys.argv[1] # コマンドラインの第1引数で、WikiExtractorの出力先のディレクトリを指定する。

tagger = MeCab.Tagger('')
tagger.parse('') # parseToNode() の不具合を回避するために必要。
# 単語の頻度を格納するCounterオブジェクトを作成する。
# Counterクラスはdictを継承しており、値としてキーの出現回数を保持する。
frequency = Counter()
count_proccessed = 0

# glob()でワイルドカードにマッチするファイルのリストを取得し、マッチしたすべてのファイルを処理する。
for path in glob(os.path.join(input_dir, '*', 'wiki_*')):
print('Processing {0}...'.format(path), file=sys.stderr)

with open(path) as file: # ファイルを開く。
for content in iter_docs(file): # ファイル内の全記事について反復処理する。
tokens = get_tokens(tagger, content) # ページから名詞のリストを取得する。
# Counterのupdate()メソッドにリストなどの反復可能オブジェクトを指定すると、
# リストに含まれる値の出現回数を一度に増やせる。
frequency.update(tokens)

# 10,000件ごとに進捗を表示。
count_proccessed += 1
if count_proccessed % 10000 == 0:
print('{0} documents were processed.'.format(count_proccessed),
file=sys.stderr)

# 全記事の処理が完了したら、上位30件の名詞と出現回数を表示する。
for token, count in frequency.most_common(30):
print(token, count)


def iter_docs(file):
"""
ファイルオブジェクトを読み込んで、記事の中身(開始タグ <doc ...> と終了タグ </doc> の間のテキスト)を
順に返すジェネレーター関数。
"""

for line in file:
if line.startswith('<doc '):
buffer = [] # 開始タグが見つかったらバッファを初期化する。
elif line.startswith('</doc>'):
# 終了タグが見つかったらバッファの中身を結合してyieldする。
content = ''.join(buffer)
yield content
else:
buffer.append(line) # 開始タグ・終了タグ以外の行はバッファに追加する。


def get_tokens(tagger, content):
"""
文書内に出現した名詞のリストを取得する関数。
"""

tokens = [] # この記事で出現した名詞を格納するリスト。

node = tagger.parseToNode(content)
while node:
# node.featureはカンマで区切られた文字列なので、split()で分割して
# 最初の2項目をcategoryとsub_categoryに代入する。
category, sub_category = node.feature.split(',')[:2]
# 固有名詞または一般名詞の場合のみtokensに追加する。
if category == '名詞' and sub_category in ('固有名詞', '一般'):
tokens.append(node.surface)
node = node.next

return tokens

if __name__ == '__main__':
main()

引用元:Pythonクローリング&スクレイピング Pythonスクリプトファイルword_frequency.pyを使用

上記のスクリプトを作成しましょう。

python word_frequency.py articles

作成したスクリプトを実行します。引数には、頻出単語を抽出するファイルが保存されているフォルダを記入します。

②結果の確認

スクリプトファイルの実行結果を確認します。

頻出単語ではなく、頻出文章のようになってしまいました。

スクリプトでは、「頻出単語 頻出回数」と横並びで表示されるはずでしたが、実行結果を見る限り、そのように表示されている箇所はありませんでした。

しかし、頻出回数のランキング表示は大方あっているようで、「状況の変遷を下表に示す。」の文章は、ファイルの文章に多くありました。

3.まとめ

頻出単語の抽出は、完璧に成功とはいきませんでした。原因として考えられることは、mecabで使用した辞書が古かった可能性があります。

次回、mecab-ipadic-NEologdというWeb上の多様なデータを含む辞書を使用する準備を行います。

【最後に】参考図書の紹介

以下の書籍は、私がPythonスクレイピングを勉強するにあたって、使用した書籍です。

「Python逆引き大全」は、秀和システムの技術書読み放題サービス「10×Eng」で読めます。最初の2週間は無料、それ以降は、月額900円で利用できます。

「プログラミング超初心者が初心者になるためのPython入門」はkindle unlimitedで読めます。

 

コメント

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