業務改善 web開発 programming 旅行系記事多め。

【PythonとMeCabで簡単実装】日本語コーパス(テキストデータ)の前処理方法

deeplearning自然言語処理

ぱらげです。
自然言語処理を行うにあたって、コンピュータに「単語の意味」を理解させるために、コーパス(テキストデータ)内の単語と単語を分割する「前処理」をします。英語文章ではあらかじめスペースによって単語同士が分かれていますが、日本語文章も同様に単語同士を分割する必要があります。
日本語の場合、形態素解析によって分割された単語と単語の間にスペースを含めて書き下ろすこと(分かち書き)ができます。

今回は形態素解析システム「MeCab」を使用して、日本語コーパスの前処理方法をご紹介します。

コーパスファイルの読み込み

今回コーパスに使用するテキストデータとして「青空文庫」を使用します。
青空文庫では近代文学など著作権が切れた作品のテキストデータを無料で公開しています。

こちらに公開されているアインシュタインの「相対性理論」をコーパスに使用したいと思います。
「ファイルをダウンロード」をクリックし、「テキストファイル」と記載されている箇所のファイル名をクリックするとzipファイルがダウンロードされますので、任意のパスにテキストファイルを設置してください。

import re
import os.path

def convert(textFileName):
    data = open(textFileName, 'rb').read() #該当ファイルをバイナリモードで読み込む
    text = data.decode('shift_jis') #shift_jisに従ってデコードし、テキストを取得

    # 本文抽出
    text = re.split(r'\-{5,}', text)[2] #ハイフン「-」を5回以上くり返す部分を削除し、これを区切り文字として分割されたうちの3番目の要素を取り出す
    text = re.split(r'底本:', text)[0] #「底本:」を削除し、これを区切り文字として分割されたうちの1番目の要素を取り出す
    text = re.split(r'[#改ページ]', text)[0] #「[#改ページ]」を削除し、これを区切り文字として分割されたうちの1番目の要素を取り出す

    # ノイズ削除
    text = re.sub(r'《.+?》', '', text) #《ルビ》
    text = re.sub(r'[#.+?]', '', text) #[注記]
    text = re.sub(r'|', '', text) #ルビ付き文字列の開始位置
    text = re.sub(r'\r\n', '', text) #改行コード
    text = re.sub(r'\u3000', '', text) #全角スペース 

    return text

上記はファイルを読み込むための関数です。次のコードで実際にファイルが読み込めるか確認してみましょう。

text = convert('sotaisei_riron.txt')
print(text)

MeCabでテキストデータの単語同士を分割する

次にMeCabと、文中の単語を引くための辞書として推奨されているUniDicをインストールします。

!pip install mecab-python3
!pip install unidic

次にUniDicに同梱のdownload.pyファイルを実行して、辞書データをダウンロードします。ダウンロードには少し時間がかかります。

!python -m unidic download

形態素解析では文章を単語へと分解して、名詞、動詞などその品詞を特定したり、語尾変化を特定したりするのですが、まさにそのような解析が以下の結果で行われていることがわかります。

import MeCab
import unidic

wakati = MeCab.Tagger()
result = wakati.parse(text)
print(result)

また、単語をスペースで分割する「分かち書き」を行うには、以下のようにMeCab.Taggerクラスのインスタンス生成時に、以下のように「-Owakati」オプションを指定します。

wakati = MeCab.Tagger('-Owakati')
result = wakati.parse(text)

単語同士がスペースによって分割されていることがわかります。
これで日本語コーパスの前処理ができました。

コメント

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