blog

Pythonでテキストマイニングをする方法を詳しく解説します!

テキストマイニングとは、膨大なテキストデータから価値ある情報を抽出する一連の分析作業です。基本的な概念・ツール・活用事例についてはテキストマイニングの親記事で詳しく解説しています。本記事では「Pythonを使って実際にテキストマイニングを実装する方法」に特化し、形態素解析・センチメント分析・クラスター分析・主成分分析・ワードクラウドの5手法を、動くコードとともに徹底解説します。

目次

なぜPythonでテキストマイニングを行うのか

テキストマイニングを行う手段はさまざまありますが、現場でもっとも広く使われているのがPythonです。その理由は大きく2つあります。

1. 文法がシンプルで習得しやすい

Pythonの最大の特徴は文法のシンプルさです。初心者から職業プログラマーまで幅広く使用されており、プログラミングを専門としていない数学・統計のスペシャリストにも扱いやすい設計になっています。YouTubeやInstagramなどの大規模サービスがPythonをコアシステムに採用していることも、その信頼性の高さを示しています。機械学習エンジニアやデータサイエンティストの多くが数理系バックグラウンドを持つことを考えると、Pythonが機械学習・データ分析の標準言語として定着している理由が理解できます。

2. ライブラリが圧倒的に豊富

開発中に「こんな機能が欲しい」と思ったとき、Pythonではその大半がすでにライブラリとして公開されています。形態素解析・感情分析・クラスタリング・可視化など、テキストマイニングに必要な機能のほぼすべてが専用ライブラリとして提供されており、数十行のコードで実用的な分析が完結します。このライブラリの豊富さこそが、他言語よりも短いコードでテキストマイニングを実現できる理由です。

Python実行環境の準備(Google Colaboratory)

Pythonを使うには「Anaconda」「PyCharm」のインストール、コマンドプロンプトからの実行など複数の方法がありますが、最も手軽に始められる方法がGoogle Colaboratory(以下 Colab)の利用です。

Google Colaboratory(公式)

ColabはGoogleが提供するブラウザ上のPython実行環境で、インストール作業が不要、Googleアカウントがあれば数分で分析を開始できます。大学の研究データ分析や商業データ分析など、現場でも広く使われている信頼性の高い環境です。

基本的な使い方:

  1. 上記リンクにアクセスする
  2. 左上の「コード+」をクリックしてコードセルを追加する
  3. セル内にコードを入力し、左の再生ボタン(▶)をクリックして実行する

Python自体の文法を深く学びたい場合はPython公式チュートリアルを参照してください。本記事で紹介するコードの仕組みも理解しやすくなります。

テキストマイニングの5つの手法:概要

本記事で解説する5つの手法の位置づけを整理します。

手法 目的・概要 主な用途
形態素解析 文章を意味を持つ最小単位(形態素)に分割し、品詞・読みなどを取得 全手法の前処理として必須
センチメント分析 文章からポジティブ/ネガティブの感情を読み取る レビュー分析、SNSモニタリング
クラスター分析 複数の変数を持つ個体を「似た性質」のグループに分類 顧客セグメンテーション、文書分類
主成分分析 多変数データを少数の主成分に次元圧縮して可視化・解釈 特徴量削減、データ可視化
ワードクラウド 単語の出現頻度を視覚化し、重要語を大きく表示 スピーチ分析、コメント要約

形態素解析は残り4つの手法すべての前提となる処理です。「文章をどう分割するか」が後続の分析精度を左右します。テキストマイニングの実際のビジネス応用事例についてはテキスト・マイニングの応用もあわせてご覧ください。

単語の出現頻度を視覚化したワードクラウドのイメージ
単語の出現頻度を視覚化したワードクラウドのイメージ

形態素解析:すべての起点となるテキスト前処理

形態素とは「言葉が意味を持つまとまりの最小単位」のことで、形態素解析とは文章を形態素に分割し、各形態素の品詞・活用形・読み方などの情報を取得・分析することです。テキストマイニングにおいてはこの工程なしに後続の分析は成り立ちません。

