scikit-learnでのテキストの特徴量抽出


 

目次

1. sklearn.feature_extraction.textの概要
2. 環境構築
3. データ生成
4. CountVectorizer
5. HashingVectorizer
6. TfidfTransformer
7. TfidfVectorizer

 

1. sklearn.feature_extraction.textの概要

sklearn.feature_extraction のモジュールは、テキストや画像などの形式からなるデータセットからの特徴を抽出することができます。

今回はfeature_extraction.textを解説します。

https://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_extraction.text

 

2. 環境構築

Google Colabで実験します。日本語の自然言語処理ために、mecabのライブラリをインストールします。

!apt install aptitude

!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y

!pip install mecab-python3==0.7

 

3. データ生成

ウクライナのキーワードでツイートのテキストを今回サンプルとして用意します。Mecabでtokenを作成しました。

Import MeCab

 

# input (ウクライナのツイート)

corpus = [

“【動画】地雷で負傷も「人々助けたい」、ウクライナで戦う米国人女性衛生兵”,

“「悲惨な状況の人が自分の家のドアの前にいるのに、その人を助けないというモルドバ人を私は想像することができません」”,

“ウクライナに侵攻したロシアが安全保障理事会の常任理事国として拒否権を持っているため、一致した対応が困難となっているとし「機能に一定の限界がある。国連改革を進めないといけない」と強調した。”,

]

 

# mecab

mecab = MeCab.Tagger(“-Owakati”)

corpus_mecab = [mecab.parse(text).strip() for text in corpus]

print(corpus_mecab)

print(‘corpus_mecab lenght: ‘, len(corpus_mecab))

[‘【 動画 】 地雷 で 負傷 も 「 人々 助け たい 」 、 ウクライナ で 戦う 米国 人 女性 衛生 兵’, ‘「 悲惨 な 状況 の 人 が 自分 の 家 の ドア の 前 に いる のに 、 その 人 を 助け ない という モルドバ 人 を 私 は 想像 する こと が でき ませ ん 」’, ‘ウクライナ に 侵攻 し た ロシア が 安全 保障 理事 会 の 常任 理事 国 として 拒否 権 を 持っ て いる ため 、 一致 し た 対応 が 困難 と なっ て いる と し 「 機能 に 一定 の 限界 が ある 。 国連 改革 を 進め ない と いけ ない 」 と 強調 し た 。’]

corpus_mecab lenght:  3

 

4. CountVectorizer

文章の分割したものを単語ベースのマトリックスに変換します。

from sklearn.feature_extraction.text import CountVectorizer

import MeCab

 

vec = CountVectorizer()

 

result = vec.fit_transform(corpus_mecab)

print(result.toarray())

print(result.shape)

print(vec.get_feature_names_out())

print(‘feature_names length: ‘, len(vec.get_feature_names_out()))

[[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0

1 0 0 0 0 0 0 1 0 1 1 0 0]

[0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1

0 0 0 0 0 1 0 0 1 0 0 0 0]

[1 1 2 0 0 0 0 1 0 0 1 2 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0

0 1 1 1 1 0 2 0 0 0 0 1 1]]

(3, 49)

[‘ある’ ‘いけ’ ‘いる’ ‘こと’ ‘する’ ‘その’ ‘たい’ ‘ため’ ‘でき’ ‘という’ ‘として’ ‘ない’ ‘なっ’ ‘のに’

‘ませ’ ‘ウクライナ’ ‘ドア’ ‘モルドバ’ ‘ロシア’ ‘一定’ ‘一致’ ‘人々’ ‘侵攻’ ‘保障’ ‘助け’ ‘動画’ ‘困難’

‘国連’ ‘地雷’ ‘女性’ ‘安全’ ‘対応’ ‘常任’ ‘強調’ ‘悲惨’ ‘想像’ ‘戦う’ ‘拒否’ ‘持っ’ ‘改革’ ‘機能’

‘状況’ ‘理事’ ‘米国’ ‘自分’ ‘衛生’ ‘負傷’ ‘進め’ ‘限界’]

feature_names length:  49

 

5. HashingVectorizer

こちらも同様に最初は、文章の分割したものを単語ベースのマトリックスに変換します。

from sklearn.feature_extraction.text import HashingVectorizer

 

vec = HashingVectorizer(n_features=20)

 

result = vec.fit_transform(corpus_mecab)

print(result.shape)

print(result.toarray())

(3, 20)

[[ 0.         -0.37796447  0.          0.37796447  0.          0.

  1. 0.          0.37796447  0.          0.          0.
  2. 0.          0.          0.          0.37796447  0.37796447

-0.37796447  0.37796447]

[-0.53452248  0.26726124  0.          0.          0.          0.53452248

-0.26726124  0.         -0.26726124  0.26726124  0.          0.

  1. -0.26726124  0.          0.26726124  0.          0.
  2. 0.        ]

[-0.17407766 -0.17407766  0.          0.          0.17407766  0.

  1. 0.52223297  0.          0.34815531  0.         -0.17407766

-0.17407766  0.         -0.17407766  0.          0.          0.17407766

-0.34815531 -0.52223297]]

 

