前回の記事では単語の出現回数を求めましたが、
今回は単語が出現するテキストの数を算出してみます。
とても似ていますが、要は1つのテキストに同じ単語が何回出ても1回としてしか数えないというものです。
(tf-idfのidfの計算につかわ割れるやつですね。)
コードはとても似たものになります。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.datasets import fetch_20newsgroups
import numpy as np
# データの読み込み
remove = ('headers', 'footers', 'quotes')
twenty_news = fetch_20newsgroups(
subset='all',
remove=remove,
)
X = twenty_news.data
# 文章の数
print(len(X)) # 18846
# BoW化
tf_vectorizer = CountVectorizer(
min_df=50,
token_pattern='(?u)\\b\\w+\\b', # 1文字の単語も対象とする
)
tf = tf_vectorizer.fit_transform(X)
# モデルが集計対象とした(min_df回以上出現した)単語の数
print(len(tf_vectorizer.get_feature_names())) # 4476
print(tf.shape) # (18846, 4476)
# 単語ごとにその単語が1回以上出現したドキュメント数を求める。
document_frequency = np.array((tf>0).sum(axis=0))[0]
print(document_frequency.shape) # (4476,)
# 出現回数上位100位までの単語と出現回数を表示
for i in document_frequency.argsort()[:-100:-1]:
print(document_frequency[i], "\t", tf_vectorizer.get_feature_names()[i])
# 以下出力
'''
15749 the
14108 to
13948 a
13015 i
12991 and
12809 of
11842 in
11685 is
11029 it
10974 that
10406 for
8722 have
8665 this
8596 on
8447 you
8140 be
-- (以下略) --
'''
ポイントはここ
np.array((tf>0).sum(axis=0))[0]
(tf>0) すると、行列の各要素が正の数ならTrue,0ならFalse になります。
それをsumすることで、Trueが1として計算されてTrueの数がもとまるというカラクリです。