MeCabとJanome:主要な形態素解析システムの比較

Pythonで形態素解析を行う際は、既存の形態素解析システムをライブラリとして利用します。代表的な選択肢を以下に整理します。

システム 実装言語 特徴 Pythonでの利用
MeCab C++(コアエンジン) 高速・高精度・広く採用されている mecab-python3 ライブラリ経由
Janome Pure Python インストールが容易、MeCabと同等アルゴリズム。実行速度はやや劣る pip install janome のみで完結
JUMAN Common Lisp 京都大学が開発。文脈依存解析が得意 Juman++ (Python binding あり)

本記事では最もメジャーなMeCab(mecab-python3)を用いて解説します。

MeCabのインストール

Google Colab上で実行する場合、以下のコードでMeCabと辞書をインストールします。

# MeCab-Python3 導入コード
!pip install mecab-python3   # 本体インストール
!pip install unidic-lite     # 辞書インストール

分かち書き:形態素解析の基礎操作

「分かち書き」とは、与えられた文章を形態素単位に分割して区切り表現することです。これが形態素解析の最も基礎的な操作であり、後続の集計・分析処理の入力データになります。

以下のコードで、日本語2文と英文1文を分かち書きしてみます。

# 分かち書き実践
import MeCab  # Mecabインポート
wakati = MeCab.Tagger("-Owakati")  # 分かち書きモードのインスタンス作成
print(wakati.parse("AIと機械学習と人工知能、これらはそれぞれ少しずつ違う概念です。").split())
print(wakati.parse("今日のお昼ご飯は「ラーメン」です。").split())
print(wakati.parse("I will do my best.").split())

出力結果:

['AI', 'と', '機械', '学習', 'と', '人工', '知能', '、', 'これ', 'ら', 'は', 'それぞれ', '少し', 'ずつ', '違う', '概念', 'です', '。']
['今日', 'の', 'お', '昼ご飯', 'は', '「', 'ラーメン', '」', 'です', '。']
['I', 'will', 'do', 'my', 'best', '.']

形態素解析システムによる分割の違い

「形態素」は意味を持つ最小単位ですが、どこで区切るかはシステムによって異なります。たとえば上記の「少しずつ」という表現をMeCabで解析すると「少し」「ずつ」の2形態素に分割されます。一方、京都大学が開発した形態素解析システム「JUMAN」で同じ文章を解析すると「少しずつ」が1形態素として扱われます。

この違いはシステムが参照する辞書・コーパスとアルゴリズムの違いに由来するものであり、どちらが絶対的な正解というわけではありません。目的や対象テキストの特性に応じてシステムや辞書のパラメータを選択・調整することが重要です。

また英文については、MeCabの辞書が英語に対応していないため品詞の正確な判別ができず、すべて「名詞-普通名詞-一般」として扱われます。英語テキストの解析にはNLTKやspaCyなどの英語対応ライブラリを使用する必要があります。

品詞情報つき形態素解析の実行

分かち書きだけでなく、品詞・活用形・読み方などの詳細情報を含む形態素解析を実行するには、TaggerのモードをデフォルトのIPA形式に切り替えます。

# 形態素解析をMecab-Python3で実行
tagger = MeCab.Tagger()  # tagger変数を形態素解析を行うインスタンスに設定

print(tagger.parse("AIと機械学習と人工知能、これらはそれぞれ少しずつ違う概念です。"))
print(tagger.parse("I will do my best."))

出力結果(1文目):

AI  AI  AI  AI  名詞-普通名詞-一般  0
と  ト  ト  と  助詞-格助詞
機械  キカイ  キカイ  機械  名詞-普通名詞-一般  2
学習  ガクシュー  ガクシュウ  学習  名詞-普通名詞-サ変可能  0
と  ト  ト  と  助詞-格助詞
人工  ジンコー  ジンコウ  人工  名詞-普通名詞-一般  0
知能  チノー  チノウ  知能  名詞-普通名詞-一般  1
、      補助記号-読点
これ  コレ  コレ  此れ  代名詞  0
ら  ラ  ラ  等  接尾辞-名詞的-一般
は  ワ  ハ  は  助詞-係助詞
それぞれ  ソレゾレ  ソレゾレ  其々  名詞-普通名詞-副詞可能  2,3
少し  スコシ  スコシ  少し  副詞  2
ずつ  ズツ  ズツ  ずつ  助詞-副助詞
違う  チガウ  チガウ  違う  動詞-一般  五段-ワア行  連体形-一般  0
概念  ガイネン  ガイネン  概念  名詞-普通名詞-一般  1
です  デス  デス  です  助動詞  助動詞-デス  終止形-一般
。      補助記号-句点
EOS