6. TfidfTransformer

文章の行列を正規化されたtfまたはtf-idf表現に変換します。

from sklearn.feature_extraction.text import TfidfTransformer

from sklearn.feature_extraction.text import CountVectorizer

from sklearn.pipeline import Pipeline

 

vocabulary = [‘ウクライナ’, ‘ロシア’, ‘国連’, ‘米国’]

 

pipe = Pipeline([(‘count’, CountVectorizer(vocabulary=vocabulary)),

(‘tfid’, TfidfTransformer())]).fit(corpus_mecab)

 

print(pipe[‘count’].transform(corpus_mecab).toarray())

print(pipe[‘tfid’].idf_)

print(pipe.transform(corpus_mecab).shape)

print(pipe.get_feature_names_out())

[[1 0 0 1]

[0 0 0 0]

[1 1 1 0]]

[1.28768207 1.69314718 1.69314718 1.69314718]

(3, 4)

[‘ウクライナ’ ‘ロシア’ ‘国連’ ‘米国’]

 

7. TfidfVectorizer

文章の分割したものを単語ベースのマトリックスをTF-IDF機能のマトリックスに変換します。

from sklearn.feature_extraction.text import TfidfVectorizer

 

vectorizer = TfidfVectorizer()

X = vectorizer.fit_transform(corpus_mecab)

 

print(vectorizer.get_feature_names_out())

print(X.shape)

print(X)

[‘ある’ ‘いけ’ ‘いる’ ‘こと’ ‘する’ ‘その’ ‘たい’ ‘ため’ ‘でき’ ‘という’ ‘として’ ‘ない’ ‘なっ’ ‘のに’

‘ませ’ ‘ウクライナ’ ‘ドア’ ‘モルドバ’ ‘ロシア’ ‘一定’ ‘一致’ ‘人々’ ‘侵攻’ ‘保障’ ‘助け’ ‘動画’ ‘困難’

‘国連’ ‘地雷’ ‘女性’ ‘安全’ ‘対応’ ‘常任’ ‘強調’ ‘悲惨’ ‘想像’ ‘戦う’ ‘拒否’ ‘持っ’ ‘改革’ ‘機能’

‘状況’ ‘理事’ ‘米国’ ‘自分’ ‘衛生’ ‘負傷’ ‘進め’ ‘限界’]

(3, 49)

(0, 45) 0.31377733704463995

(0, 29) 0.31377733704463995

(0, 43) 0.31377733704463995

(0, 36) 0.31377733704463995

(0, 15) 0.2386357525755203

(0, 6)   0.31377733704463995

(0, 24) 0.2386357525755203

(0, 21) 0.31377733704463995

(0, 46) 0.31377733704463995

(0, 28) 0.31377733704463995

(0, 25) 0.31377733704463995

(1, 14) 0.26050856502746905

(1, 8)   0.26050856502746905

(1, 3)   0.26050856502746905

(1, 4)   0.26050856502746905

(1, 35) 0.26050856502746905

(1, 17) 0.26050856502746905

(1, 9)   0.26050856502746905

(1, 11) 0.19812347842972075

(1, 5)   0.26050856502746905

(1, 13) 0.26050856502746905

(1, 2)   0.19812347842972075

(1, 16) 0.26050856502746905

(1, 44) 0.26050856502746905

(1, 41) 0.26050856502746905

:            :

(2, 1)   0.17901266805807187

(2, 47) 0.17901266805807187

(2, 39) 0.17901266805807187

(2, 27) 0.17901266805807187

(2, 0)   0.17901266805807187

(2, 48) 0.17901266805807187

(2, 19) 0.17901266805807187

(2, 40) 0.17901266805807187

(2, 12) 0.17901266805807187

(2, 26) 0.17901266805807187

(2, 31) 0.17901266805807187

(2, 20) 0.17901266805807187

(2, 7)   0.17901266805807187

(2, 38) 0.17901266805807187

(2, 37) 0.17901266805807187

(2, 10) 0.17901266805807187

(2, 32) 0.17901266805807187

(2, 42) 0.35802533611614373

(2, 23) 0.17901266805807187

(2, 30) 0.17901266805807187

(2, 18) 0.17901266805807187

(2, 22) 0.17901266805807187

(2, 11) 0.2722874963816289

(2, 2)   0.2722874963816289

(2, 15) 0.13614374819081446

 

担当者:HM

香川県高松市出身 データ分析にて、博士(理学)を取得後、自動車メーカー会社にてデータ分析に関わる。その後コンサルティングファームでデータ分析プロジェクトを歴任後独立 気が付けばデータ分析プロジェクトだけで50以上担当

理化学研究所にて研究員を拝命中 応用数理学会所属