情况
- 我将句子输入到一个管道(ssplit, tokenise, pos, lemma, ner)中。
- 这些句子在原始形式中包含换行符、一行多个空格以及其他您在原始数据中期望的混乱内容。
- 检测到的命名实体现在包含characterOffsetBegin和characterOffsetEnd。
问题
问题是这些偏移量与我原始的句子不对应,而是与经过分词步骤后的某个中间句子相对应,其中一些空白已被删除(由Stanford CoreNLP)。
我尝试过的方法
- 我尝试以各种方式重构句子,例如
- 通过将所有标记重新连接在一起,并在它们之间插入前后字符。但我从未得到完全匹配,许多命名实体位置也不匹配。
问题
如何重构NE位置所指的完整句子?
我在Python中使用pycorenlp。
6条答案
按热度按时间tzcvj98z1#
你能提供一个例子吗?
我完全没有看到这种行为。当你在文本上运行管道时,它会返回提供的字符串中检测到的实体的字符偏移量。
rdlzhqv92#
好的,我对此进行了进一步的研究,似乎服务器在其他方面会删除前导换行符。我会尝试改进服务器对换行符的处理并回复您。
uubf1zoe3#
StanfordCoreNLP服务器的第316行:
text = URLDecoder.decode(text, encoding).trim();
这导致了前导换行符丢失。此外,请确保对您的请求进行编码,为了让它正常工作,我不得不发出这样的请求:
wget --post-data '%0AI love%0A%0A New York!' 'localhost:9000/?properties={"outputFormat":"json"}' -O -
目前,如果您的请求没有前导空格或换行符,它应该可以正常工作。我可能会将那一行更改以解决问题,但我不确定为什么最初会删除前导内容,所以我不确定更改它会破坏什么。
nc1teljy4#
谢谢,@J38 !
让我进一步详细说明一下问题。
背景
我想要得到两样东西:
问题
我对观察到的命名实体位置与实际NE位置不匹配的问题进行了进一步调查。
似乎有两个问题阻止我获得与NE位置对应的句子。
",...)在计算NE位置之前会被修剪。一个句子 "
Samsung is a company." 会被处理成 "Samsung" 从偏移量零开始 - 尽管句子开头有 "
"。
)分隔,那么tokens的"before"和"after"字符会存储"
",但characterOffsets将"
"视为长度为零。这使得很难重构与NE位置对应的句子。
我不是Maven。所以请随意指出显而易见的事情。我可能只是犯了一个小错误。
可能的处理方法及其后续问题
我考虑了很多处理方法。但它们都有自己的问题。
)分隔,我必须确保用一些空白替换它。
"字符会破坏NE位置。也就是说,如果出现在"after"或"before"字段中的"
",我需要将其替换为无内容。
lvmkulzt5#
示例1
示例2
c7rzv4ha6#
我不确定哪种行为是正确的。
我真正需要的是命名实体的位置和一个句子(理想情况下,是原始的句子),它们对应于这些命名实体的位置。只有这样,我才能在文本中高亮显示命名实体或将它们掩盖起来,以便在句子上执行一些监督关系提取。
理想情况下,我不需要自己动手,并尝试复制斯坦福核心NLP内部所做的工作。因为我可能会犯错误,无法完美地复制它。
理想情况下,有一个额外的字段,输出NER实际上考虑的“转换后的”句子。或者NER会输出指向原始句子的NE位置,就像它被提供的那样。