Spacy:检测实体是否被引用

Spacy: Detect if entity is quoted

我需要检测给定的实体是否被引号包围,无论是单引号还是双引号。我该怎么做。

我的第一个想法是向跨度添加自定义扩展:

def is_quoted(span):
   prev_token = span.doc[span.start - 1]
   next_token = span.doc[span.end + 1]

   return prev_token in ["\"", "'"] and next_token in ["\"", "'"]

Span.set_extension("is_quoted", getter=is_quoted)

但这真的是最有效的方法吗?我只想对实体执行此操作。

或者我最好只编写一个自定义匹配器,使用特定的正则表达式?但这将 运行 我的整个文档。

如果您只关心前后的引号,您的自定义扩展看起来不错。您只需要正确处理跨度位于文档开头或结尾的情况,而您现在没有这样做 - 如果跨度位于开头,您将检查 doc[-1],最后一个标记,例如。

您是否关心 John said, "I never though I'd meet Peter Smith!" 之类的事情,其中​​“Peter Smith”是一个实体?如果是这样,我会想出一个嵌套引号的策略(如果很少见,可能只是忽略它们)并创建一个扩展来遍历每个句子并将每个标记标记为在引号中,或者不在引号中(引号本身定义你想要的)。

如果您关心复杂的情况,我不会为此使用 Matcher - 它不能很好地处理嵌套,而且我认为使用它的任何解决方案都会比基本状态跟踪更复杂。 (如果你只关心前后左右应该没问题。)