我可以在Stanford CoreNLP命名实体中使用标点符号吗?

我可以在Stanford CoreNLP命名实体中使用标点符号吗?,nlp,stanford-nlp,Nlp,Stanford Nlp,我想让斯坦福核心NLP识别一个识别码。问题是代码中有标点符号。e、 g.01.A01.01,将输入分为三个句子 此代码的匹配表达式将是[0-9][0-9][.][a-z,a-z][0-9][0-9][.][0-9][0-9]。我已经尝试将它添加到我的regexner.txt文件中,但它没有识别它(可能是因为标记跨越了不同的句子?) 我还尝试使用类似于下面的TokenRegex来匹配它(也没有任何成功) /告诉我//关于/(?$refCode/[0-9][0-9]/.//[a-z,a-z][0-9

我想让斯坦福核心NLP识别一个识别码。问题是代码中有标点符号。e、 g.
01.A01.01
,将输入分为三个句子

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

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

/告诉我//关于/(?$refCode/[0-9][0-9]/.//[a-z,a-z][0-9][0-9]/.//[0-9][0-9]/)

一些例子使用

用户保留了资源02.G36.63

21.J83.02可用吗


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

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

The user has resource 02.G36.63 reserved.  Is 21.J83.02 available?
我创建了这个规则文件(sample rules.txt):

我运行了这个命令:

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]
这意味着只在空格上标记,因此它停止在句点上中断。此外,它还表示在newline上只拆分句子,因此在输入文件中,将整个用户请求放在一行是很重要的。你不会得到句子,但你可以得到一个令牌流并识别你的产品代码

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

该文件位于回购协议中:

您必须在Google上四处搜索,以找到有关将PTBLexer.flex文件编译为PTBLexer.java的说明。此网站应包含您需要的信息:


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

您能否呈现一些典型的输入文本。有必要把它分成几个句子吗?嗨@StanfordNLPHelp。我在上面的问题中添加了一些示例用法。理想情况下,我希望将它们解析为单个句子,句点(.)不作为句子的结尾。如果我能将代码视为单个标记并标识为命名实体,那就更好了。但是我不知道怎么做。谢谢。这种方法对我来说很有效,因为我正在处理的文本是简单的一行代码。无论如何,它们都不应该超过一个句子。您知道为什么进行此更改(即添加-ssplit.eolonly-tokenize.whitespace)会停止其他一些功能的工作吗。我注意到两个问题。1) 像“我是”这样的东西不再被解释为“我是”,2)ner身份识别变得有点偶然(例如,澳大利亚被识别为一个地点,但法国不是)?
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]