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词性标注性能慢如何优化

3 回复

帖子没给代码,但“性能慢”这问题我熟。StanfordNLP工具(不管是stanfordnlpstanza还是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}")

如果句子多,考虑用nltkStanfordPOSTagger并设置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 做的,当然慢了

回到顶部