最近在做一些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是这么写的:
from nltk.tokenize.stanford_segmenter import StanfordSegmenter
seg = StanfordSegmenter()
seg.default_config('zh')
但是这个缺少各种数据路径的,是完全不通的。
然后度娘的top1的答案给出的解决方案是:`
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上找了半天,发现有如下的解决方案:
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,如果有任何算法、代码、转行疑问都欢迎通过公众号发消息给我。