PythonのCountVectorizerで特徴量を抽出する方法:fit_transformからget_feature_namesまで

  • 2024年2月26日
  • 2024年2月26日
  • Python
  • 1157回
  • 0件

自然言語処理(NLP)は、テキストデータを解析して有用な情報を抽出するための重要な技術です。Pythonの機械学習ライブラリであるscikit-learnに含まれるCountVectorizerは、この分野で広く使用されているツールの一つです。CountVectorizerは、テキストデータを数値データに変換することで、機械学習アルゴリズムが解析できる形式にします。この記事では、CountVectorizerの使用方法と、テキストデータから特徴量を抽出するプロセスについて詳しく解説します。

CountVectorizerを使うケースやシーン

CountVectorizerは、文書分類、感情分析、トピックモデリングなど、さまざまなNLPタスクにおいて役立ちます。例えば、オンラインレビューを分析して製品のポジティブな側面とネガティブな側面を把握する感情分析や、大量のテキストデータから共通の話題を見つけ出すトピックモデリングなどです。これらのタスクでは、CountVectorizerを使用してテキストデータを特徴量ベクトルに変換し、機械学習モデルが解析できる形式にします。

CountVectorizerの主要な設定オプションとその影響

CountVectorizerには多くの設定オプションがあります。これらを適切に調整することで、分析の精度を向上させることができます。

  • stop_words:分析に不要な一般的な単語(例:「the」や「is」など)を除外することができます。
  • max_features:特徴量として使用する単語の最大数を設定します。これにより、データセット内で最も頻繁に出現する単語のみを特徴量として抽出できます。
  • ngram_range:単語の組み合わせ(n-gram)を特徴量として考慮するかどうかを指定します。例えば、ngram_range=(1, 2)は、単語と2単語の組み合わせの両方を特徴量として抽出します。
  • min_dfmax_df:文書に出現する頻度に基づいて単語をフィルタリングします。これにより、あまりにも頻繁に出現する単語や、ほとんど出現しない単語を除外できます。

fit_transformメソッドとget_feature_namesメソッド

fit_transformメソッドの使用方法

fit_transformメソッドは、テキストデータをCountVectorizerモデルに適合させ、同時にテキストデータを特徴量ベクトルに変換します。このプロセスでは、まずテキストデータから単語の辞書を作成し、各文書をこの辞書の単語の出現頻度のベクトルに変換します。

from sklearn.feature_extraction.text import CountVectorizer

# サンプルテキスト
texts = ["Python is a great programming language", "Machine learning with Python is fun"]

# CountVectorizerのインスタンス化
vectorizer = CountVectorizer()

# fit_transformメソッドを使用して特徴量ベクトルを生成
feature_vectors = vectorizer.fit_transform(texts)

print(feature_vectors.toarray())
[[0 1 1 1 0 0 1 1 0]
 [1 0 1 0 1 1 0 1 1]]

get_feature_namesメソッドの活用

get_feature_names_outメソッド(またはget_feature_names)を使用すると、生成された特徴量ベクトルの各要素がどの単語に対応しているかを確認できます。これは、分析の結果を解釈する際に非常に役立ちます。

# 特徴量(単語)のリストを取得
feature_names = vectorizer.get_feature_names_out()

print(feature_names)
['fun' 'great' 'is' 'language' 'learning' 'machine' 'programming' 'python'
 'with']

特徴量ベクトルと単語の関係

生成された特徴量ベクトル[[0 1 1 1 0 0 1 1 0], [1 0 1 0 1 1 0 1 1]]と特徴量(単語)のリスト['fun', 'great', 'is', 'language', 'learning', 'machine', 'programming', 'python', 'with']はどのような関係にあるのでしょうか。このベクトルは、各文書内での単語の出現回数を示しています。たとえば、最初の文書(”Python is a great programming language”)では、'great', 'is', 'language', 'programming', 'python'がそれぞれ1回ずつ出現しています。これらの単語に対応する位置の数値が1になっています。逆に、'fun', 'learning', 'machine', 'with'は出現していないため、これらの位置の数値は0です。同様に、2番目の文書(”Machine learning with Python is fun”)についても分析することができます。

