ITエンジニア ノイのブログ

ITエンジニアのノイです。 YouTubeで ITエンジニアのお勉強という学習用の動画を公開しています。チャンネル登録お願いします!https://m.youtube.com/channel/UCBKfJIMVWXd3ReG_FDh31Aw/playlists

TFIDF(Term Frequency-Inverse Document Frequency)モデルのVectorizer

TfidfVectorizerの役割

TfidfVectorizerとは

TfidfVectorizerとは、与えられた複数の文書から、それぞれの文書をTF-IDFの値に基づいたベクトルに変換するためのツールです。TF-IDFは、文書の中での単語の出現頻度と逆文書頻度を組み合わせて、単語の重要性を評価する手法です。

入力

入力としては、複数の文章がリスト形式で与えられます。ここで、1つの文章が1つの文書に相当します。

例えば、

['I go to the park .', 'I will go shopping .']

というリストが入力された場合、2つの文書があることを意味します。

TfidfVectorizerは、単語の重要性を評価するために、各文書内の単語の出現頻度(Term Frequency)と、全文書中でのその単語の出現頻度の逆数(Inverse Document Frequency)を乗算します。そして、それぞれの文書をTF-IDFの値に基づいたベクトルに変換します。

出力としては、2次元の行列が返されます。この行列は、scipyのオブジェクトであり、そのshapeは(文書数, 語彙サイズ)となっています。各文書に含まれる単語がTF-IDFによって置き換えられたようなリストとなっています。

例えば、

['go', 'park', 'shopping', 'the', 'to', 'will']

という単語リストを持つ2つの文書があった場合、出力は以下のようになります。

[[0.33 0.57 0.57 0.57 0]
[0.46 0 0.64 0 0 0.64 ]]

このように、TfidfVectorizerは、テキストデータを数値データに変換する際に非常に便利なツールです。自然言語処理においてよく用いられるため、これを理解しておくことは非常に重要です。

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ['I go to the park .',
          'I will go shopping .']
vectorizer = TfidfVectorizer()
vectorizer.fit(corpus)
X = vectorizer.transform(corpus)
print(X)

結果

  (0, 4)        0.534046329052269
  (0, 3)        0.534046329052269
  (0, 1)        0.534046329052269
  (0, 0)        0.37997836159100784
  (1, 5)        0.6316672017376245
  (1, 2)        0.6316672017376245
  (1, 0)        0.4494364165239821

出現していないところは表示されません。 この表現だと分かりにくいので、配列で表示しました。

print(X.toarray())
[[0.37997836 0.53404633 0.         0.53404633 0.53404633 0.        ]
 [0.44943642 0.         0.6316672  0.         0.         0.6316672 ]]

ngram

ngramとは

2次元リストやタプルをTF-IDFベクトルに変換する際に、特徴量として加えるngramの範囲を指定することができます。ngramとは、テキストをn個の単語のまとまりで区切ったものを意味します。

この範囲は、(下限, 上限)の形式で指定され、デフォルト値は(1,1)となっています。つまり、analyzer='word'の場合は、1つの単語を1つの特徴量としてTF-IDFに変換されます。

例えば、(1,2)を指定した場合は、1つの単語だけでなく、2つの単語の組み合わせであるbi-gramも特徴量として考慮されます。

これにより、より広範な単語の組み合わせを特徴量として加えることができるため、より多くの情報を捉えることができます。ただし、特徴量の数が増えるため、計算量が増大する可能性もあるため、適切な範囲を選択する必要があります。

自然言語処理におけるn-gramとは、テキストの中の連続したn個の単語のセットを指します。 たとえば、

"the quick brown fox jumps over the lazy dog"

というフレーズを考えてみましょう。

2-gram

2-gram(bigram)を作成すると、以下のようになります。

  • the quick
  • quick brown
  • brown fox
  • fox jumps
  • jumps over
  • over the
  • the lazy
  • lazy dog

3-gram

同様に、3-gram(trigram)を作成すると、以下のようになります。

  • the quick brown
  • quick brown fox
  • brown fox jumps
  • fox jumps over
  • jumps over the
  • over the lazy
  • the lazy dog

n-gramは、言語モデル、テキスト生成、テキスト分類、類似性判定などのタスクに使用されます。n-gramを使用すると、テキストの特徴をより詳細に理解できるようになり、より高度な自然言語処理が可能になります。

gramの注意点

n-gramを使う際には、いくつかの注意点があります。

nの選択: n-gramのnの値を適切に選択することが重要です。nが大きすぎると、文脈が狭くなりすぎ、nが小さすぎると、文脈が広すぎてうまく機能しなくなる可能性があります。適切なnの値を選択するには、データやタスクに応じた実験的なアプローチが必要です。

  • データの前処理

n-gramを使用する前に、テキストデータを適切に前処理する必要があります。例えば、テキストデータ内の記号や数字、ストップワードなどは、n-gramによる解析の妨げになる場合があります。また、テキストデータの正規化やトークン化なども必要です。

  • スパース性

n-gramは、データのスパース性に対して非常に敏感です。多くのn-gramが出現する可能性があるため、特に大きなnの場合、データ内の非常に少数のn-gramしか出現しないことがあります。そのため、スパース性に対処するために、データのダウンサンプリングや、スムージングなどの手法が必要になることがあります。

  • オーバーフィッティング

n-gramを使用する場合、モデルがトレーニングデータに過剰適合する可能性があります。これは、n-gramによって、トレーニングデータに特化した言語モデルが構築されることによるものです。過剰適合を避けるためには、適切な正則化技術を使用することが必要です。

※この記事の一部情報にはChatGPTを用いています。

youtu.be