MeCabが形態素ごとに返す情報は以下の通りです。

  • surface(表層形):テキスト上に実際に現れている形
  • part_of_speech(品詞):品詞情報1つ+細分類3つの計4情報
  • infl_type(活用型):五段活用・下一段活用など
  • infl_form(活用形):終止形・連体形・連用形など
  • base_form(基本形):辞書登録形(原形)
  • reading(読み):カタカナ表記の読み方
  • phonetic(発音):実際の発音形

形態素解析の仕組みや他のシステムとの詳細な比較については形態素解析について、Python実装を交えて解説します!で詳しく説明しています。また自然言語処理全体の概念については自然言語処理(NLP)とは?AI技術自然言語処理方法解説も参照してください。

以降のクラスター分析・主成分分析・センチメント分析・ワードクラウドはすべて、この形態素解析の結果(特に「分かち書き」で得られた形態素列)を入力として利用します。形態素解析がテキストマイニングにおける「最初の一歩」であることが、ここからも明確に分かります。

センチメント分析:文章からポジティブ/ネガティブを判定する

センチメント分析(感情分析)は、レビュー・SNSコメント・アンケート自由記述などのテキストデータから、書き手が持つ感情の傾向を自動的に判定する技術です。ECサイトの商品レビュー分析、カスタマーサポートの優先度判断、ブランド評判モニタリングなどに広く活用されています。

使用ライブラリ

  • oseti:日本語感情分析ライブラリ(文章がPositive/Negativeである確率を返す)
  • MeCab:形態素解析(osetiが内部で使用)
  • asari:日本語感情分析ライブラリ(Sonar APIを提供)

ライブラリのインストール(下準備)

%%capture capt
# MeCabのインストール
!apt install mecab libmecab-dev mecab-ipadic-utf8
!pip install mecab-python3

# mecab-ipadic-NEologdのインストール(新語・固有名詞に強い拡張辞書)
!apt install git make curl xz-utils file
!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -a
!ln -s /etc/mecabrc /usr/local/etc/mecabrc

# 感情分析のためのライブラリ
!pip install -q asari oseti pymlask
# asari==0.0.4 は Janome==0.3.7 が必要
!pip install Janome==0.3.7

分析対象の文章を準備する

list_text = [
    'この人は、この世の中で、いちばんしあわせな人にちがいありません。',
    '芝居小屋もすばらしいし、お客さんもすばらしい人たちでした。',
    'もし中世の時代だったら、おそらく、火あぶりにされたでしょうよ。',
    'みんなのうるさいことといったら、まるで、ハエがびんの中で、ブンブンいっているようでした。',
    'われわれ人間が、こういうことを考えだすことができるとすれば、われわれは、地の中にうめられるまでに、もっと長生きできてもいいはずだが'
]

センチメント分析の実行

%%capture capt
from asari.api import Sonar
sonar = Sonar()
list(map(sonar.ping, list_text))

出力結果:

