【问题标题】:Can I use punctuation in Stanford CoreNLP Named Entities?我可以在斯坦福 CoreNLP 命名实体中使用标点符号吗?
【发布时间】:2017-01-25 02:27:45
【问题描述】:

我正在尝试让 Stanford Core NLP 识别识别码。问题是代码中有标点符号。例如01.A01.01 导致输入被分成三个句子。

此代码的匹配表达式为[0-9][0-9][.][a-z,A-Z][0-9][0-9][.][0-9][0-9]。我已经尝试将其添加到我的 regexner.txt 文件中,但它无法识别它(可能是因为标记位于不同的句子中?)

我也尝试使用类似于以下的 TokenRegex 来匹配它(也没有任何成功)。

/tell/ /me/ /about/ (?$refCode /[0-9][0-9]/ /./ /[a-z,A-Z][0-9][0-9]/ /./ /[0-9][0-9]/ )

一些示例使用...

用户已保留资源 02.G36.63。

21.J83.02 可用吗?

有人有什么想法或建议吗?

【问题讨论】:

  • 您能否介绍一些典型的输入文本。有必要拆成句子吗?
  • 嗨@StanfordNLPHelp。我在上面的问题中添加了一些示例用法。理想情况下,我希望将它们解析为一个句子,而句点 (.) 不被视为句子的结尾。更好的是,如果我可以将代码视为单个令牌并标识为命名实体。但是我不知道该怎么做。

标签: nlp stanford-nlp


【解决方案1】:

我获取了您的示例输入并将“\n”替换为“”,以创建:

The user has resource 02.G36.63 reserved.  Is 21.J83.02 available?

我创建了这个规则文件(sample-rules.txt):

02.G36.63       ID_CODE    MISC    2

我运行了这个命令:

java -Xmx8g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,regexner -regexner.mapping sample-rules.txt -ssplit.eolonly -tokenize.whitespace -file sample-sentence.txt -outputFormat text

我得到了这个输出:

Sentence #1 (9 tokens):
The user has resource 02.G36.63 reserved.  Is 21.J83.02 available?
[Text=The CharacterOffsetBegin=0 CharacterOffsetEnd=3 PartOfSpeech=DT Lemma=the NamedEntityTag=O]
[Text=user CharacterOffsetBegin=4 CharacterOffsetEnd=8 PartOfSpeech=NN Lemma=user NamedEntityTag=O]
[Text=has CharacterOffsetBegin=9 CharacterOffsetEnd=12 PartOfSpeech=VBZ Lemma=have NamedEntityTag=O]
[Text=resource CharacterOffsetBegin=13 CharacterOffsetEnd=21 PartOfSpeech=NN Lemma=resource NamedEntityTag=O]
[Text=02.G36.63 CharacterOffsetBegin=22 CharacterOffsetEnd=31 PartOfSpeech=NN Lemma=02.g36.63 NamedEntityTag=ID_CODE]
[Text=reserved. CharacterOffsetBegin=32 CharacterOffsetEnd=41 PartOfSpeech=NN Lemma=reserved. NamedEntityTag=O]
[Text=Is CharacterOffsetBegin=43 CharacterOffsetEnd=45 PartOfSpeech=VBZ Lemma=be NamedEntityTag=O]
[Text=21.J83.02 CharacterOffsetBegin=46 CharacterOffsetEnd=55 PartOfSpeech=NN Lemma=21.j83.02 NamedEntityTag=O]
[Text=available? CharacterOffsetBegin=56 CharacterOffsetEnd=66 PartOfSpeech=NN Lemma=available? NamedEntityTag=O]

这表示只是在空格上进行标记,因此它停止在句点上中断。它还说只在换行符上拆分句子,因此在输入文件中将整个用户请求放在一行中很重要。你不会得到句子,但你可以得到一个令牌流并识别你的产品代码。

现在,如果您真的想要 Stanford CoreNLP 的全部功能并且不想拆分这些代码,您可以采取雄心勃勃的路线并更改标记器 PTBLexer.flex 文件以包含您的所有 id 代码。

该文件在 repo 中:

https://github.com/stanfordnlp/CoreNLP/blob/master/src/edu/stanford/nlp/process/PTBLexer.flex

您必须在 Google 上找到有关将 PTBLexer.flex 文件编译成 PTBLexer.java 的说明。这个网站应该有你需要的信息:

http://www.jflex.de/

这基本上意味着添加您的 id 代码并进行一些轻微的编辑,然后重新构建 PTBLexer。然后使用您的自定义标记器,Stanford CoreNLP 会将您的产品代码视为完整的标记,如果您想做分析用户请求的依赖结构之类的操作,则可以进行正常的句子拆分。

【讨论】:

  • 谢谢。这种方法对我有用,因为我正在处理的文本很简单。无论如何,它们不应该超过一个句子。
  • 您知道为什么进行此更改(即添加 -ssplit.eolonly -tokenize.whitespace)会阻止其他一些功能正常工作。我注意到两个问题。 1) 诸如“我是”之类的东西不再被解释为“我是”,2) ner 识别变得有点偶然(例如,澳大利亚被识别为 LOCATION 但法国不是)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多