テキストマイニングは、大量のテキストデータから有用な情報を抽出する技術です。特に、顧客の声を理解し、マーケティング戦略や商品開発に活かすための有力な手段となります。

本記事では、PythonとGoogle Colabを活用して、フランス料理店の口コミデータを分析する方法を紹介します。具体的には、感情分析、トピックモデリング、ワードクラウドの3つの手法を用います。

使用するツールとライブラリ

  • Janome: 日本語の形態素解析ツール
  • NLTK (Natural Language Toolkit): 自然言語処理ライブラリ
  • Scikit-learn: 機械学習ライブラリ
  • WordCloud: ワードクラウドの生成ライブラリ
  • Matplotlib: データの可視化ライブラリ

データの準備

データをGoogle Colabにアップロードし、Pandasを使って読み込みます。データはフランス料理店の口コミを含んでいます。

!pip install janome
!apt-get -y install fonts-ipafont-gothic

from janome.tokenizer import Tokenizer
import pandas as pd
import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from sklearn.decomposition import LatentDirichletAllocation
from sklearn.feature_extraction.text import CountVectorizer

# 必要なNLTKデータセットのダウンロード
nltk.download('punkt')
nltk.download('vader_lexicon')

# データの読み込み
df = pd.read_csv('/content/french_restaurant_reviews.csv')

テキストの前処理

口コミデータを処理しやすい形式に変換します。日本語のストップワードを除去し、トークン化します。

# 日本語のストップワードリストを定義
japanese_stopwords = set([
    'の', 'に', 'は', 'を', 'た', 'が', 'で', 'て', 'と', 'し', 'れ', 'さ', 'ある', 'いる', 'も',
    'する', 'から', 'な', 'こと', 'として', 'い', 'や', 'れる', 'など', 'ない', 'この', 'ため',
    'その', 'あっ', 'よう', 'また', 'もの', 'という', 'あり', 'まで', 'か', 'だ', 'これ', '私', 'それ', 'まし'
])

# Janomeの設定
tokenizer = Tokenizer()

def preprocess_text(text):
    # Janomeを使用してトークン化
    tokens = tokenizer.tokenize(text, wakati=True)
    # ストップワードの除去
    tokens = [word for word in tokens if word not in japanese_stopwords]
    return tokens

df['cleaned_text'] = df['comment'].apply(preprocess_text)

# 前処理結果の確認
print("=== 前処理後のテキストデータ ===")
print(df['cleaned_text'])

感情分析

ポジティブおよびネガティブな単語リストを使用して、各口コミの感情スコアを計算します。

# ポジティブ/ネガティブ単語リスト
positive_words = set(['素晴らしく', '素晴らしかった', '美味しい', '良い', '楽しい', '最高', '感動', '素敵', '満足', '特別'])
negative_words = set(['悪い', 'まずい', '高い', '低い', '失望', '最低'])

def sentiment_analysis(tokens):
    positive_score = sum([1 for word in tokens if word in positive_words])
    negative_score = sum([1 for word in tokens if word in negative_words])
    return positive_score - negative_score

df['sentiment'] = df['cleaned_text'].apply(sentiment_analysis)

# 感情スコアの表示
print(df[['comment', 'sentiment']])
  • ポジティブなスコア(0以上の値): 顧客がポジティブな感情を抱いていることを示します。スコアが高いほど、よりポジティブな感情を示しています。
  • ネガティブなスコア(0未満の値): 顧客がネガティブな感情を抱いていることを示します。スコアが低いほど、よりネガティブな感情を示しています。
0. 雰囲気が素晴らしく、料理も美味しかったです。サービスも丁寧で、特別な夜を過ごせました。 - スコア: 2
   => 非常にポジティブな評価。顧客は全体的に非常に満足しています。

1. 特別な夜に最適な場所。シェフの創作料理が美味しすぎて感動しました。また行きたいです。 - スコア: 2
   => 非常にポジティブな評価。顧客は再訪を希望するほど満足しています。

2. 家族で訪れましたが、みんな満足。特にデザートのクオリティが素晴らしく、子供たちも大喜びでした。 - スコア: 2
   => 非常にポジティブな評価。家族全員が満足していることを示しています。

3. 取引先とのディナーに利用。落ち着いた雰囲気と素晴らしいサービスで、良い商談ができました。 - スコア: 1
   => ポジティブな評価。ビジネスの場として成功したことを示しています。

4. 友人と楽しい時間を過ごせました。料理も美味しく、サービスも良かったです。ただ、少し高い気がしました。 - スコア: 0
   => 中立的な評価。ポジティブな側面がある一方で、価格に対する懸念を示しています。

5. 記念日ディナーに利用しました。スタッフの対応が素晴らしく、特別な日を祝うには最適な場所です。 - スコア: 2
   => 非常にポジティブな評価。特別な日の利用に対して高評価を示しています。

6. 一人で訪れましたが、ゆっくりとした時間を過ごせました。料理も美味しく、また来たいと思いました。 - スコア: 0
   => 中立的な評価。ポジティブなコメントがあるものの、特に強調される感情はありません。

