アンケートの自由記述、SNSの口コミ、日々蓄積されるメールや報告書。
こうした膨大な「文字のデータ」に埋もれた価値ある情報を見つけ出せるのが、テキストマイニングです。
そして、このテキストマイニングを行う上で最も広く使われているのが、プログラミング言語Pythonです。
この記事では、Pythonを使った日本語テキストマイニングの全手順を、初心者にもわかりやすく解説します。
環境準備から具体的なソースコードを使った実践まで、この記事一本でテキストマイニングの基本を理解できるでしょう。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
プログラミングスクール
■Webエンジニアの育成に特化 ■自社開発企業への転職成功率がダントツ ■ハイスキルを求める人に最適 |
|
■サポートは半永久的 ■単価80万円以上の講師陣 ■AWSやJavaに強い |
|
■受講料完全無料 ■最短1か月で卒業 ■教室への通学も可能 |
テキストマイニングとは
テキストマイニングとは、アンケートの自由記述、SNSの投稿、ニュース記事、メールといった、普段私たちが使っている「テキストデータ」の集まりから、有益な情報や知見を発見するための技術です。
文章は、そのままでは集計や分析が難しい「非構造化データ」に分類されます。
この膨大なテキストの海から、単語の出現頻度や単語同士の関連性などを分析し、「顧客の隠れたニーズ」や「話題のトレンド」、「評判の良し悪し」といった価値ある情報を掘り起こすのが、テキストマイニングの主な目的です。
単純なキーワード検索とは異なり、文章の構造や意味を考慮して、これまで気づかなかった視点を得られるのが大きな特徴です。
なぜPythonがテキストマイニングに最適なのか
テキストマイニングは様々なプログラミング言語で実行できますが、その中でも特にPythonが最適解として広く利用されています。
その理由は、主に以下の3つです。
専門的なライブラリが豊富
Pythonには、テキストマイニングを効率的に行うための「ライブラリ」と呼ばれる便利なツール群が数多く存在します。
日本語の文章を単語に分解するライブラリ(Janome
やMeCab
)から、分析や可視化を行うライブラリ(scikit-learn
やWordCloud
)まで、あらゆる処理が、先人たちの作ったライブラリによって簡単に実装できるのです。
文法がシンプルで学びやすい
Pythonは、他のプログラミング言語と比較して、文法がシンプルで人間が読んで理解しやすいように設計されています。
そのため、プログラミング初心者であっても学習のハードルが低く、テキストマイニングという本来の目的に集中しやすいでしょう。
情報が多く学習しやすい環境
世界中の開発者に利用されているため、インターネット上にはPythonに関する情報が溢れています。
書籍や学習サイトはもちろん、エラーの解決策や具体的な分析事例など、日本語の情報も豊富に見つかります。
学習の過程でつまずいたとしても、解決策を見つけやすいのは大きなメリットに違いありません。
Pythonでテキストマイニングを行うための環境準備
本格的な分析を始める前に、まずはPythonを実行する環境を整えましょう。
ここでは、初心者でも簡単にはじめられる環境と、Pythonでのテキストマイニングに必要なライブラリのインストール方法を紹介します。
おすすめの開発環境
テキストマイニングを始めるにあたって最もおすすめなのは、Googleが提供する「Google Colaboratory」です。
Webブラウザ上で動作するため、自身のPCに複雑な環境を構築する必要がありません。
無料で利用でき、分析に必要な主要なライブラリもあらかじめインストールされているため、すぐにテキストマイニングを試せます。
この記事で掲載するサンプルコードも、Google Colaboratoryで実行することを想定しています。
必要なライブラリのインストール
テキストマイニングでよく使うライブラリをインストールします。 Google Colaboratoryのノートブックを開き、最初のセルに以下のコードを入力して実行してください。
# 形態素解析ライブラリ
!pip install janome
# ワードクラウド作成ライブラリ
!pip install wordcloud
上記のコードを解説します。
!pip install
は、ライブラリを追加でインストールするための命令文です。janome
は、日本語の文章を単語単位に分割(形態素解析)するために利用します。wordcloud
は、単語の出現頻度を視覚的に表現する「ワードクラウド」を作成するためのライブラリです。- 上記に加え、
import japanize_matplotlib
という一行を実行すれば、グラフなどに日本語を表示した際の文字化けを防いでくれます。
これだけで、日本語のテキストマイニングを行うための準備は完了です。
PythonでのテキストマイニングをSTEP方式で徹底解説
それでは、実際にPythonを使ったテキストマイニングの一連の流れを解説していきます。
今回は、誰でも利用できる夏目漱石の小説『こころ』を題材に、4つのステップで分析を進めます。
【STEP1】データの準備
最初に、分析対象となるテキストデータを準備します。
今回は、著作権が切れた作品を公開している「青空文庫」から、『こころ』のテキストファイルを取得しましょう。
import requests
import re
# 青空文庫から『こころ』のテキストデータを取得
url = 'https://www.aozora.gr.jp/cards/000148/files/773_14560.html'
response = requests.get(url)
response.encoding = 'shift_jis'
text = response.text
# テキストの冒頭部分を確認
print(text[:300])
# 注釈やルビなどの不要な部分を削除
text = re.sub(r'《.+?》', '', text) # ルビの削除
text = re.sub(r'[#.+?]', '', text) # 注釈の削除
text = re.sub(r'\n|\r', '', text) # 改行の削除
text = re.sub(r'|', '', text) # ルビの開始記号の削除
text = re.sub(r' ', '', text) # 全角スペースの削除
このコードでは、requests
ライブラリを使って指定したURLからテキストデータを取得しています。
青空文庫のテキストファイルはShift-JISという文字コードで保存されているため、response.encoding = 'shift_jis'
で文字化けを防ぐ設定をしました。
取得したテキストには、読み仮名である「ルビ」や編集者による「注釈」が含まれています。
これらは分析のノイズになるため、正規表現という機能(re.sub
)を使って一括で削除しています。
最後に、不要な改行やスペースも取り除き、分析しやすいようにデータをクレンジングする(整える)ことができました。
【STEP2】テキストの前処理
次に、クレンジングしたテキストデータを、プログラムが分析しやすいようにさらに加工します。
この「前処理」は、テキストマイニングの精度を左右する非常に重要な工程です。
from janome.tokenizer import Tokenizer
# Janomeのインスタンスを作成
t = Tokenizer()
# 形態素解析を行い、必要な品詞の単語のみを抽出する
words = []
for token in t.tokenize(text):
# 品詞を取得
part_of_speech = token.part_of_speech.split(',')[0]
# 分析対象とする品詞を指定(ここでは名詞、動詞、形容詞)
if part_of_speech in ['名詞', '動詞', '形容詞']:
# 活用形などを考慮し、単語の原形を取得
words.append(token.base_form)
日本語は英語と違って単語と単語の間にスペースがないため、まず文章を単語に分解する必要があります。
この処理を「形態素解析」と呼び、Janome
ライブラリがその役割を担います。
t.tokenize(text)
で文章を形態素(意味を持つ最小単位)に分割し、for
ループで一つずつ取り出します。
そして、token.part_of_speech
で品詞を判定し、「名詞」「動詞」「形容詞」といった意味を持つ単語だけを抽出しました。
また、「歩いた」「歩こう」のような活用形は、token.base_form
を使って「歩く」という原形に統一しています。
これにより、同じ意味の単語を正確にカウントできるようになるでしょう。
【STEP3】単語の頻度分析
前処理で単語のリストが作成できたので、いよいよ分析に入ります。
ここでは、どの単語が『こころ』の中で多く使われているのか、出現頻度を数えてみましょう。
import pandas as pd
# 単語のリストをPandasのSeriesオブジェクトに変換
word_series = pd.Series(words)
# 各単語の出現回数をカウント
word_counts = word_series.value_counts()
# 上位20単語を表示
print(word_counts.head(20))
この処理には、データ分析で頻繁に利用されるpandas
ライブラリを使いました。
pd.Series(words)
で単語のリストをpandasが扱いやすいデータ形式に変換し、.value_counts()
を呼び出すだけで、あっという間に各単語の出現回数を集計してくれます。
最後のprint(word_counts.head(20))
で、集計結果の中から出現回数が多い上位20単語を画面に表示させています。
実行結果では、一般的に「する」「いる」「なる」といった基本的な動詞や、「私」「先生」「自分」といった『こころ』の登場人物やテーマに関連する単語が上位に来ることが予想されます。
【STEP4】分析結果の可視化
最後に、集計結果をグラフにして視覚的にわかりやすく表現します。
数値の羅列だけでは伝わりにくい情報も、可視化することで直感的に理解できるようになります。
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import japanize_matplotlib
# フォントのパスは環境に合わせて変更してください(Google Colabの例)
font_path = '/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf'
# ストップワード(一般的すぎる単語)を除外
stop_words = ['する', 'いる', 'なる', 'ある', 'よう', '思う', 'ない', 'もの', 'いう', '事']
# word_countsからストップワードを除外
word_counts_filtered = word_counts[~word_counts.index.isin(stop_words)]
# ワードクラウドの作成
wordcloud = WordCloud(
background_color="white",
font_path=font_path, # 日本語フォントのパス
width=800,
height=600
).generate_from_frequencies(word_counts_filtered)
# ワードクラウドの表示
plt.figure(figsize=(10, 8))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.title("『こころ』における単語の出現頻度(ワードクラウド)")
plt.show()
まず、「する」「いる」といった、どの文章にも頻出するものの、作品固有の特徴とは言えない単語(ストップワード)をリストから除外しました。
その後、WordCloud
ライブラリを使ってワードクラウドを作成しています。
出現頻度が高い単語ほど、大きく表示されるのが特徴です。
font_path
で日本語が表示できるフォントを指定するのが、文字化けさせないための重要なポイントになります。
# 頻出単語トップ20の棒グラフを作成
top_20_words = word_counts_filtered.head(20)
plt.figure(figsize=(12, 8))
plt.bar(range(len(top_20_words)), top_20_words.values)
plt.xlabel('単語')
plt.ylabel('出現回数')
plt.title('『こころ』における頻出単語トップ20')
plt.xticks(range(len(top_20_words)), top_20_words.index, rotation=45, ha='right')
plt.tight_layout()
plt.show()
次に、matplotlib
ライブラリを使って、頻出単語トップ20の棒グラフを作成しました。japanize_matplotlib
をインポートしているため、グラフのタイトルや軸ラベルも問題なく日本語で表示できます。
ワードクラウドと棒グラフ、両方から「私」「先生」「自分」「人」「K」といった単語が特に重要であることが予想され、『こころ』の主要なテーマや登場人物を反映した結果が得られると考えられます。
さらに高度なテキストマイニング方法
今回ご紹介した手法はテキストマイニングの基礎ですが、Pythonを使えばさらに高度な分析も可能です。
【TF-IDF】
単純な出現回数ではなく、「その文書の中ではよく出てくるが、他の文書ではあまり出てこない」という、文書を特徴づける重要な単語を数値化する手法です。
【共起ネットワーク】
「この単語とこの単語は、文章中で一緒に出現しやすい」という単語同士のつながり(共起関係)を分析し、ネットワーク図として可視化する手法になります。単語間の隠れた関係性を発見できるでしょう。
【感情分析(ポジネガ分析)】
文章に含まれる単語から、その文章がポジティブな内容か、ネガティブな内容かを判定する分析です。商品レビューの評価分析や、SNSでのブランドイメージ調査などに活用されています。
これらの手法は、scikit-learn
などのライブラリを活用することで実装できます。
まとめ
以上、Pythonでのテキストマイニングについて、詳しく解説してきました。
なお、Pythonを体系的に学んだり、Pythonのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。