Python中Stanford词性标注性能慢如何优化
代码如下
#! /usr/bin/env python
# -*- coding: utf-8 -*-
“”"
*
“”"
import sys
import time
from nltk.tag import StanfordPOSTagger
reload(sys)
sys.setdefaultencoding(‘utf-8’)
model_filename = “./data/modles/pos.tagger”
path_to_jar = “./stanford-postagger.jar”
Tagger = StanfordPOSTagger(model_filename=model_filename, path_to_jar=path_to_jar)
if name == “main”:
st = time.time()
print Tagger.tag([u"你的", u"百度", u"打人"]), time.time()-st
print Tagger.tag([u"你的", u"百度", u"打人"]), time.time()-st
print Tagger.tag([u"你的", u"百度", u"打人"]), time.time()-st
输出:
[(u'\u4f60\u7684', u'nz'), (u'\u767e\u5ea6', u'nz'), (u'\u6253\u4eba', u'v')] 5.10674095154 s
[(u'\u4f60\u7684', u'nz'), (u'\u767e\u5ea6', u'nz'), (u'\u6253\u4eba', u'v')] 10.2533240318 s
[(u'\u4f60\u7684', u'nz'), (u'\u767e\u5ea6', u'nz'), (u'\u6253\u4eba', u'v')] 16.8123478889 s
速度竟然如此慢,请大佬赐教,是我打开方式不对还是怎么??
Python中Stanford词性标注性能慢如何优化
帖子没给代码,但“性能慢”这问题我熟。StanfordNLP工具(不管是stanfordnlp、stanza还是nltk的包装)启动慢和运行慢是通病,主要卡在加载模型和Java开销上。
核心就两点:别重复加载模型,用批处理。下面给个stanza的示例,这是目前维护最活跃的库:
import stanza
# 1. 一次性下载模型(只需一次)
# stanza.download('en') # 下载英文模型
# 2. 全局初始化一次管道,别在循环里搞
nlp = stanza.Pipeline('en', processors='tokenize,pos', use_gpu=False) # 关GPU如果CPU更强
# 3. 用批处理,别一句一句喂
texts = [
"This is a sample sentence.",
"Another sentence for POS tagging.",
"More text to process efficiently."
]
# 批处理大幅减少开销
doc = nlp("\n\n".join(texts)) # 用双换行符分隔句子
for sent in doc.sentences:
for word in sent.words:
print(f"{word.text}\t{word.pos}")
如果句子多,考虑用nltk的StanfordPOSTagger并设置java_options调大内存:
from nltk.tag import StanfordPOSTagger
import os
# 设置JAVA内存和模型路径
os.environ['JAVAHOME'] = '你的Java路径'
jar = 'stanford-postagger.jar'
model = 'english-bidirectional-distsim.tagger'
tagger = StanfordPOSTagger(model, jar, java_options='-mx4g') # 分配4G内存
总结:模型单例+批处理是王道。
既然已经用了 stanford 不如直接用 hankcs
别用 python 调了,好像每次起一个 jvm 做的,当然慢了

