LoginSignup
4
0

More than 3 years have passed since last update.

Qiitaコーパスを作る会 2️⃣前処理をする

Last updated at Posted at 2019-07-27

はじめに

前回の記事でQiitaの全記事を取得したので、次は以下の記事を参考に前処理を行っていきます。

自然言語処理における前処理の種類とその威力

今回のシリーズで作ったソースコードはGitHubに置いてあります。

前処理をする

記事の抜き出し

Qiita APIで取得できる記事データには、rendered_bodyにHTML形式、bodyにマークダウン形式の記事情報が含まれています。

今回は、パースのしやすいHTML形式の方を使用します。

json_to_text.py
# --------------------------------------------------
# Qiita APIから取得したデータの記事部分を抜き出しファイル出力
# --------------------------------------------------
import json
from datetime import datetime, timedelta
from bs4 import BeautifulSoup
import os

start = datetime.strptime(os.getenv('START_DATE'), '%Y-%m-%d')  # 開始日を設定
end = datetime.strptime(os.getenv('END_DATE'), '%Y-%m-%d')  # 終了日を設定

for i in range((end - start).days):
    today = (start + timedelta(i)).strftime('%Y-%m-%d')
    print(today)

    # データ読み込み
    with open('data/qiita_' + today + '.json') as json_data:
        articles = json.load(json_data)

        # 記事の集約
        for article in articles:
            soup = BeautifulSoup(article['rendered_body'], 'html.parser')
            # 本文の抜き出し
            sentences = soup.find_all('p')
            for sentence in sentences:
                text = sentence.text + '\n'
                # ファイル書き込み
                with open('data/qiita.txt', 'a') as f:
                    f.write(text)

このプログラムを実行すると、dataフォルダの中に、HTMLからpタグ(段落)部分のみを抽出したqiita.txtが生成されます。

形態素解析

次に形態素解析を行います。日本語は英語のように単語同士が分かれていないので、単語ごとに分割する必要があるためです。

形態素解析器にはMeCabを使用しています。
注)MeCabは別途インストールが必要です。NEologd辞書と一緒に入れてしまうのが楽でオススメです。

text_to_wakati.py
# --------------------------------------------------
# テキストファイルを分かち書き
# --------------------------------------------------
import os
import MeCab


# データ読み込み
with open('data/qiita.txt') as text_data:
    tagger = MeCab.Tagger(
        '-Owakati -b ' + os.getenv('MECAB_BUFFER') + ' -d ' + os.getenv('MECAB_DIC_PATH'))
    line = text_data.readline()
    while line:
        # 分かち書き
        result = tagger.parse(line)
        line = text_data.readline()
        if result != None:
            # ファイル書き込み
            with open('data/qiita_wakati.txt', 'a') as f:
                f.write(result)

テキストをまとめて全てMeCabに投げると、too long sentence.エラーが出てしまったため1行ずつ渡しています。

また、バッファは以下の設定をしています。ここは取得した記事によって変わってくるかと思います。

MECAB_BUFFER=203714

単語の正規化

最後に単語の正規化を行います。
今回は、以下の処理のみ行いました。

  • 英字大文字を全て小文字に
  • 日本語の半角を全角に
  • 一部の記号を統一
  • 数字を全て0に

数字を全て0にしてしまうのは、今回に限ってはやめた方が良いかもしれません。なぜなら、技術用語における数字は結構重要なケースも多いと考えられるからです(バージョンなど)。

preprocessing.py
# --------------------------------------------------
# 分かち書きされたテキストの前処理
# --------------------------------------------------
import os
import re
import jaconv


# データ読み込み
with open('data/qiita_wakati.txt') as wakati_data:
    data = wakati_data.read()
    # 大文字→小文字
    data = data.lower()
    # 半角→全角
    data = jaconv.h2z(data)
    # 記号(-など)の正規化
    data = jaconv.normalize(data)
    # 数字の置き換え
    data = re.sub(r'[0-9]+', '0', data)

    # ファイル書き込み
    with open('data/qiita_corpus.txt', 'w') as f:
        f.write(data)

おわりに

前回→
Qiitaコーパスを作る会 1️⃣Qiitaの全記事を取得してみる
次回→
Qiitaコーパスを作る会 3️⃣単語埋め込みの様子を見てみる

4
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0