在Python中加速Stanford依赖项解析
有没有更快的方法来实现在Python中加速Stanford依赖项解析,python,nltk,stanford-nlp,Python,Nltk,Stanford Nlp,有没有更快的方法来实现CoreNLPParser或我应该通过另一个库与API交互?还是应该从Java书籍中抹去灰尘 我有6500个句子的语料库,我正在运行nltk.parse.corenlp中的CoreNLPParser方法。为了测试我之前编写的tree\u height函数,我已经将我正在做的所有事情与我的主要项目隔离开来。然而,速度是一样的——事实上,这个过程需要15分钟才能完成 这是我的树高功能: from nltk.parse.corenlp import CoreNLPParser P
CoreNLPParser
或我应该通过另一个库与API交互?还是应该从Java书籍中抹去灰尘
我有6500个句子的语料库,我正在运行nltk.parse.corenlp
中的CoreNLPParser
方法。为了测试我之前编写的tree\u height
函数,我已经将我正在做的所有事情与我的主要项目隔离开来。然而,速度是一样的——事实上,这个过程需要15分钟才能完成
这是我的树高功能:
from nltk.parse.corenlp import CoreNLPParser
Parser = CoreNLPParser(url='http://localhost:9000')
def tree_height(tokenized_sent):
ddep = Parser.raw_parse(tokenized_sent)
for i in ddep:
sent_height = i.height()
return sent_height
我正在分析西班牙语句子,之前使用以下命令启动了CoreNLP服务器:
java-mx10g-cp“*”edu.stanford.nlp.pipeline.StanfordCoreNLPServer-serverProperties StanfordCoreNLP-spanish.properties-port 9000-超时15000
我还尝试过将mx3g
部分改为mx5g
,这似乎没有多大区别
我已经看过并正在运行一个最新版本的StanfordCoreNLP
---更新---
我担心我的脚本执行缓慢的原因是因为效率低下或编写的代码不好——因此,我尝试通过以下方法来发现代码的效率低下:
在不调用任何NLP函数的情况下迭代所有数据(从数据帧)大约需要20秒李>
对所有数据进行迭代,并仅对所有数据进行句子标记,大约需要30秒
在我最近的一次尝试中,我将所有标记化的句子添加到一个变量中,并在每个变量上迭代调用tree\u height
函数,发现速度没有差异(这与我开始隔离代码之前的时间一样长)
因为解析自然语言可能很复杂,所以您的经历似乎不可接受。当您尝试在斯坦福解析器演示界面中使用spanishPCFG.ser.gz模型解析一个简单的句子时,可能需要几毫秒,但是一个长而复杂的句子可能需要几秒钟。你可以试一试,他们也提供统计数据
如果需要节省时间,可以尝试并行化解析任务;这就是我所能建议的
您提供的链接是一个关于标记器的讨论,Steven Bird说它已经解决了
干杯好的,下面是我们正在开发的Python接口的描述。要获得最新版本,您必须从GitHub下载并遵循安装说明(很容易遵循!!)
转到GitHub并克隆Python接口repo:
java -Xmx4g edu.stanford.nlp.pipeline.StanfordCoreNLPServer -serverProperties StanfordCoreNLP-spanish.properties -port 9000 -timeout 15000
import corenlp
client = corenlp.CoreNLPClient(start_server=False, annotators=["tokenize", "ssplit", "pos", "depparse"])
# there are other options for "output_format" such as "json"
# "conllu", "xml" and "serialized"
ann = client.annotate(u"...", output_format="text")
将cd放入目录并键入python setup.py安装
(很快我们将使用conda
和pip
等设置此功能,但目前它仍在开发中……您现在可以在pip上获得较旧的版本)
在单独的终端窗口中,启动Java服务器:
java -Xmx4g edu.stanford.nlp.pipeline.StanfordCoreNLPServer -serverProperties StanfordCoreNLP-spanish.properties -port 9000 -timeout 15000
import corenlp
client = corenlp.CoreNLPClient(start_server=False, annotators=["tokenize", "ssplit", "pos", "depparse"])
# there are other options for "output_format" such as "json"
# "conllu", "xml" and "serialized"
ann = client.annotate(u"...", output_format="text")
注意:确保在类路径中有所有必要的jar,或者使用-cp“*”
选项从包含所有适当jar的目录中运行
运行此Python代码:
java -Xmx4g edu.stanford.nlp.pipeline.StanfordCoreNLPServer -serverProperties StanfordCoreNLP-spanish.properties -port 9000 -timeout 15000
import corenlp
client = corenlp.CoreNLPClient(start_server=False, annotators=["tokenize", "ssplit", "pos", "depparse"])
# there are other options for "output_format" such as "json"
# "conllu", "xml" and "serialized"
ann = client.annotate(u"...", output_format="text")
ann
将包含最终的注释信息(包括依赖项解析)…这应该比您报告的要快得多…请尝试一下并让我知道。根据我的个人经验,斯坦福Corenlparser speed对您几乎没有帮助,但您可以求助于另一种解决方案(扩展性更好)。一个快速的技巧是成批传递文本。然而,我想知道你的情况会有多快。你能分享你试图注释的文件吗?我想当我试图解析另一个数据时,速度相当快。我试图写一些关于通过Python访问服务器的信息。你的时间应该不会那么慢,当我通过服务器解析西班牙语句子时,只花了约2分钟就完成了6500个。我很快会写更多的。@alvas你是我的NLP英雄。我不允许共享该文件,我已经用我发布后尝试过的一些东西更新了该问题。@StanfordNLPHelp我想看看你将如何设置它会很有用——我想知道我的StanfordNLP设置中是否有我可能遗漏或忘记做的事情。这会大大加快!!我现在只需要弄清楚如何找到给定句子的树高--NLTK
返回一个tree
类--它有一个方便的height()
方法。在你的脑海中,有没有一种超快速的方法可以做到这一点?顺便说一句——你给我的启动服务器的命令不起作用,所以我使用了我在问题中列出的命令,一切都很好。对不起,我猜在我的设置中,我的类路径中有西班牙语罐子。它不起作用,因为它找不到那个文件吗?