【问题标题】:Spacy: Detect if entity is quotedSpacy:检测是否引用了实体
【发布时间】:2021-12-30 09:21:39
【问题描述】:

我需要检测给定实体是否被引号包围,单引号或双引号。我该怎么办。

我的第一个想法是为 span 添加自定义扩展:

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)

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

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

【问题讨论】:

    标签: spacy spacy-3


    【解决方案1】:

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

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

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

    【讨论】:

    • 目前我不关心更复杂的情况,只关心在它之前和之后有引号的跨度。我也在玩DependencyMatcher,但两者都给了我相同的结果,所以不确定在效率方面什么是最好的。感谢您指出边缘情况,直到现在我才考虑到这一点。
    • 不要使用 DependencyMatcher。我想它会起作用,但这在概念上不是依赖关系(标点符号的依赖总是有点随意)。
    • 好的,从示例中我认为这不是它应该使用的,我会坚持使用自定义扩展
    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 2011-12-19
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多