このように、特徴量ベクトルは文書内の単語の出現パターンを数値化したものであり、テキストデータの数学的な表現を提供します。これにより、機械学習アルゴリズムがテキストデータを解析できるようになります。

実践的な例:頻出するBigramの抽出と可視化

CountVectorizerを用いてテキストデータから頻出するbigram(2単語の組み合わせ)を抽出し、それを可視化する実践的な例を作成します。この例では、シンプルなデータセットを用意し、特定の条件を満たす文書からbigramを抽出し、最も頻出するbigramを可視化します。

サンプルデータセットの準備

まずは必要なライブラリをインポートし、サンプルデータセットを用意します。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.feature_extraction.text import CountVectorizer

# サンプルデータセットの生成(テキストデータとラベル)
data = pd.DataFrame({
    'text': [
        "Python is widely used for machine learning",
        "Machine learning and data science are closely related",
        "Data science involves statistics and machine learning",
        "Python programming can be fun",
        "Statistics is fundamental to data science"
    ],
    'label': ["learning", "learning", "science", "programming", "science"]
})

bigramを抽出する関数の作成

次に、指定された条件(例えば、ラベルが’science’の文書)に基づいて、頻出するbigramを抽出する関数を定義します。

# 頻出するbigramを抽出する関数
def get_freq_bigrams(corpus, top_n=20):
    # CountVectorizerを初期化し、bigramの抽出を設定
    vec = CountVectorizer(ngram_range=(2, 2))
    
    # 渡されたテキストデータ(corpus)にfit_transformメソッドを適用して、
    # テキストをbigramの頻度ベクトルに変換
    X = vec.fit_transform(corpus)
    
    # fit_transformによって生成されたベクトルから、bigramの名称を取得
    bigrams = vec.get_feature_names_out()
    
    # 各bigramの出現回数を計算(文書全体での合計頻度)
    bigrams_count = np.array(X.sum(axis=0)).flatten()

    # 各bigramとその出現回数をタプルの形式でリストに格納
    bigrams_freq = [(bigrams[i], bigrams_count[i]) for i in range(len(bigrams))]
    
    # bigramを出現回数の多い順にソート
    bigrams_freq = sorted(bigrams_freq, key=lambda x: x[1], reverse=True)
    
    # 上位top_n個のbigramを返す
    return bigrams_freq[:top_n]

この関数は、与えられたテキストコーパス(corpus)から頻出するbigram(2単語の組み合わせ)を抽出し、それらをその出現頻度に基づいてソートした上で、上位top_n個のbigramをリストとして返します。ここで、ngram_range=(2, 2)の設定により、CountVectorizerは単語のペア(つまり、bigram)のみを特徴量として抽出します。この関数は、テキストデータのパターン分析や、特定のトピックや話題に関する言及がどの程度頻繁に行われているかを把握するのに役立ちます。

結果の可視化

ラベルが’science’の文書から頻出するbigramを抽出し、その結果を可視化します。

# ラベルが'science'の文書から頻出するbigramを抽出
top_freq_bigrams = get_freq_bigrams(data[data['label'] == 'science']['text'])

# 可視化の準備
x, y = zip(*top_freq_bigrams) # bigramとその頻度を分解

# 可視化
plt.figure(figsize=(10, 8))
sns.barplot(x=np.array(x), y=np.array(y))
plt.title("Top Frequent Bigrams for 'Science' Documents")
plt.xlabel("Frequency")
plt.ylabel("Bigrams")
plt.xticks(rotation=45)
plt.show()

このコードは、特定の条件下(この例ではラベルが’science’の文書)での頻出するbigramを抽出し、それらを可視化するプロセスを示しています。このようにCountVectorizerを用いることで、テキストデータ内のパターンを発見し、その傾向を視覚的に理解することができます。


CountVectorizerは、テキストデータを機械学習モデルで扱える形式に変換するための強力なツールです。この記事では、fit_transformメソッドとget_feature_namesメソッドを使用して、テキストデータから特徴量を効率的に抽出する方法を紹介しました。これらの技術を駆使することで、テキスト分析や機械学習プロジェクトにおいてより深い洞察を得ることができるでしょう。

最新情報をチェックしよう!