Stanford Word Segmenter问题整理

最近在做一些nlp相关的项目,在涉及到Stanford CoreNLP工具包处理中文分词的时候,发现耗时问题很严重:

Item time(s)
jieba 0.4
snownlp 7.4
pynlpir 0.8
StanfordCoreNLP 21.5
pyltp 5.3

因为Stanford CoreNLP调用的是这个pipeline,而我们实际用的是切词功能,所以尝试只用它的切词部分功能,但是在做的过程中发现一些问题,整理如下:

官网给出的方法nltk.tokenize.stanford_segmenter module是这么写的:

1
2
3
from nltk.tokenize.stanford_segmenter import StanfordSegmenter
seg = StanfordSegmenter()
seg.default_config('zh')

但是这个缺少各种数据路径的,是完全不通的。

然后度娘的top1的答案给出的解决方案是:`

1
segmenter = StanfordSegmenter(path_to_jar="stanford-segmenter-3.4.1.jar", path_to_sihan_corpora_dict="./data", path_to_model="./data/pku.gz", path_to_dict="./data/dict-chris6.ser.gz")

如果你的nltk的版本比较新,恭喜你,你会遇到下面这个问题:
TypeError: expected str, bytes or os.PathLike object, not NoneType

我在stackoverflow上找了半天,发现有如下的解决方案:

1
2
3
4
from nltk.parse.corenlp import CoreNLPParser 
corenlp_parser = CoreNLPParser('http://localhost:9001', encoding='utf8')
result = corenlp_parser.api_call(text, {'annotators': 'tokenize,ssplit'})
tokens = [token['originalText'] or token['word'] for sentence in result['sentences']

可以完美解决,原因之前作者也说了,据称升级版本后不兼容,各位看看就好“TypeError: expected str, bytes or os.PathLike object, not NoneType” about Stanford NLP

这个坑花了我两个多小时(主要在下载各种gz包),希望大家能够避免。

欢迎大家关注我的个人bolg知乎,更多代码内容欢迎follow我的个人Github,如果有任何算法、代码、转行疑问都欢迎通过公众号发消息给我。

打赏的大佬可以联系我,赠送超赞的算法资料