词向量、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。
其中,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