文本表示

1 one-hot representation
该单词对应所在元素为1,向量中其他元素均为0,向量的维度就等于词库中的单词数目
    所有向量都是互相正交的,我们无法有效的表示两个向量间的相似度
    向量维度过大。
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计算tfidf
TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TF是词频(Term Frequency) 词频(TF)表示词条(关键字)在文本中出现的频率。这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。
IDF是逆向文件频率(Inverse Document Frequency) 逆向文件频率 (IDF) :总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。罕见词的IDF很高,高频词的IDF很低。
TF-IDF实际上是:TF * IDF

应用
关键字:计算出文章中每个词的TF-IDF值之后,进行排序,选取其中值最高的几个作为关键字。
文章的相似性: 计算出每篇文章的关键词,从中各选取相同个数的关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频,生成两篇文章各自的词频向量,进而通过欧氏距离或余弦距离求出两个向量的余弦相似度,值越大就表示越相似。
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.        ]])

 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值