情感分析之TF-IDF算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了情感分析之TF-IDF算法相关的知识,希望对你有一定的参考价值。
参考技术A http://mini.eastday.com/bdmip/180414224336264.html在这篇文章中,主要介绍的内容有:
1、将单词转换为特征向量
2、TF-IDF计算单词关联度
文本的预处理和分词。
如何将单词等分类数据转成为数值格式,以方便我们后面使用机器学习来训练模型。
一、将单词转换为特征向量
词袋模型(bag-of-words model):将文本以数值特征向量的形式来表示。主要通过两个步骤来实现词袋模型:
1、为整个文档集(包含了许多的文档)上的每个单词创建一个唯一的标记。
2、为每个文档构建一个特征向量,主要包含每个单词在文档上的出现次数。
注意:由于每个文档中出现的单词数量只是整个文档集中很少的一部分,因此会有很多的单词没有出现过,就会被标记为0。所以,特征向量中大多数的元素就会为0,就会产生稀疏矩阵。
下面通过sklearn的CountVectorizer来实现一个词袋模型,将文档转换成为特征向量
通过count.vocabulary_我们可以看出每个单词所对应的索引位置,每一个句子都是由一个6维的特征向量所组成。其中,第一列的索引为0,对应单词"and","and"在第一和二条句子中没有出现过,所以为0,在第三条句子中出现过一些,所以为1。特征向量中的值也被称为原始词频(raw term frequency)简写为tf(t,d),表示在文档d中词汇t的出现次数。
注意:在上面词袋模型中,我们是使用单个的单词来构建词向量,这样的序列被称为1元组(1-gram)或单元组(unigram)模型。除了一元组以外,我们还可以构建n元组(n-gram)。n元组模型中的n取值与特定的应用场景有关,如在反垃圾邮件中,n的值为3或4的n元组可以获得比较好的效果。下面举例说明一下n元组,如在"the weather is sweet"这句话中,
1元组:"the"、"weather"、"is"、"sweet"。
2元组:"the weather"、"weather is"、"is sweet"。
在sklearn中,可以设置CountVecorizer中的ngram_range参数来构建不同的n元组模型,默认ngram_range=(1,1)。
sklearn通过CountVecorizer构建2元组
二、TF-IDF计算单词关联度
在使用上面的方法来构建词向量的时候可能会遇到一个问题:一个单词在不同类型的文档中都出现,这种类型的单词其实是不具备文档类型的区分能力。我们通过TF-IDF算法来构建词向量,从而来克服这个问题。
词频-逆文档频率(TF-IDF,term frequency-inverse document frequency):tf-idf可以定义为词频×逆文档频率
其中tf(t,d)表示单词t在文档d中的出现次数,idf(t,d)为逆文档频率,计算公式如下
其中,nd表示文档的总数,df(t,d)表示包含单词t的文档d的数量。分母中加入常数1,是为了防止df(t,d)=0的情况,导致分母为0。取log的目的是保证当df(t,d)很小的时候,不会导致idf(t,d)过大。
通过sklearn的TfidfTransformer和CountVectorizer来计算tf-idf
可以发现"is"(第二列)和"the"(第六列),它们在三个句子中都出现过,它们对于文档的分类所提供的信息并不会很多,所以它们的tf-idf的值相对来说都是比较小的。
注意:sklearn中的TfidfTransformer的TF-IDF的计算与我们上面所定义TF-IDF的公式有所不同,sklearn的TF-IDF计算公式
通常在计算TF-IDF之前,会对原始词频tf(t,d)做归一化处理,TfidfTransformer是直接对tf-idf做归一化。TfidfTransformer默认使用L2归一化,它通过与一个未归一化特征向量L2范数的比值,使得返回向量的长度为1,计算公式如下:
下面通过一个例子来说明sklearn中的TfidfTransformer的tf-idf的计算过程,以上面的第一句话"The sun is shining"为例子
1、计算原始词频
a、单词所对应的下标
b、计算第三句话的原始词频tf(t,d)
c、计算逆文档频率idf(t,d)
注意:其他的词在计算tf-idf都是0,因为原始词频为0,所以就不需要计算idf了,log是以自然数e为底。
d、计算tf-idf
所以,第一个句子的tf-idf特征向量为[0,1,1.29,1.29,0,1,0]
e、tf-idf的L2归一化
推荐系统之TF-IDF算法实现
推荐系统之TF-IDF算法实现
词频-逆文档频率(TF-IDF)是一种用于资讯检索与文本挖掘的常加权技术。该技术是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中一个文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
如下公式:TF是字词在文件中出现的频率,即词频;IDF是字词在语料库中出现的频率,即逆文档频率。
下面我们看一下词频TF的计算公式,分子表示i在j中出现的次数,分母表示文档j的总词数。
我们再看一下逆向文件频率的公式,其中N表示文档集中文档总数,Ni表示文档集中包含词i的文档数,加1的目的方式分子或者分母为0.
代码如下:
我们给出两句话:docA = 'The cat sat on my bed' docB = 'The dog sat on my knees'
,分别求这两句话的词频-逆文档频率TF-IDF,判断每个词的重要性。
步骤大概如下:
1-首先将两句话合并起来,构建为词库wordSet。
2-wordDictA统计第一句话词出现的次数,wordDictB统计第二句话词出现的次数。
3-computeTF()方法计算词频 TF,computeIDF()方法计算逆文档频率IDF,TFIDF()方法计算词频-逆文档频率(TF-IDF),TF-IDF越大说明该词的重要性越大。
import numpy as np
import pandas as pd
docA = 'The cat sat on my bed'
docB = 'The dog sat on my knees'
bowA = docA.split(" ")
bowB = docB.split(" ")
#构建词库
wordSet = set(bowA).union(set(bowB))
print(wordSet)
#进行词数统计
#用统计字典保存词出现的次数,初始化为0
wordDictA = dict.fromkeys(wordSet, 0)
wordDictB = dict.fromkeys(wordSet, 0)
#遍历文档,统计次数
for word in bowA:
wordDictA[word] += 1
for word in bowB:
wordDictB[word] += 1
print(pd.DataFrame([wordDictA,wordDictB]))
#计算TF
def computeTF(wordDict, bow):
#用一个字典对象记录TF,把所有词对应在文档里的TF都算出来。
tfDict =
bowCount = len(bow)
for word, count in wordDict.items():
tfDict[word] = count / bowCount
return tfDict
tfA = computeTF(wordDictA, bowA)
tfB = computeTF(wordDictB, bowB)
print(tfA)
print(tfB)
#计算逆文档频率
def computeIDF(wordDictList):
#用一个字典对象来保存idf对象,每个词作为key,初始值为0
idfDict = dict.fromkeys(wordDictList[0], 0)
N = len(wordDictList)
import math
for wordDict in wordDictList:
#遍历字典中的每个词汇,统计Ni
for word, count in wordDict.items():
if count > 0:
#先把Ni增加1,存入到idfDict
idfDict[word] += 1
#带公式,计算
for word, NI in idfDict.items():
idfDict[word] = math.log10((N+1) / (NI+1))
return idfDict
idfs = computeIDF([wordDictA,wordDictB])
print(idfs)
#计算TF-IDF
def TFIDF(tf, idfs):
tfidf =
for word, tfval in tf.items():
tfidf[word] = tfval * idfs[word]
return tfidf
tfidfA = TFIDF(tfA, idfs)
tfidfB = TFIDF(tfB, idfs)
print(pd.DataFrame([tfidfA,tfidfB]))
其中前三行输出的是每个词出现的次数,第四五行是第一句话和第二句话词频TF,第六行是,每个词的逆文档频率IDF,最后三行是两句话中每个词的词频-逆文档频率(TF-IDF),TF-IDF越大说明该词的重要性越大。
我们看一下运行结果的最后三行,可以看到两句话中按权重比例,最重要的分别是cat , bed 和 dog ,knees,其它的词相对来说不重要。
以上是关于情感分析之TF-IDF算法的主要内容,如果未能解决你的问题,请参考以下文章
R语言文本挖掘tf-idf,主题建模,情感分析,n-gram建模研究