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

时间:2017-01-20 16:34:09

标签: nlp stanford-nlp

我正在尝试让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可用吗?

有没有人有任何想法或建议?

1 个答案:

答案 0 :(得分: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]

这就是说只是在空白上进行标记,所以它在这些时期停止了破坏。它还说仅在换行符上拆分句子,因此在输入文件中将整个用户请求放在一行上很重要。您不会获得句子,但您可以获得令牌流并识别您的产品代码。

现在,如果您真的想要斯坦福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会将您的产品代码视为完整标记,如果您想要执行类似分析用户请求的依赖关系结构的操作,则可以进行正常的句子拆分。