文本表示
1 one-hot representation
該單詞對(duì)應(yīng)所在元素為1,向量中其他元素均為0,向量的維度就等于詞庫(kù)中的單詞數(shù)目
??? ?所有向量都是互相正交的,我們無(wú)法有效的表示兩個(gè)向量間的相似度
??? ?向量維度過(guò)大。
from sklearn.feature_extraction.text import CountVectorizer
import seaborn as sns
import matplotlib.pyplot as plt
corpus = ['Time flies flies like an arrow.',
? ? ? ? ? 'Fruit flies like a banana.']
vocab = set([word for sen in corpus for word in sen.split(" ")])
one_hot_vectorizer = CountVectorizer(binary=True)
one_hot = one_hot_vectorizer.fit_transform(corpus).toarray()
print(one_hot_vectorizer.vocabulary_)
print(one_hot)
sns.heatmap(one_hot, annot=True,cbar=False, xticklabels=vocab, yticklabels=['Sentence 2'])
plt.show()
{'time': 6, 'flies': 3, 'like': 5, 'an': 0, 'arrow': 1, 'fruit': 4, 'banana': 2}
[[1 1 0 1 0 1 1]
?[0 0 1 1 1 1 0]]
?
2 使用sklearn計(jì)算tfidf
TF-IDF(term frequency–inverse document frequency,詞頻-逆向文件頻率)是一種用于信息檢索(information retrieval)與文本挖掘(text mining)的常用加權(quán)技術(shù)。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時(shí)會(huì)隨著它在語(yǔ)料庫(kù)中出現(xiàn)的頻率成反比下降。
TF是詞頻(Term Frequency) 詞頻(TF)表示詞條(關(guān)鍵字)在文本中出現(xiàn)的頻率。這個(gè)數(shù)字通常會(huì)被歸一化(一般是詞頻除以文章總詞數(shù)), 以防止它偏向長(zhǎng)的文件。
IDF是逆向文件頻率(Inverse Document Frequency) 逆向文件頻率 (IDF) :總文件數(shù)目除以包含該詞語(yǔ)的文件的數(shù)目,再將得到的商取對(duì)數(shù)得到。罕見(jiàn)詞的IDF很高,高頻詞的IDF很低。
TF-IDF實(shí)際上是:TF * IDF
應(yīng)用
關(guān)鍵字:計(jì)算出文章中每個(gè)詞的TF-IDF值之后,進(jìn)行排序,選取其中值最高的幾個(gè)作為關(guān)鍵字。
文章的相似性: 計(jì)算出每篇文章的關(guān)鍵詞,從中各選取相同個(gè)數(shù)的關(guān)鍵詞,合并成一個(gè)集合,計(jì)算每篇文章對(duì)于這個(gè)集合中的詞的詞頻,生成兩篇文章各自的詞頻向量,進(jìn)而通過(guò)歐氏距離或余弦距離求出兩個(gè)向量的余弦相似度,值越大就表示越相似。
from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer,TfidfVectorizer
from pprint import pprint
import seaborn as sns
from matplotlib.pylab import plt
corpus = ['Time flies flies like an arrow.',
? ? ? ? ? 'Fruit flies like a banana.']
one_hot_vectorizer = CountVectorizer()
one_hot = one_hot_vectorizer.fit_transform(corpus).toarray()
pprint(one_hot) #輸出詞頻
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(one_hot)
vocab = one_hot_vectorizer.get_feature_names()
print(vocab) #打印詞典
pprint(transformer.idf_ ) #輸出逆文檔頻率
pprint(tfidf.toarray()) #輸出TFIDF
sns.heatmap(tfidf.toarray(), annot=True, cbar=False, xticklabels=vocab,
? ? ? ? ? ? yticklabels= ['Sentence 1', 'Sentence 2'])
plt.show()
array([[1, 1, 0, 2, 0, 1, 1],
? ? ? ?[0, 0, 1, 1, 1, 1, 0]], dtype=int64)
['an', 'arrow', 'banana', 'flies', 'fruit', 'like', 'time']
array([1.40546511, 1.40546511, 1.40546511, 1. ? ? ? ?, 1.40546511,
? ? ? ?1. ? ? ? ?, 1.40546511])
array([[0.42519636, 0.42519636, 0. ? ? ? ?, 0.60506143, 0. ? ? ? ?,
? ? ? ? 0.30253071, 0.42519636],
? ? ? ?[0. ? ? ? ?, 0. ? ? ? ?, 0.57615236, 0.40993715, 0.57615236,
? ? ? ? 0.40993715, 0. ? ? ? ?]])
?
?
總結(jié)
- 上一篇: 数据库练习题(一)创建表格并做相应的查询
- 下一篇: VMware中ubuntu虚拟机与win