這邊講解 sklearn 關於 sklearn.feature_extraction.text
包含的東西
包含以下四種
CountVectorizer
將句子分為字詞及使用次數
使用 稀疏矩陣
HashingVectorizer
沒有很了解這是什麼意思和作用
先不講
TfidfTransformer
計算所有字詞的 Tf-idf
和 CountVectorizer 連用
TfidfVectorizer
將CountVectorizer和 TfidfTransformer 功能合併
也是計算 Tf-idf
import numpy as np
import pandas as pd
import math
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = CountVectorizer()
corpus = [
'This is the first document.',
'This is the second second document.',
'And the third one.',
'Is this the first document?']
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())
print(X.toarray())
tfidf = TfidfTransformer()
tf = tfidf.fit_transform(X)
df = X.toarray()[0]
tf_idf = [df[n] * tfidf.idf_[n] for n in range(len(df))]
print(tf_idf[1]/math.sqrt(sum([n**2 for n in tf_idf])) , "\n")
print("idf:" , tfidf.idf_)
print(tf.toarray())
tfvector = TfidfVectorizer()
tfv = tfvector.fit_transform(corpus)
CountVectorizer
get_feature_names() 取得句子所使用的所有詞
X.toarray() 上面四句使用到的詞數
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
[[0 1 1 1 0 0 1 0 1]
[0 1 0 1 0 2 1 0 1]
[1 0 0 0 1 0 1 1 0]
[0 1 1 1 0 0 1 0 1]]
0.4387767428592343
idf: [1.91629073 1.22314355 1.51082562 1.22314355 1.91629073 1.91629073
1. 1.91629073 1.22314355]
[[0. 0.43877674 0.54197657 0.43877674 0. 0.
0.35872874 0. 0.43877674]
[0. 0.27230147 0. 0.27230147 0. 0.85322574
0.22262429 0. 0.27230147]
[0.55280532 0. 0. 0. 0.55280532 0.
0.28847675 0.55280532 0. ]
[0. 0.43877674 0.54197657 0.43877674 0. 0.
0.35872874 0. 0.43877674]]
TfidfTransformer()
這邊TF - IDF 的計算方式和網路上的稍有不同
tf 很簡單
輸入幾次就幾次
idf 的計算方式
log 以 e 為底
其實也就是 ln
公式:
\({idf}(t) = log{\frac{1 + n_d}{1+\text{df}(d,t)}} + 1\)
預設smooth_idf=True 如果 smooth_idf=False
\({idf}(t) = log{\frac{n_d}{\text{df}(d,t)}} + 1\)
IDF 9個詞 在smooth_idf=True的情況下計算
總共 4 句 看這4句中出現幾次
\({idf}(t1) = log{\frac{1 + 4}{1+1}} + 1 =1.91629073 \)
\({idf}(t2) = log{\frac{1 + 4}{1+3}} + 1 =1.22314355 \)
以下類堆
最後計算 TF-IDF
第0列
df = X.toarray()[0]
tf_idf = [df[n] *tfidf_trans.idf_[n] for n in range(len(df))]
再加上正規化
算式
\(v_{norm} = \frac{v}{||v||_2} = \frac{v}{\sqrt{v{_1}^2 +v{_2}^2 + \dots + v{_n}^2}}\)
v = TF-IDF
每個數字會這樣算
tf_idf[1]/math.sqrt(sum([n**2 for n in tf_idf]
除數是固定的
沒有留言:
張貼留言