[{'classes': [{'class_name': 'negative', 'confidence': 0.104},
              {'class_name': 'positive', 'confidence': 0.896}],
  'text': 'この人は、この世の中で、いちばんしあわせな人にちがいありません。',
  'top_class': 'positive'},

 {'classes': [{'class_name': 'negative', 'confidence': 0.036},
              {'class_name': 'positive', 'confidence': 0.964}],
  'text': '芝居小屋もすばらしいし、お客さんもすばらしい人たちでした。',
  'top_class': 'positive'},

 {'classes': [{'class_name': 'negative', 'confidence': 0.582},
              {'class_name': 'positive', 'confidence': 0.418}],
  'text': 'もし中世の時代だったら、おそらく、火あぶりにされたでしょうよ。',
  'top_class': 'negative'},

 {'classes': [{'class_name': 'negative', 'confidence': 0.269},
              {'class_name': 'positive', 'confidence': 0.731}],
  'text': 'みんなのうるさいことといったら、まるで、ハエがびんの中で、ブンブンいっているようでした。',
  'top_class': 'positive'},

 {'classes': [{'class_name': 'negative', 'confidence': 0.051},
              {'class_name': 'positive', 'confidence': 0.949}],
  'text': 'われわれ人間が、こういうことを考えだすことができるとすれば、われわれは、地の中にうめられるまでに、もっと長生きできてもいいはずだが',
  'top_class': 'positive'}]

各文の結果は以下の形式で返されます。

{classes: [{negative, ネガティブ確率}, {positive, ポジティブ確率}], 対象テキスト, top_class: 確率が高い判定}

分析結果の考察と精度の限界

文章(冒頭) 判定結果 Positive確率 直感的解釈
この人は…いちばんしあわせな人に… positive 89.6% ✓ 妥当
芝居小屋もすばらしいし… positive 96.4% ✓ 妥当
もし中世の時代だったら、火あぶりに… negative 41.8% ✓ 妥当
ハエがびんの中でブンブン… positive 73.1% △ 疑問あり(ネガティブ表現)
われわれ人間が…長生きできてもいい… positive 94.9% △ 文脈次第で解釈が変わる

4文目「みんなのうるさいことといったら、まるで、ハエがびんの中で、ブンブンいっているようでした。」は、直感的にはネガティブな表現ですが、このシステムではPositiveと判定されています。現状の日本語センチメント分析システムは、比喩表現・反語・婉曲表現などの複雑な文脈に対してはまだ精度が不安定な面があります。実務での活用においては、誤判定が一定数含まれることを前提として設計することが重要です。

2026年時点では、LLM(大規模言語モデル)をベースにしたFew-shot学習によるセンチメント分析も実用化が進んでおり、比喩や文脈依存表現への対応精度が大幅に向上しています。ルールベースライブラリと組み合わせた使い方も検討に値します。

クラスター分析:似た性質のデータをグループ化する

クラスター分析とは、複数の変数(例:人間各個体の「身長」「体重」「年齢」「居住地域」)を持つ個体群を、似た性質ごとにグルーピングする統計学的手法です。テキストマイニングにおいては、形態素解析で得られた文書ベクトルを用いて「類似した内容の文書を同じクラスターにまとめる」用途に活用されます。

階層的クラスタリングと非階層的クラスタリング

クラスター分析には大きく2種類あります。

階層的クラスタリング

クラスターを段階的に形成する手法。結果をデンドログラム(樹形図)で可視化できる。

  • 凝集法(bottom-up):個体を1つずつのクラスターとして出発し、距離の近いものを順次統合していく
  • 分割法(top-down):全体を1つのクラスターとして出発し、順次分割していく
非階層的クラスタリング(k-means等)

事前に決めたクラスター数に基づき、全個体を一度に分類する。大規模データに適している。

  • 計算が高速でスケーラブル
  • クラスター数kを事前指定する必要がある
  • 初期値依存性があるため複数回試行が推奨

今回は「階層的クラスタリング(凝集法)」をPythonで実装します。

1. Google Drive接続〜下準備

Google Colab上でCSVファイルのデータを読み込む場合、まずGoogle Driveに接続します。

from google.colab import drive
drive.mount('/content/drive')

次に必要なモジュールをインポートし、データを読み込みます。

import numpy as np
import pandas as pd                          # データ構造取扱モジュール
import scipy.cluster.hierarchy as sch        # クラスター分析のためのモジュール
import matplotlib.pyplot as plt              # グラフ描画
from sklearn.cluster import AgglomerativeClustering  # モデル学習のためのモジュール

