NLP—詞頻特徵向量

詞向量、TF-IDF值詞向量都沒有考慮單詞的上下文關係,而僅僅考慮詞的權重,即單詞出現的頻率。雖然丟失了一部分語義信息,但是在面臨聚類、分類等問題時,這種詞向量方法表現也不錯。

下面代碼例子中,首先利用docs中出現的單詞構建字典,然後把每句話轉化爲詞向量形式。有些單詞"I"、"is"屬於停用詞,不參加詞頻統計。同時詞向量中包含大量0值,所以我們的矩陣通常是十分稀疏的。當詞向量特徵矩陣十分巨大時可以使用Hash Trick進行特徵降維。

from sklearn.feature_extraction.text import CountVectorizer
vectorizer=CountVectorizer()
docs=["Where are you from","I like playing football","Would you mind if I sit here","Just do it"]

print(vectorizer.fit_transform(docs))
  (0, 3)        1
  (0, 14)       1
  (0, 0)        1
  (0, 12)       1
  (1, 2)        1
  (1, 10)       1
  (1, 8)        1
  (2, 4)        1
  (2, 11)       1
  (2, 5)        1
  (2, 9)        1
  (2, 13)       1
  (2, 14)       1
  (3, 6)        1
  (3, 1)        1
  (3, 7)        1

print(vectorizer.fit_transform(docs).toarray())
[[1 0 0 1 0 0 0 0 0 0 0 0 1 0 1]
 [0 0 1 0 0 0 0 0 1 0 1 0 0 0 0]
 [0 0 0 0 1 1 0 0 0 1 0 1 0 1 1]
 [0 1 0 0 0 0 1 1 0 0 0 0 0 0 0]]
print(vectorizer.get_feature_names())
['are', 'do', 'football', 'from', 'here', 'if', 'it', 'just', 'like', 'mind', 'playing', 'sit', 'where', 'would', 'you']

在docs文本中,“you”詞頻爲2,而“football”“sit”詞頻爲1,顯然football、sit單詞的重要性更高,you在很多文本中都有較高的出現概率。爲了體現這個特徵,我們有引入了TF-IDF(Term Frequency-Inverse Document Frequency)特徵處理。IDF反映了一個詞在所有文本中出現的頻率,如果一個詞在很多的文本中都出現,那麼它的IDF值應該低,比如上文中的“you”。而反過來如果一個詞在比較少的文本中出現,那麼它的IDF值應該高。例如一些專業的名詞“Deep Learning”。這樣的詞IDF值應該高。在極端的情況,如果一個單詞在所有的文本中都出現,那麼它的IDF值應該爲0。

IDF(x)=log N/N(x)

其中,N代表文本總數,N(x)代表包含單詞x的文本總數。爲了防止0值的出現,進行加1處理。IDF(x)=log(N+1/N(x)+1) +1。最終某一個單詞的TF-IDF值爲:tf-idf=TF(x)*IDF(x)。

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
vectorizer=CountVectorizer()
transformer=TfidfTransformer()
tfidf1=transformer.fit_transform(vectorizer.fit_transform(docs))

print(tfidf1)
  (0, 12)       0.525472749264
  (0, 0)        0.525472749264
  (0, 14)       0.414288751166
  (0, 3)        0.525472749264
  (1, 8)        0.57735026919
  (1, 10)       0.57735026919
  (1, 2)        0.57735026919
  (2, 14)       0.332524198686
  (2, 13)       0.421764782145
  (2, 9)        0.421764782145
  (2, 5)        0.421764782145
  (2, 11)       0.421764782145
  (2, 4)        0.421764782145
  (3, 7)        0.57735026919
  (3, 1)        0.57735026919
  (3, 6)        0.57735026919

#第二種方法
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf2=TfidfVectorizer()
tfidf3=tfidf2.fit_transform(docs)

print(tfidf3)
  (0, 12)       0.525472749264
  (0, 0)        0.525472749264
  (0, 14)       0.414288751166
  (0, 3)        0.525472749264
  (1, 8)        0.57735026919
  (1, 10)       0.57735026919
  (1, 2)        0.57735026919
  (2, 14)       0.332524198686
  (2, 13)       0.421764782145
  (2, 9)        0.421764782145
  (2, 5)        0.421764782145
  (2, 11)       0.421764782145
  (2, 4)        0.421764782145
  (3, 7)        0.57735026919
  (3, 1)        0.57735026919
  (3, 6)        0.57735026919

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章