山东大学数据科学导论实验,自然语言处理。
目前不会放完整代码,但是已经帮你们节省70%的时间了
准备工作
安装nltk, snowNLP这两个python库。
pip3 install nltk
pip3 install snowNLP
数据预处理
这个review.xml,按照hw2.ipynb文件里说的是不行的
from lxml import etree
parser = etree.XMLParser(recover=True)
tree = etree.parse("reviews.xml",parser)
(反正我是怎么试也不行,各位如果有办法的话,希望能在评论区里回复我一下……)
解决办法
将review.xml拖入到python目录下
可以看到仅2.56M就30k行,真的是很大的一个文件,所以我觉得没必要把所有的评论都扒拉下来,因为我们是在做实验不是在做项目,也不是在训练评论模型。
处理多与少的区别只是时间问题,所以我们这样,将展示出来的这一小部分全选,复制粘贴到一个新建的part.xml中。
复制过去之后,我们看到报了很多错,这个错也就是我们为什么不能正常用上面的方法的原因(估计是编码的锅,我没去转,有转的同学告知一下编码方式和调用改变编码函数的位置)
看来这个&就是罪魁祸首了,我们用替换的方式将它换成空格或者and。
获取评论内容
from lxml import etree
parser = etree.XMLParser(recover=True)
tree = etree.parse("part.xml",parser)
root = tree.getroot()
review_text = root[0].find('review_text').text
这样就获得了一条评论,写入到txt文件,以便进行下一步处理。
使用Stanford parser+nltk处理
我们打开老师给的文件夹,找到
stanford-parser-3.4.1-javadoc.jar
stanford-parser-3.4.1-models.jar
stanford-parser.jar
将其移动到python项目下,因为斯坦福的这个parser是java上的,所以我们需要一些方法来调用。
from nltk.parse.stanford import StanfordParser
eng_parser = StanfordParser(path_to_jar='../jar/stanford-parser-3.4.1-javadoc.jar',
path_to_models_jar='../jar/stanford-parser-3.4.1-models.jar',
model_path='edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz')
这里我真的想提一下这个
edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz
我是真的没找到这个文件(?我也不知道是不是文件)
但是我在命令行里调用./lexparser-lang.sh data/english-onesent.txt
它居然自动调用了这个路径下的这个文件。
老天爷我真的是找了半天,我大部分时间都花在找这个文件上了TvT……然后我们直接复制上就行。。。。
2017-12-01修改:我终于找到了这个玩意儿在哪了!!!
我看到Stanford Parser给的所有文件中,有很多shell,其中有一个叫lexparser-gui.sh
也就是说这个是有图形界面的。我们在命令行界面(Linux/macOS Sierra/macOS High Sierra)
在StanforParser文件夹下,输入命令./lexparser-gui.sh
可以打开这个界面
我们选择这个Load Parser在打开的文件夹页面下,选择stanford-parser-3.4.1-models.jar
然后就有了!!!
Windows的话,可以直接把jar当做压缩文件打开的。
如果需要画语法树,只需要
调用
a = list(eng_parser.raw_parse("I love Eason!"))
for line in a:
line.draw()
就可以画出来了。
情感分析
首先我们使用一定方法,将评论按句子分好,推荐textblob这个库。不要小看分句子,不是简单的将’.’作为句子结束的标识,例如Mr.Lee这很明显不是一个句子。而且在NLP中,上下文也是极为重要的,这个库也会根据上下文分类,所以用这个专业的库会好一些。
from textblob import TextBlob
a = TextBlob("I love Eason!He is the best singer of all.")#它会将句子分好
print(a.sentences[0].sentiment)#查看感情
a.sentences[0].sentiment
包含两个属性,一个是polarity,[-1,1],负代表消极情绪,正代表积极情绪,绝对值越高越强烈。
一个是subjectivity,代表主观性,值越大,越主观。
到这里就做完啦~