df = pd.read_csv("/content/drive/MyDrive/sample_data (2).csv")  # データ取り込み
print(df.tail(20))  # 末尾20行を確認

今回使用するデータは、各個人(計100人)について「性別」「年齢」「職業」「年収」「マンション家賃」の情報を持つデータセットです。末尾20件の出力イメージは以下の通りです。

ID 性別 年齢 職業 年収[万円] マンション費用[万円/月]
80 46 芸能関係 577 9
81 48 商社 577 7
87 45 公務員 900 33
90 55 IT関係 1000 38
92 34 政治家 1200 40
99 29 製造業 1000 20

2. デンドログラムの描画によるクラスター数の決定

今回は「年収」と「マンション家賃」の2変数に注目して、凝集型の階層的クラスタリングを行います。デンドログラム(樹形図)を描画することで、適切なクラスター数を視覚的に決定できます。

# クラスタリング軸設定(年収 vs マンション費用)
X = df.iloc[:, [3, 4]].values

# 樹形図(デンドログラム)作成
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))

# 可視化
plt.title('Dendrogram')
plt.xlabel('Salary vs Apartment Cost')
plt.ylabel('Euclidean distances')
plt.show()

デンドログラムの読み方:縦軸の値をAとしたとき、縦軸A=一定の水平線を引いた際にデンドログラムの縦線と交差する数が「そのレベルでのクラスター数」を表します。例えば縦軸値1500の水平線を引くとデンドログラムと3箇所で交差する場合、クラスター数は3です。今回は5クラスターで分析を進めます。

3. モデル学習とクラスターの可視化

# モデル訓練(n_clusters=5でクラスター分析)
hir_clus = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
y_hir_clus = hir_clus.fit_predict(X)

パラメータの意味:

  • n_clusters:クラスター数(デンドログラムで決定した5を指定)
  • affinity:距離の計算方法(euclidean=ユークリッド距離)
  • linkage:クラスター間の結合方法(ward法=クラスター内分散を最小化)
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

# クラスターの配列情報
cluster_labels = np.unique(y_hir_clus)
n_clusters = cluster_labels.shape[0]

# クラスター可視化(散布図)
for i in range(len(cluster_labels)):
    color = cm.jet(float(i) / n_clusters)  # クラスター別に色指定
    plt.scatter(X[y_hir_clus == i, 0], X[y_hir_clus == i, 1],
                s=50, c=color, label='Cluster' + str(i))

plt.title('Clusters of customers')
plt.xlabel('Salary')
plt.ylabel('Apartment Cost')
plt.legend(loc="best")
plt.show()

実行結果として、横軸が年収・縦軸が家賃の散布図に5つのクラスターが色別で表示されます。デンドログラムによって分割数を適切に決めたため、各クラスターが空間的に明確に分離した形でグルーピングされていることが確認できます。

主成分分析:多変数データを圧縮して可視化する

主成分分析(PCA: Principal Component Analysis)は、複数の変数を持つデータについて「似た性質を持つ変数」を発見し、情報の損失を最小限に抑えながら少数の新たな変数(主成分)に集約する統計学的手法です。5変数のデータを2変数に圧縮することで、2次元の散布図として可視化でき、データの全体像が直感的に把握できるようになります。

主成分分析の数学的背景

主成分分析の核心は「相関行列の固有値・固有ベクトルを求めること」です。各変数のばらつき(分散)が最大になるように新たな軸(主成分)を設定することが主成分分析の目的ですが、この操作と相関行列の固有値分解は数学的に等価であるため、固有値分解によって主成分を効率的に算出できます。

主成分分析の流れ

①データ読み込み
②相関行列確認
③固有値・固有ベクトル算出
④主成分数選択
⑤主成分分析
⑥グラフ可視化

モジュールのインポート

import numpy as np               # 数値計算モジュール
from matplotlib import pyplot as plt
%matplotlib inline               # グラフのインライン表示

データの読み込みと相関行列の算出

今回は不動産データを使用します。各物件について「家賃」「建物面積」「土地面積」「築年数」の4変数があり、それぞれ5段階でスコア化されています。

