目次
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.
- 0. 0.37796447 0. 0. 0.
- 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.
- -0.26726124 0. 0.26726124 0. 0.
- 0. ]
[-0.17407766 -0.17407766 0. 0. 0.17407766 0.
- 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以上担当
理化学研究所にて研究員を拝命中 応用数理学会所属