

【やりたいこと】Wikipedeiaデータセットの文章から頻出単語を抽出したい!
前々回でWikipediaのデータセットをダウンロードし、
前回は、mecabをインストールしました。
今回は、Wikipediaデータセットの文章からmecabを使用することで頻出単語を抽出します。
【10分でできる】頻出単語の抽出50%成功
※ダウンロード時間は10分の中に含まれていません。
1.使用したもの
・仮想環境 Ubuntu 14.04 64bit
・Virtual box
・Vagrant

・Term Term

・Python3.4
・mecab
・mecab-python3
2.手順
※下記の記事の内容を完了しているものとして、進めていきます。




①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で読めます。
コメント