采集内容插入词库(一个代码在公众号datadw里回复京东即可获取(组图) )
优采云 发布时间: 2022-03-24 00:20采集内容插入词库(一个代码在公众号datadw里回复京东即可获取(组图)
)
在我最近的实习期间,我正在从事一个关于新闻文本情感分析的项目。在这里,用京东的产品评论来实践,从data采集到模型实现写一篇完整的文章,以备日后回顾。其实我用的方法并不难,甚至有点幼稚,所以把它当作练习吧。
本文代码可在公众号datadw中回复京东获取。
数据采集
这里为了避免人工标注的麻烦,使用了京东iPad的用户评论。
#没有
事实上,NLP 情感分析中最耗时的部分是人工标注。
仔细看调试控制台很容易发现,产品的评论信息是用json传递的。如下:
这个网址其实比较容易看出设计师的想法。productId是产品对应的ID,score是用户对产品的评分,pageSize应该是请求返回的评论数。在实践中发现一般情况下pageSize不可能是无限的,也就是你不要想着把pageSize写成大尺寸,然后一次请求就可以返回大量数据。我的做法是把pageSize写成大(^-^),然后不断递增页面,不断爬取数据。
评分规则如下:
*1:负面评价
* 2:中评
*3:赞美
* 5:后续审查
将此 URL 放入浏览器的搜索地址中,即可得到相应的 JSON 数据返回。这里就不展示了,自己看吧。一开始你可能会认为这个json,但只要仔细看看就知道你想要的数据在哪里。要知道写网站的程序员也是程序员。程序员喜欢整洁的东西,因为“简洁来自整洁”,所以只要找到他的方法来实现整洁,就可以轻松获得对应的数据。
事实上,京东对网络爬虫的容忍度很高,即使没有任何速度控制,它也可以毫无阻碍地完成数据采集的工作。推荐使用Python3.5,因为3.5对中文支持更好,另外下载Request库。此处不再赘述。
构建词向量TF-IDF的方法
我这里使用的是使用TF-IDF来计算词库中最具代表性的词。
概念
TF-IDF(词频-逆文档频率)是一种常用的信息检索和信息挖掘加权技术。TF-IDF 是一种统计方法,用于评估单词对文档集或语料库中的一个文档的重要性。一个词的重要性与它在文档中出现的次数成正比,但与它在语料库中出现的频率成反比。搜索引擎经常应用各种形式的 TF-IDF 加权作为文档和用户查询之间相关程度的度量或评级。除了 TF-IDF,互联网上的搜索引擎使用基于链接分析的排名方法来确定文档在搜索结果中出现的顺序。
原则
在给定文档中,词频 (TF) 是指给定单词在文档中出现的次数。这个数字通常被规范化(分子通常小于分母以将其与 IDF 区分开来)以防止它偏向长文件。(同一个词在长文件中的词频可能高于短文件,不管这个词是否重要。)
逆文档频率 (IDF) 是衡量一个词的一般重要性的指标。特定单词的 IDF 可以通过将文档总数除以收录该单词的文档数,然后取所得商的对数来获得。
特定文档中的高词频和整个文档集中该词的低文档频率会导致高权重的 TF-IDF。因此,TF-IDF倾向于过滤掉常用词,保留重要词。
TFIDF的主要思想是:如果一个词或词组在一个文章中频繁出现TF,而在其他文章中很少出现,则认为该词或词组具有良好的类别区分能力,适合分类。TFIDF其实就是:TF*IDF,TF Term Frequency,IDF逆文档频率。TF代表词条在文档d中出现的频率(换句话说:TF词条频率(Term Frequency)是指给定词在文档中出现的次数)。IDF的主要思想是:如果收录term t的文档较少,即n越小,IDF越大,说明term t有很好的分类能力。如果某类文档 C 中收录词条 t 的文档数量为 m,而其他类型中收录t的文档总数为k,显然收录t的文档数为n=m+k。当m很大时,n也很大。,根据IDF公式得到的IDF值会很小,说明条目t的分类能力不强。(另一种说法:IDF逆文档频率(Inverse Document Frequency)是指如果收录词条的文档越少,IDF越大,说明词条有很好的区分类别的能力。)但实际上,如果一个词条频繁在一类文档中的出现表明该条目能够很好地代表该类文本的特征。这些词条应该被赋予较高的权重,并被选为该类文本的特征词来区分它们。和其他类别的文档。这就是 IDF 的不足之处。
在给定文档中,词频 (TF) 是指给定单词在文档中出现的频率。这个数字被标准化为术语计数,以防止它偏向长文件。(同一个词在长文件中的词数可能比在短文件中的词数多,无论该词是否重要。)对于特定文件中的词,其重要性可以表示为:
特定文档中的高词频和整个文档集中该词的低文档频率会导致高权重的 TF-IDF。因此,TF-IDF倾向于过滤掉常用词,保留重要词。
补充说明
这里提出的对TF-IDF的详细介绍只是给出了一个通用的TF-IDF实现方式,但是需要注意的是,通用实现方式下的TF-IDF确实可以选择最能区分不同文档的词。但是我想做的是选择最能区分不同情绪的词,所以在这里我对公式进行了简单的修改。
在计算tf的时候,我认为整个语料库中只有两种文档,一种是正文档,一种是坏文档,每个评论都不细分。有关详细信息,请参阅实现。
PMI点互信息
PMI(Pointwise Mutual Information)是衡量两个事物(如两个词)之间相关性的指标。
在概率论中,我们知道如果 x 和 y 不相关,那么 p(x,y)=p(x)p(y)。两者之间的相关性越大,p(x,y) 与 p(x)p(y) 相比就越大。用下面的公式可能会更好理解。在y的情况下,出现x的条件概率p(x|y)除以x本身的概率p(x),这自然表示了x和y的相关程度。
这里的log来自于信息论的理论,可以简单理解为,取p(x)的log时,将一个概率转换为信息量(要乘以-1使其为正number),以 2 为基数,可以简单理解为可以用多少位来表示这个变量。
补充说明
和之前的TF-IDF一样,希望能选出对情感分类最有效的词,所以在这里对公式做一个简单的修改。
PMI(word,pos)=logP(word,pos)P(pos)∗P(word)
pos代表文档的情感,word代表某个词。
分母表示同时作为 pos 情绪和 word 出现的概率。
完整代码
本文代码可在公众号datadw中回复京东获取。
在实现中,我们需要解决的是分词和词频计算的问题。
对于 NLP,第一个问题是实现分词。市场上有很多分词库,它们都运行良好。可惜NLTK不支持中文分词方法,这里我用jieba分词。jieba分词比较好用,很容易添加自定义词库。在这个项目中,不需要添加自定义词库,因为产品评论没有非常特殊的固定词。但是在我的实习项目中,因为有很多固定用法的词,所以添加一个自定义词库是非常有必要的。
另外需要注意的是,虽然不需要添加自定义词库,但还是需要删除一些“停用词”。这里的无效是指在表达情绪时非常常用的词,没有明确的情绪方向。也就是这些词的词频会很高,所以这些词的TF-IDF可能还是很高的,所以需要主动删除,避免引入噪声。
实验结果
构造向量时,不可能直接使用所有的词,只能选择一部分。在这里,我选择了 PMI 中前 30 个最大的单词。
文件不错,速度不错,正品,很快就喜欢了,屏幕质量不太满意,很流畅,值这个价
差评文件 降价 无客服 无差评屏 送激活 太退款 刚买 退货差垃圾礼物 想申请问 发现掉不全 失望快递坑找第一保障差总结
这里选择了几个词,可能很难想象为什么它们如此擅长表达文档情感。有些词可能是常用词,在放入常用词的文档时,需要在分词时提前去除。有些确实表现了人们的情绪,但不一定是一般的情绪词,这就是为什么我想使用这种方法来构建词向量进行情绪分析。基于语义规则的情感分析只能抓住一些众所周知的情感词,而且研究者还需要大量的时间阅读文本才能在文本中找到一些能够反映情感的特殊词,比如在这个例子中,区别,价格保护等词经常出现在负面评论中,反映了人们对商品和服务的看法。当然,
在这里,我的 采集 数据是 1,000 条正面评论和 1,000 条负面评论,因此总共有 2,000 条评论。事实上,如果需要,您可以采集更多评论来训练分类器。京东其实很“开心”被爬取。
另外,根据VC理论,参数的维度越大,需要的训练数据集也越大。一般来说,十倍参数的维度是训练集的下限,所以我用TF-前75个最大的IDF构成一个150维的特征,1500条评论作为训练集。当然,在具体实践中,这几个特征需要重新修改。
至此,数据采集和构建词向量的部分就结束了。NLP情感分析一般有两种方法。首先是根据语义和依赖来量化文本的情感色彩。但是这种方法首先需要一个非常完整的情感词典,同时也需要有良好的语言基础,也就是说,要知道一个句子在什么情况下通常表达为肯定和否定。我个人认为,我们永远不可能穷尽所有的语法规则和情感词汇,这无形中增加了构建分类规则的难度。另外,我个人非常相信大数据。也就是说,我认为大数据可以揭示一些超出人类认知能力的信息,而这些信息很难被人类检测到。这就是机器学习,或者说人工智能,将会如此受人尊敬。第二种方法基于机器学习。在机器学习的基础上,本质上是将其转化为机器学习可以解决的问题。情感分析实际上被认为是机器学习中的二元分类问题。但是机器不能理解文本,所以我们必须能够将文本转换成向量,这样机器才能理解。但实际上,对于情感分析来说,最主流的是第一种方法,因为并不是所有的文本都已经被标记了。也就是说,我们很难爬取到京东的数据。我们一抓起来,就知道文字是正面的还是负面的。在大多数情况下,需要手动标记数据。这项工作是非常劳动密集型的。自己亲身试验过人工标注,一天只能标注400条左右的数据,很累。而对于一个特定的领域,判断情绪也不是一般人能做到的,需要很多专业知识。例如,要判断一条财经新闻是好是坏就不是那么容易了。
所以,其实特征选择的问题并没有那么简单。我这里只使用了单字TF-IDF,显然是一种很粗略的选择方法。当然,你也可以尝试添加bigram之类的。这就是以后的事情了。
大概就是这样。下一部分,我将尝试这里建立的“word2vec”的方法,据此构建机器学习模型,并据此优化模型。
引用
TF-IDF 及其算法
PMI 算法
如何分类
特征依赖
首先,我需要看看我之前选择的功能是否能够满足需求。
其实还有很多参数在这里没有展示。从这个图中,大部分参数的相关性都非常低,这是一件非常好的事情,因为这意味着选择的参数更具表现力。但是我也发现有些参数是重复的,很尴尬。当然,也可以通过 PCA 过滤掉。
从这个图中可以看出,每个参数对情绪都有一定的影响,而且大部分都具有比较强的相关性,这说明所选择的参数并不是随机选择的。
型号选择
这里我选择了一些比较常见的算法模型进行训练,并尝试得到一个比较好的模型。
这里使用Kfold函数循环测试模型,使用f1 Score来选择最合适的模型。
这里我觉得LinearSVC比较好。