我获取了您的示例输入并将“\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 会将您的产品代码视为完整的标记,如果您想做分析用户请求的依赖结构之类的操作,则可以进行正常的句子拆分。