在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()
    方法。在你的脑海中,有没有一种超快速的方法可以做到这一点?顺便说一句——你给我的启动服务器的命令不起作用,所以我使用了我在问题中列出的命令,一切都很好。对不起,我猜在我的设置中,我的类路径中有西班牙语罐子。它不起作用,因为它找不到那个文件吗?