当前位置: 首页 > 知识库问答 >
问题:

我可以从Stanford CorenLP的TokensRegex匹配结果中获得一个实体提及吗?

李泓
2023-03-14

我想将地址(可能还有其他基于规则的实体)添加到NER管道中,令牌Regex似乎是非常有用的DSL。按照https://stackoverflow.com/a/42604225,我创建了以下规则文件:

ner = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NamedEntityTagAnnotation" }

{ pattern: ([{ner:"NUMBER"}] [{pos:"NN"}|{pos:"NNP"}] /ave(nue)?|st(reet)?|boulevard|blvd|r(oa)?d/), action: Annotate($0, ner, "address") }

下面是一个scala repl会话,展示了我如何尝试设置注释管道。

@ import edu.stanford.nlp.pipeline.{StanfordCoreNLP, CoreDocument}

@ import edu.stanford.nlp.util.PropertiesUtils.asProperties

@ val pipe = new StanfordCoreNLP(asProperties(
  "customAnnotatorClass.tokensregex", "edu.stanford.nlp.pipeline.TokensRegexAnnotator",
  "annotators", "tokenize,ssplit,pos,lemma,ner,tokensregex",
  "ner.combinationMode", "HIGH_RECALL",
  "tokensregex.rules", "addresses.tregx"))
pipe: StanfordCoreNLP = edu.stanford.nlp.pipeline.StanfordCoreNLP@2ce6a051

@ val doc = new CoreDocument("Adam Smith lived at 123 noun street in Glasgow, Scotland")
doc: CoreDocument = Adam Smith lived at 123 noun street in Glasgow, Scotland

@ pipe.annotate(doc)

@ doc.sentences.get(0).nerTags
res5: java.util.List[String] = [PERSON, PERSON, O, O, address, address, address, O, CITY, O, COUNTRY]

@ doc.entityMentions
res6: java.util.List[edu.stanford.nlp.pipeline.CoreEntityMention] = [Adam Smith, 123, Glasgow, Scotland]

我尝试使用regexner和下面描述的令牌regex来处理它https://stanfordnlp.github.io/corenlp/regexner.html,但似乎无法使其正常工作。

由于我使用的是scala,所以如果有必要,我很乐意深入研究Java API,而不是摆弄属性和资源文件。

共有1个答案

戚阳曜
2023-03-14

是的,我最近添加了一些更改(在GitHub版本中),使这变得更容易!确保从GitHub下载最新版本。尽管我们的目标是很快发布Stanford CorenLP3.9.2,但它将会有这些变化。

如果您阅读本页,您可以了解NerCombinerAnnotator运行的完整的NER管道。

https://stanfordnlp.github.io/corenlp/ner.html

java -Xmx5g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner -ner.additional.tokensregex.rules my_ner.rules -outputFormat text -file example.txt

这将在完整命名实体识别过程中运行tokensregex子注释器。然后,当实体提及的最后一步运行时,它将对提取的命名实体规则进行操作,并从中创建实体提及。

 类似资料:
  • 当Callable返回与条件匹配的结果时,是否有一种方法可以停止Javas ExecuterService? 我有以下算法(代码A): 平均而言,functionB的运行速度是functionA的5倍(在8个内核上)。 这很好,但不完美。在functionA中,someFunction()在找到结果!=null之前平均被调用大约20次。在functionB中,someFunction()总是被调用

  • 问题内容: 当我跑步 我懂了 但我认为它应该回来 因为字符串中有3 s,而不是2! 这是为什么? 我希望能够在RegEx中搜索字符串的所有出现并对其进行迭代。 FWIW:我正在使用node.js 问题答案: 仅返回第一个匹配项的捕获集,而不返回您期望的匹配项。因此,您真正看到的是(整个匹配项“ a”)和(第一个捕获项),即长度为2的数组。 同时,它的设计使您可以 再次 调用它以获取 下一个 匹配项

  • 我使用的是C#,这是我如何尝试基于斯坦福Corenlp文档获得结果的代码片段。 我不知道该使用哪个注释:

  • 我已经成功地配置和映射了多个实体,一切正常。 现在我想使用一个自定义查询,将多个实体连接起来,并在这些实体上定义一些where子句。 SQL为我的提供了正确的结果。但是我没有where子句对所有其他映射实体的限制,比如,等等。 我使用的是惰性加载,当我使用,JPA将执行一个新的select和my where子句。 那么,我如何才能使我所有的连接实体建立在where子句及其限制之上呢。

  • 问题内容: 当我从命令行调用存储的proc时,我得到以下信息。 这是我的Java代码的片段 当我执行该语句时,仅返回event_table结果。我阅读以下查询: 我试图避免对数据库发出多个请求,因为它非常慢(300毫秒,具体取决于多少结果) 可能吗? 问题答案: 我找到了这篇很棒的文章。http://www.herongyang.com/JDBC/MySQL-CallableStatement-M