# 不動産データ
# 各列: 家賃(~5万:1, 5~7万:2, 7~9万:3, 9~11万:4, 11万~:5)
#       建物面積(~50m²:1, 50~75m²:2, 75~100m²:3, 100~125m²:4, 125m²~:5)
#       土地面積(同上)
#       築年数(~5年:1, 5~10年:2, 10~15年:3, 15~20年:4, 20年~:5)
data = np.array([
    ['house-A',     3, 5, 4, 3],
    ['house-B',     3, 4, 4, 2],
    ['apartment-A', 1, 2, 2, 5],
    ['apartment-B', 3, 2, 2, 4],
    ['house-C',     4, 3, 3, 3],
    ['apartment-C', 3, 2, 3, 4],
    ['house-D',     5, 5, 5, 2],
    ['apartment-D', 4, 2, 1, 5],
    ['apartment-E', 3, 3, 2, 5],
    ['house-E',     5, 5, 4, 2],
])

d = data[:, 1:].astype(np.int64)          # 数値列を整数型に変換

X = (d - d.mean(axis=0)) / d.std(ddof=1, axis=0)  # データの標準化

XX = np.round(np.dot(X.T, X) / (len(X) - 1), 2)   # 相関行列
print(XX)

相関行列(出力結果):

[[ 1.    0.55  0.46 -0.6 ]
 [ 0.55  1.    0.87 -0.82]
 [ 0.46  0.87  1.  -0.91]
 [-0.6  -0.82 -0.91  1.  ]]

相関行列から「建物面積と土地面積(相関係数0.87)」「築年数と土地面積(相関係数-0.91)」など、高い相関関係を持つ変数の組み合わせが読み取れます。これらを主成分として統合することで次元圧縮が可能になります。

主成分の算出

# 相関行列の固有値・固有ベクトルを求める
w, V = np.linalg.eig(XX)

# 第1主成分(Z1)を求める
z1 = np.round(np.dot(X, V[:, 0]), 1) * -1

# 第2主成分(Z2)を求める
z2 = np.round(np.dot(X, V[:, 1]), 1)

散布図として可視化

# グラフ用オブジェクトの生成
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
ax.grid()

# 描画範囲の設定
lim = [-2.5, 2.5]
ax.set_xlim(lim)
ax.set_ylim(lim)

# 軸を中央に配置
ax.spines['bottom'].set_position(('axes', 0.5))
ax.spines['left'].set_position(('axes', 0.5))
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

# 目盛の設定
ticks = np.arange(-2.5, 2.5, 0.5)
ax.set_xticks(ticks)
ax.set_yticks(ticks)

# 軸ラベルの追加
ax.set_xlabel('Z1', fontsize=16)
ax.set_ylabel('Z2', fontsize=16, rotation=0)
ax.xaxis.set_label_coords(1.02, 0.49)
ax.yaxis.set_label_coords(0.5, 1.02)

# データのプロット
for (i, j, k) in zip(z1, z2, data[:, 0]):
    ax.plot(i, j, 'o')
    ax.annotate(k, xy=(i, j), fontsize=16)

plt.show()

結果として、元々4変数だったデータが2変数(Z1, Z2)に圧縮された散布図が得られます。第1主成分Z1はデータの総合指標を表すことが多く、今回の分析ではhouse-Eが最もZ1の値が高く(右側に位置し)、総合的に最もパフォーマンスの高い物件であることが散布図から一目で読み取れます。apartment-Aはその反対側に位置しており、相対的な特性の差異が視覚的に明確になっています。

ワードクラウド:単語の出現頻度を視覚化する

ワードクラウドは、文章内での単語の出現回数をもとに、重要な単語を色や大きさで視覚的に強調して一枚の図に表現する手法です。スピーチ原稿・SNSの全コメント・アンケート自由記述など、長文テキストの全体傾向を素早く把握するのに非常に効果的です。

ワードクラウドのサンプル:出現頻度に応じたサイズと色で単語が配置されている
ワードクラウドのサンプル:出現頻度に応じたサイズと色で単語が配置されている

ワードクラウド作成の流れ