7. カジュアルなランチに最適。リーズナブルな価格で本格的なフランス料理が楽しめます。 - スコア: 0
   => 中立的な評価。ポジティブなコメントがあるものの、特に強調される感情はありません。

8. 接待で利用しましたが、料理のクオリティは高く、取引先も大満足していました。また利用したいです。 - スコア: 1
   => ポジティブな評価。接待に適していることを示しています。

9. デートで訪れましたが、ロマンチックな雰囲気で料理も素晴らしかったです。次回はディナーを試してみたいです。 - スコア: 0
   => 中立的な評価。ポジティブなコメントがあるものの、特に強調される感情はありません。

トピックモデリング

トピックモデリングを使用して、口コミデータから主要なテーマを抽出します。

vectorizer = CountVectorizer(max_df=0.95, min_df=2)
dtm = vectorizer.fit_transform([' '.join(tokens) for tokens in df['cleaned_text']])
lda = LatentDirichletAllocation(n_components=2, random_state=0)
lda.fit(dtm)

# トピックの表示
def print_top_words(model, feature_names, n_top_words):
    for topic_idx, topic in enumerate(model.components_):
        print(f"Topic #{topic_idx}:")
        print(" ".join([feature_names[i] for i in topic.argsort()[:-n_top_words - 1:-1]]))
    print()

tf_feature_names = vectorizer.get_feature_names_out()
print_top_words(lda, tf_feature_names, 10)

トピック #0 の解釈

解釈: このトピックは、特別な機会に店舗を利用する際の体験や感想に関連しているようです。特に料理、サービス、雰囲気が良いと感じられる場面についての言及が多いことが伺えます。また、特別な時間を過ごす場所としての評価も含まれています。

トピック #1 の解釈

解釈: このトピックは、店舗のクオリティや満足度に関する内容に関連しているようです。特に満足度、クオリティ、訪問体験についての言及が多く、ビジネス関連の利用(取引)にも触れています。店舗の利用に対して非常にポジティブな評価が含まれていることが分かります。

トピックモデリングのまとめ

トピック #0 は、特別な機会に店舗を利用する際の体験や感想に焦点を当てており、料理、サービス、雰囲気についての言及が多いです。トピック #1 は、全体的な満足度やクオリティ、訪問体験に関する内容が多く含まれており、特にビジネス利用における評価も含まれています。

ワードクラウドの生成

ワードクラウドを生成し、口コミデータの視覚的な要約を提供します。ストップワードを追加して不要な単語(例:「です」)が表示されないように調整します。

# ワードクラウドの生成と表示
wordcloud = WordCloud(stopwords=japanese_stopwords, font_path='/usr/share/fonts/truetype/ipafont-gothic/ipagp.ttf', background_color='white').generate(' '.join([' '.join(tokens) for tokens in df['cleaned_text']]))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()

ワードクラウドは、テキストデータの中で頻出する単語を視覚的に表現する方法です。ワードクラウドの評価は、以下のポイントを基に行います:

  1. 頻出単語の確認:
    • 大きな単語は頻繁に出現する単語を示し、より重要なテーマやキーワードを表します。
    • 小さな単語は、頻度が低いが関連性のある単語を示します。
  2. 関連するテーマの識別:
    • 同じ文脈やテーマに関連する単語が集まっているかを確認します。
    • 特定のテーマやトピックが強調されているかを見ます。

ワードクラウドの評価

主な頻出単語

  • 料理: 料理に関する言及が非常に多いことを示しています。これは、顧客が料理の質や種類に強い関心を持っていることを示します。
  • 利用: 店舗の利用に関する言及が多く、特にどのようなシチュエーションで利用されるかが重要なポイントです。
  • です: これは日本語の文末に頻出するため、ストップワードに追加して除去することを検討できます。
  • 雰囲気: 店内の雰囲気に関する言及が多く、顧客が雰囲気を重要視していることを示しています。
  • 最適: 特定の状況やイベントに対する適合性についての言及が多いです。
  • 特別: 特別なイベントや日に関する言及が多く、顧客が特別な機会に利用することが多いことを示しています。

関連するテーマ

  • サービス: サービスに関する言及があり、顧客がサービスの質を評価していることがわかります。
  • 過ごせ: 特定の時間や体験を過ごすことに関する言及が多く、顧客がどのような時間を過ごしたかが重要な要素であることを示しています。
  • 満足: 顧客満足に関する言及があり、満足度が高いことを示しています。

まとめ

今回のテキストマイニングでは下記の3つをサンプル事例としてご紹介させていただきました。

  • 感情分析:ポジティブおよびネガティブな単語の出現頻度に基づいて、各口コミの感情スコアを計算します。
  • トピックモデリング:口コミデータから主要なテーマを抽出し、顧客の関心を把握します。
  • ワードクラウド:口コミデータの視覚的な要約を提供し、頻出単語を一目で確認できます。

これらの手法を組み合わせることで、顧客の声を深く理解し、マーケティング戦略や商品開発に役立てることができます。Google Colabを活用することで、手軽にこれらの分析を実行できる点も大きな利点です。