由于语料缺乏,前期若使用到情感分析,建议暂时使用SnowNLP(此模块主要使用淘宝评论语料)做情感挖掘,但不仅仅为单纯调用,需要优化,下面是一些实践思考:
可在此基础上优化,比如文本需要特别处理,除了平常的去停用词外,还可以需要对输入的文本结合词性等进行处理。
下面是一些常识:
一)无情感的词语(如去停用词,去掉语气词,无词性标签的词语)
二)对于文本过长,则可以考虑提取关键词或抽取文本摘要后再提取关键词
对于后者实践结果差异明显:
以"发布了头条文章: 《5分钟11亿!京东双11场景化产品消费增长明显》 5分钟11亿!京东双11场景化产品消费增长明显 "为例子, 显然该文本为“积极”文本。
1)s = SnowNLP("发布了头条文章:《5分钟11亿!京东双11场景化产品消费增长明显》 5分钟11亿!京东双11场景化产品消费增长明显")
得分为05,明显不符合
2)s = SnowNLP(“ ”join(jiebaanalysetextrank("发布了头条文章:《5分钟11亿!京东双11场景化产品消费增长明显》 5分钟11亿!京东双11场景化产品消费增长明显")))
而对于文本特别长的,则可以先抽取摘要,再对摘要提取关键词。
这主要由于此SnowNLP主要用贝叶斯机器学习方法进行训练文本,机器学习在语料覆盖上不够,特征上工程处理不当会减分,也没考虑语义等。
为何要考虑语义层面:
以“ 苏宁易购,是谁给你们下架OV的勇气” 中的“ 下架”其实才是中心词(为表达愤怒的文本),但“ 勇气 ”为下架的宾语(其为积极的文本),此句应该结果小于05,但实际为088,去掉“苏宁易购”则为06>
认知、情感与意志是人类三种基本意识形式,虽然,人们对于人类的认知过程的研究,已经取得了很大的成就,目前的电脑已经能够很好地代替人脑进行各种抽象思维、逻辑推理和数学运算,但是对于人类的情感过程和意志过程的研究,却举步维艰。迄今为止,机器人除了能够机械性地模拟和很粗略地识别一些人类的简单表情以外,再也无法前进一步,情感成了人脑与电脑之间无法逾越的鸿沟,制造一台拥有人类情感的机器人似乎是一个永远无法实现的梦想。其实不然,情感只是人类一种特殊的意识形式,只要揭开了情感的哲学本质,了解情感的核心内容,就能够建立情感的数学模型,就能够对情感进行科学分析和精确计算。
一、情感的客观目的
情感的哲学本质就是人对事物的价值关系的一种主观反映,情感与价值的关系在本质上就是主观与客观的关系。也可以说,人的情感活动的逻辑过程与一般认知活动的逻辑过程基本相同,其主要区别在于它们所反映的对象不同,一般认知活动所反映的对象是事物的事实关系,而情感活动所反映的对象是事物的价值关系。
价值观的客观目的在于识别事物的价值率,它是事物价值率的主观反映值。人在价值观的引导下,可以对不同的事物产生不同的选择倾向。然而,仅仅认识事物的价值率是不够的,人仍然无法真正确定对事物的价值资源的投入原则(投入方向和投入规模)。以经济贸易方面为例,如果一个商人的年平均利润率能够达到50%,那么他对于年平均利润率只有20%的经营项目不会感兴趣,甚至会产生反感;如果一个商人的年平均利润率只能达到15%,那么他对于年平均利润率只有20%的经营项目将会产生浓厚的兴趣。事实上,当事物的价值率较小时,人不仅不会对它投入价值资源,而且还会不断把以前投入的价值资源抽调出来,只有当事物的价值率大于某个确定值时,人才会不断追加对它的价值资源的投入规模。这个确定值就是主体的“中值价值率”。
中值价值率:根据主体所有活动的价值率以及相应的作用规模,可以求出一个加权平均价值率,称为主体的中值价值率或平均价值率,用Po来表示。
“中值价值率”是主体一个最重要的价值特性,它反映了主体的价值创造能力或本质力量的最重要方面——价值增长速度,主体的情感将会以它为参考系,确定对于所有事物的基本态度:凡是价值率大于其中值价值率的事物,主体将会对它产生正向的情感;凡是价值率小于其中值价值率的事物,主体将会对它产生负向的情感。即情感的客观目的在于以主体的中值价值率为基准,识别事物的价值率相对于主体的中值价值率的差值,从而为主体的行为和思维活动提供精确、有序和恰当的驱动力。
二、情感的数学定义
不难证明(从略):
中值价值率分界定理:当事物的价值率大于主体的中值价值率时,主体就会不断扩大其作用规模或增加其价值资源投入量;相反,当事物的价值率小于主体的中值价值率时,主体就会不断缩小其作用规模或减少其价值资源投入量。
可以看出,主体的中值价值率是主体对于不同事物确定不同的价值资源投入原则的分界点,主体只要识别出事物的价值率与自己的中值价值率的差值,就可以确定对于不同事物的价值资源投入方向,以实现价值资源的最佳配置。
http://minieastdaycom/bdmip/180414224336264html
在这篇文章中,主要介绍的内容有:
1、将单词转换为特征向量
2、TF-IDF计算单词关联度
文本的预处理和分词。
如何将单词等分类数据转成为数值格式,以方便我们后面使用机器学习来训练模型。
一、将单词转换为特征向量
词袋模型(bag-of-words model):将文本以数值特征向量的形式来表示。主要通过两个步骤来实现词袋模型:
1、为整个文档集(包含了许多的文档)上的每个单词创建一个唯一的标记。
2、为每个文档构建一个特征向量,主要包含每个单词在文档上的出现次数。
注意:由于每个文档中出现的单词数量只是整个文档集中很少的一部分,因此会有很多的单词没有出现过,就会被标记为0。所以,特征向量中大多数的元素就会为0,就会产生稀疏矩阵。
下面通过sklearn的CountVectorizer来实现一个词袋模型,将文档转换成为特征向量
通过countvocabulary_我们可以看出每个单词所对应的索引位置,每一个句子都是由一个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,129,129,0,1,0]
e、tf-idf的L2归一化
欢迎分享,转载请注明来源:浪漫分享网
评论列表(0条)