①wordcloudモジュールをインストール
②モジュールのimport
③テキストファイルの読み込み
④ワードクラウドの生成・保存

インストールとインポート

# インストール(コマンドプロンプト / ターミナル)
pip3 install WordCloud
# Pythonコード内でのインポート
from wordcloud import WordCloud

テキストファイルの読み込みとワードクラウドの生成

# テキストファイルの読み込み
text_file = open("test.txt")    # test.txt は入力テキストファイルのパス
textdata = text_file.read()     # テキストの読み込み

# ワードクラウドの作成・保存
wordcloud = WordCloud(
    background_color="white",
    font_path="C:\\Windows\\Fonts",  # Windowsの場合
    # font_path="/usr/share/fonts"  # Ubuntuの場合
    width=1200,
    height=900
).generate(textdata)

wordcloud.to_file("./sample.png")  # ./sample.png に出力

主なパラメータの説明:

パラメータ 説明 設定例
background_color 背景色 “white” または “black”
font_path 使用フォントのパス Windows: C:\Windows\Fonts, Ubuntu: /usr/share/fonts
width / height 出力画像サイズ(ピクセル) width=1200, height=900
max_words 表示する最大単語数 200(デフォルト)
stopwords 除外するストップワードのセット {“the”, “and”, “is”} などの助詞・冠詞
colormap 色のカラーマップ “viridis”, “plasma” など matplotlib の colormap

実行例:英文テキストへの適用

今回の入力テキストにはトランプ前大統領の就任演説を使用しました。出力されたワードクラウドでは「America」という単語が圧倒的に大きく表示され、「アメリカファースト」というメッセージが視覚的に一目で伝わる結果となっています。ワードクラウドは、長文スピーチの全体的なテーマやメッセージを短時間で把握するのに非常に効果的な手法です。

日本語テキストへのワードクラウド適用

日本語テキストにワードクラウドを適用する場合は、英語と違って単語間にスペースがないため、そのままでは単語の区切りが認識できません。MeCabによる分かち書きを前処理として組み合わせることで対応できます。

import MeCab
from wordcloud import WordCloud

# 分かち書きで単語をスペース区切りに変換
wakati = MeCab.Tagger("-Owakati")
text_jp = "今日の東京は天気がよく、多くの人が公園でのんびりと過ごしていた。"
wakati_text = wakati.parse(text_jp)

# ワードクラウドの生成
wc = WordCloud(
    font_path="/path/to/japanese_font.ttf",  # 日本語フォントのパスを指定
    background_color="white",
    width=800,
    height=600
).generate(wakati_text)

wc.to_file("./wordcloud_japanese.png")

注意点として、日本語ワードクラウドでは日本語フォントのパス指定が必須です。フォントを指定しないと文字化けが発生します。また、「は」「の」「が」「を」などの助詞・助動詞はストップワードとして除外処理することで、より意味のある単語だけをワードクラウドに反映できます。

ワードクラウドの活用場面

  • マーケティング:SNS上の自社ブランドへのコメントから頻出単語を可視化し、消費者の関心傾向を把握
  • カスタマーサポート:問い合わせ内容の全体傾向を即座に把握し、FAQ整備の優先度判断に活用
  • 政治・メディア分析:演説・記者会見・ニュース記事のキーワード分析
  • 学術研究:論文の抽象部(abstract)からキーワードを抽出して研究トレンドを可視化
  • 採用・HR:求人票・志望動機の頻出表現分析

テキストマイニングの詳細な実際の活用事例についてはテキスト・マイニングの応用でさらに詳しく解説しています。また無料で使えるツールを活用したテキストマイニングについてはテキストマイニング 無料の記事もあわせてご覧ください。

Python×テキストマイニング:実装上の重要なポイント

前処理の質が分析結果を左右する

