2018年10月29日 星期一

sklearn.feature_extraction.text 使用


這邊講解 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]

除數是固定的
 

沒有留言:

張貼留言