【问题标题】:spaCy Alternatives in JavaJava 中的 spaCy 替代方案
【发布时间】:2016-12-17 06:43:28
【问题描述】:

我目前使用 spaCy 来遍历依赖树,并生成实体。

nlp = get_spacy_model(detect_lang(unicode_text))
doc = nlp(unicode_text)

entities = set()
for sentence in doc.sents:

  # traverse tree picking up entities
  for token in sentence.subtree:
    ## pick entitites using some pre-defined rules

entities.discard('')
return entities

spaCy 有什么好的 Java 替代品吗?

我正在寻找像 spaCy 那样生成依赖树的库。

编辑:

我研究了斯坦福解析器。但是,它生成了以下解析树:

                     ROOT
                      |
                      NP
       _______________|_________
      |                         NP
      |                _________|___
      |               |             PP
      |               |     ________|___
      NP              NP   |            NP
  ____|__________     |    |     _______|____
 DT   JJ    JJ   NN  NNS   IN   DT      JJ   NN
 |    |     |    |    |    |    |       |    |
the quick brown fox jumps over the     lazy dog

但是,我正在寻找像 spaCy 那样的树结构:

                             jumps_VBZ
   __________________________|___________________
  |       |        |         |      |         over_IN
  |       |        |         |      |            |
  |       |        |         |      |          dog_NN
  |       |        |         |      |     _______|_______
The_DT quick_JJ brown_JJ   fox_NN  ._. the_DT         lazy_JJ

【问题讨论】:

  • 你看过 NLP4j 吗?

标签: nlp stanford-nlp pos-tagger spacy


【解决方案1】:

您正在寻找Stanford Dependency Parser。像大多数斯坦福工具一样,这也与Stanford CoreNLP 捆绑在depparse 注释器下。其他解析器包括 Malt parser(基于特征的移位减少解析器)和 Ryan McDonald 的 MST parser(准确但速度较慢的最大生成树解析器)。

【讨论】:

  • 是的,使用它我得到了上面的树^^。但是,我需要一些帮助来解释这一点并且找不到任何文档。 Spacy 通过标记单词使其变得非常容易,因此在 Spacy 中遍历树实际上是遍历句子。而来自斯坦福解析器的依赖不是基于单词的依赖。你能指点我一些文档,以便我可以将斯坦福解析器树转换成 Spacy 生成的东西吗?
  • 斯坦福同时拥有constituency parserdependency parser。而且,令人困惑的是,选区解析器也可以转换为依赖解析。 Spacy 的解析器输出依赖解析,您目前正在尝试使用 CoreNLP 的选区解析器。请参阅:stanfordnlp.github.io/CoreNLP/depparse.html(尝试从句子的BasicDependenciesAnnotation 注释中获取SemanticGraph 对象)
  • 你也可以尝试使用Simple API,它会在内部使用依赖解析器。
【解决方案2】:

另一个与 Java 和其他语言集成的解决方案是使用 Spacy REST API。例如 https://github.com/jgontrum/spacy-api-docker 提供 Spacy REST API 的 Dockerization。

【讨论】:

    【解决方案3】:

    我最近发布了spaCy4j,它模仿了 spaCy 中的 Token 容器对象,并与 spaCy server 或 CoreNLP 集成。

    一旦你有一个正在运行的 spacy-server docker(很容易设置),它就像这样简单:

    // Create a new spacy-server adapter with host and port matching a running instance of spacy-server.
    SpaCyAdapter adapter = SpaCyServerAdapter.create("localhost", 8080);
    
    // Create a new SpaCy object. It is thread safe and should be reused across our app
    SpaCy spacy = SpaCy.create(adapter);
    
    // Parse a doc
    Doc doc = spacy.nlp("My head feels like a frisbee, twice its normal size.");
    
    // Inspect tokens
    for (Token token : doc.tokens()) {
        System.out.printf("Token: %s, Tag: %s, Pos: %s, Dependency: %s%n", 
                token.text(), token.tag(), token.pos(), token.dependency());
    }
    

    如有任何问题等,请随时通过 github 联系。

    【讨论】:

      【解决方案4】:

      spacy可以通过java程序运行。

      应该首先通过执行以下命令从命令提示符创建环境

      python3 -m venv env
      source ./env/bin/activate 
      pip install -U spacy
      python -m spacy download en
      python -m spacy download de
      

      使用以下命令创建一个 bash 文件 spacyt.sh,与 env 文件夹平行

      #!/bin/bash 
      python3 -m venv env
      source ./env/bin/activate 
      python test1.py
      

      将spacy代码放置为python脚本,test1.py

      import spacy
      print('This is a test script of spacy')
      nlp=spacy.load("en_core_web_sm")
      doc=nlp(u"This is a sentence")
      print([(w.text, w.pos_) for w in doc])
      

      // 代替打印,我们可以写入文件进行进一步处理

      在java程序中运行bash文件

      String cmd="./spacyt.sh";
      
              try {
                  Process p = Runtime.getRuntime().exec(cmd);
                  p.waitFor();
                  System.out.println("cmdT executed!");
              } catch (Exception e) {
                  e.printStackTrace();
              }
      

      【讨论】:

      • 在生产延迟关键路径的代码时这是不切实际的,例如:建议引擎的服务后端等。对于这个特定的项目,我最终用 Python 在后端编写了代码:)
      猜你喜欢
      • 2012-07-26
      • 2013-03-10
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2015-04-29
      • 1970-01-01
      相关资源
      最近更新 更多