python+nltk+Stanford Parser+snowNLP

山东大学数据科学导论实验,自然语言处理。

目前不会放完整代码,但是已经帮你们节省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目录下
拖入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,代表主观性,值越大,越主观。

另附自定义parser的方法

到这里就做完啦~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值