先日、ある実験で得られたテキストデータを分析、評価するために、形態素解析を行う機会があったため、その手順をまとめてみました。
形態素解析とは自然言語で書かれた文章を、辞書を元に、形態素(言語として意味を持つ最小単位)に分割し、それぞれに品詞や活用形情報を付加する一連の処理を指しています。
形態素解析の歴史は古く、1970年代から研究され、様々なアルゴリズムが提案されています。
今回の形態素解析には MeCab を使用しました。Mecab は京都大学とNTTコミュニケーション科学基礎研究所の共同研究プロジェクトで開発されたオープンソースの形態素解析エンジンで、既に多くの分野で活用されています。
MeCab を扱うスクリプト言語としては Python を選択しました。
解析環境の構築
まずは Python で MeCab を扱える環境を構築します。今回は Windows 上に環境を構築します。
Python のインストール
以下のURLから Python 3.x をダウンロードし、Python をインストールします。
https://pythonlinks.python.jp/ja/index.html
MeCab のインストール
以下のURLから MeCab (Binary package for MS-Windows) をダウンロードし、インストールします。
https://taku910.github.io/mecab/#download
文字コードにはUTF8を指定します。
mecab-python をインストール
コマンドプロンプトを起動し、以下のコマンドを入力し、mecab-python をインストールします。
python -m pip install mecab
MeCab による解析
以下のテキストファイルを作成します。
ファイル名:sample.txt
文字コード:UTF-8
ファイルの中身
吾輩は猫である。名前はまだ無い。 どこで生れたかとんと見当がつかぬ。
コマンドプロンプトを起動します。
以下のコマンドを実行し、一時的に出力をUTF8にします。(PowerShell では正しく出力されませんでした。)
chcp 65001
以下のコマンドを実行し、sample.txt の中身の形態素解析を行います。
mecab sample.txt
正常に実行できた場合、以下のように出力されます。
解析用スクリプトの作成と実行
形態素解析後、特定の品詞(名詞、形容詞、動詞、副詞)の形態素の数をカウントするために、以下のようなスクリプトを作成します。
ファイル名:count_words.py
文字コード:UTF-8
ファイルの中身
import MeCab
import time
import sys
# 引数で指定されたファイル名を取得
from sys import argv
input_file_name= sys.argv[1]
# ファイル名を出力
#print(input_file_name)
# 指定されたファイルを読み込む
with open(input_file_name, encoding="UTF-8") as f:
data = f.read()
# 形態素解析結果を取得する
text = MeCab.Tagger().parse(data)
#print(text)
# 形態素解析結果を改行で分割
lines = text.split("\n")
cnt_word = 0 # 名詞の数
words = [] # 単語リスト
# 各行ごとに処理を行う
for line in lines:
#形態素解析結果を分割
blocks = line.split("\t")
#print(blocks[1])
if len(blocks) > 1:
word = blocks[0] #対象文字列(例:すもも)
info = blocks[1] #品詞情報(例:名詞,一般,*,*,*,*,すもも,スモモ,スモモ)
items = info.split(",") #品詞情報を分割
if words.count(word) == 0:
for item in items:
#print(item)
# 対象文字の品詞が名詞、形容詞、動詞、副詞、いずれかの場合、カウンタをインクリメント
if item == "名詞" or item == "形容詞" or item == "動詞" or item == "副詞":
cnt_word += 1
words.append(word)
# 結果を出力する
print('Total : ' + str(cnt_word))
print('Words : ' + ', '.join(words))
以下のコマンドで、スクリプトを実行します。
python count_words.py input.txt
特定の品詞(名詞、形容詞、動詞、副詞)の形態素の合計と、対象となった形態素のリストが出力されます。
これはシンプルな例ですが、応用すると大量のテキストデータを、様々な角度から分析ができるようになります。