テキストマイニングにおいては、形態素解析による分割の精度が後続のすべての分析品質に影響します。実務でよく行われる前処理は以下の通りです。

  • ストップワード除去:「は」「が」「の」など分析に不要な助詞・助動詞を除外
  • 品詞フィルタリング:名詞・動詞・形容詞など意味を持つ品詞のみを抽出
  • 表記の統一:「AI」と「Ai」のような表記ゆれを正規化
  • 辞書の拡張:mecab-ipadic-NEologdのような新語・固有名詞対応辞書への切り替え
  • 最低出現回数フィルタ:1回しか出現しない稀少語を除外してノイズを低減

各手法の使い分け基準

分析目的 推奨手法 入力データ形式
文章の感情傾向を把握したい センチメント分析 レビュー・コメント・アンケート自由記述
文書・ユーザーを性質でグルーピングしたい クラスター分析 TF-IDF行列・文書ベクトル・数値データ
多変数データの全体像を2次元で把握したい 主成分分析 多変数の数値データ
文章の頻出単語・テーマを直感的に把握したい ワードクラウド 長文テキスト・スピーチ・コメント集
上記すべての前提処理 形態素解析 任意の日本語テキスト

2026年時点での発展的な実装方向

本記事で解説した手法はテキストマイニングの基礎として今も有効ですが、実務の最前線では以下のような発展的な手法も活用されています。

  • Word2Vec / fastText:単語を意味的な距離を持つベクトルに変換し、語の類似度を計算
  • BERTベースの日本語モデル(cl-tohoku/bert-base-japanese等):文脈を考慮した文書分類・センチメント分析
  • LDA(潜在ディリクレ配分法):文書群から潜在的なトピックを自動抽出
  • GPT系LLMによるzero-shot / few-shot分析:少量のラベルデータでも高精度な分類が可能

これらは本記事で解説した基礎を理解した上で取り組むことで、より深い応用が可能になります。

まとめ

本記事ではPythonを用いたテキストマイニングの5つの手法を、実際に動くコードとともに解説しました。

  • 形態素解析(MeCab/mecab-python3):テキストマイニングの出発点。文章を意味のある単位に分割し、品詞・読みなどの情報を取得する
  • センチメント分析(asari/oseti):レビューやコメントのPositive/Negative判定。比喩・反語への精度には限界があり、実務では誤判定を前提とした設計が必要
  • クラスター分析(scipy/sklearn):デンドログラムで最適クラスター数を決定し、凝集型クラスタリングで個体をグルーピングする
  • 主成分分析(numpy):相関行列の固有値分解により多変数データを2次元に圧縮し、散布図で全体像を可視化する
  • ワードクラウド(wordcloud):日本語テキストにはMeCabの分かち書きを前処理として組み合わせ、頻出単語を視覚的に表現する

いずれの手法も、Google Colaboratory上で本記事のコードをそのまま実行することで体験できます。テキストマイニングの全体像や理論的背景についてはテキストマイニングの親記事、実際のビジネス応用についてはテキスト・マイニングの応用、無料ツールを活用したアプローチについてはテキストマイニング 無料も参照してください。

AIブログ購読

 
クリスタルメソッドがお届けする
AIブログの更新通知を受け取る

Study about AI

AIについて学ぶ

  • 営業ロープレのコツ・お題・進め方|研修担当者の設計ガイド【2026年版】

    営業ロープレのコツ・お題・進め方|研修担当者の設計ガイド【2026年版】

    営業ロープレのコツを押さえれば、練習の質が劇的に変わる 「ロープレをやっているのに、本番で同じミスを繰り返してしまう」「何度練習しても手応えを感じられない」——...

  • AIロープレの作り方|自作(ChatGPT)と専用ツールの違い【2026年版】

    AIロープレの作り方|自作(ChatGPT)と専用ツールの違い【2026年版】

    AIロープレの作り方:設計から運用まで完全ガイド 「AIロープレを自社向けに作りたいが、どこから手をつければいいかわからない」——そんな声を営業研修担当者からよ...

  • AIロープレの料金・費用相場|サービス別の価格と選び方【2026年版】

    AIロープレの料金・費用相場|サービス別の価格と選び方【2026年版】

    「AIロープレを導入したいが、費用感がつかめない」「無料トライアルと有料プランの違いが分からない」――そんな声を研修担当者からよく聞きます。AIロープレの料金体...

View more