Perenial youth.

NLP踩坑之路——工具篇

NLP踩坑之路——工具篇

开一条博客来记录一下NLP路上使用工具遇到的一些坑。长期更新。

1.Stanford Parser. 用来进行句法标注,对于传统机器学习来说,是特征抽取的前面工作。抽取到的句法特征作为特征的一部分输入。

使用的是Stanford Parser 。首先第一个问题是,Stanford Parser好像已经不支持python2了。于是正好把陈年代码用python3调整了一下。之后,我用stanford parser直接处理一个txt,然后疯狂爆内存。。发现是因为句子的结尾必须要是”.”,也就是说用”.”来识别一个句子,回车不行。 然后添加”.”之后,能跑通了,跑了几千个句子以后(这个分词结果真的有点慢),又报错停下了,看了一下发现,是因为句子末尾是”J”, “J”和后面加的”.”形成了”J.”,这个好像不能被识别为末尾,因此又报错。于是将末尾改成” .”,即加了一个空格。然后又跑了一下,发现结果好像不对呀,我句法标注的结果几乎全都是compound.


尝试标注了一个英文句子,发现没问题:

搜了一下,没找到这个问题,看文档吧。找到README,看到以下:


噢,原来是要用lexparser-lang. lexparser.sh默认是英语分词器。

查看lexparser-lang,发现有五个参数,整了一下,没work。其实我想做的就两件事:1. 用中文分词器 2. 输出到文件里,因为之后特征工程要使用。其实2完全可以用重定向解决,但是我以为这个输出会和标准输出不太一样(事实是想多了),所以想先配好弄一下。最后没用lexparser-lang, 直接修改了lexparser,把默认改成中文句法标注模型,并且输出到指定文件夹中。最后输出后一看,跟标准输出是一样的,得,直接重定向到指定文件夹中,搞定。最后输出文件长这样:

跑着跑着 发现跑了几千个就崩了 看了print,发现:

爆内存了。。。

查了一下,修改了lexparser.sh的配置 -mx 从150m改到了300m:

可以继续跑了。

另外吐槽一下,stanford parser句法标注是真滴慢。。。

2019.5.2

又踩坑了。。

训练了一夜,发现解析的句子个数和真实的不一样。在数据中对比了一下发现,虽然预处理的时候处理了“.”,但是没有处理“.” 是的没错,这两个点不一样,神奇的是第二个点parser还会把它当做是分隔符。。惊了。没办法,只能再次修改lexparser的参数,添加 -sentences = newline, 确保换行为句子分割的标志。下面这个链接对参数说得挺详细的。

http://www.voidcn.com/article/p-pwnknuvq-er.html

outputformat这个参数也挺重要的: –outputFormat:指定输出句子的格式。 outputFormat具体选项值如下: Oneline:成分句法分析输出文件的格式为每行一句的广义表形式的树结构。 Penn:成分句法分析输出文件的格式为层次化树的形式。默认选项为penn。 我们其实不需要树形结构,所以再将outputformat改成typedDependencies ,重新训练。

2.UnrecognizedFlagError: Unknown command line flag ‘f’

jupyter 下使用tensorflow出现的问题。

添加 tf.app.flags.DEFINE_string(‘f’, ”, ‘kernel’) 即可解决。

xinyu