gpt4 book ai didi

python-3.x - Spacy - 标记带引号的字符串

转载 作者:行者123 更新时间:2023-12-02 18:47:44 28 4
gpt4 key购买 nike

我正在使用 spacy 2.0 并使用带引号的字符串作为输入。

示例字符串

"The quoted text 'AA XX' should be tokenized"

并期望提取

[The, quoted, text, 'AA XX', should, be, tokenized]

然而,我在实验时得到了一些奇怪的结果。名词 chunks 和 ents 失去了其中一个引语。

import spacy
nlp = spacy.load('en')
s = "The quoted text 'AA XX' should be tokenized"
doc = nlp(s)
print([t for t in doc])
print([t for t in doc.noun_chunks])
print([t for t in doc.ents])

结果

[The, quoted, text, ', AA, XX, ', should, be, tokenized]
[The quoted text 'AA XX]
[AA XX']

满足我的需求的最佳方式是什么

最佳答案

虽然您可以修改分词器并添加自己的自定义前缀、后缀和排除引号的中缀规则,但我不确定这是否是最佳解决方案。

对于您的用例,添加 component 可能更有意义在调用标记器、解析器和实体识别器之前,将(某些)带引号的字符串合并到一个标记中的管道。要实现此目的,您可以使用 rule-based Matcher并找到由 ' 包围的标记组合。以下模式查找一个或多个字母数字字符:

pattern = [{'ORTH': "'"}, {'IS_ALPHA': True, 'OP': '+'}, {'ORTH': "'"}]

Here's a visual example交互式匹配器演示中的模式。要进行合并,您可以设置 Matcher、添加模式并编写一个函数,该函数采用 Doc 对象、提取匹配的范围并将它们合并为一个标记通过调用他们的 .merge 方法。

import spacy
from spacy.matcher import Matcher

nlp = spacy.load('en')
matcher = Matcher(nlp.vocab)
matcher.add('QUOTED', None, [{'ORTH': "'"}, {'IS_ALPHA': True, 'OP': '+'}, {'ORTH': "'"}])

def quote_merger(doc):
# this will be called on the Doc object in the pipeline
matched_spans = []
matches = matcher(doc)
for match_id, start, end in matches:
span = doc[start:end]
matched_spans.append(span)
for span in matched_spans: # merge into one token after collecting all matches
span.merge()
return doc

nlp.add_pipe(quote_merger, first=True) # add it right after the tokenizer
doc = nlp("The quoted text 'AA XX' should be tokenized")
print([token.text for token in doc])
# ['The', 'quoted', 'text', "'AA XX'", 'should', 'be', 'tokenized']

为了获得更优雅的解决方案,您还可以将组件重构为可重用类,在其 __init__ 方法中设置匹配器(例如 see the docs)。

如果您首先在管道中添加组件,则所有其他组件(例如标记器、解析器和实体识别器)将只能看到重新标记化的Doc。这也是为什么您可能想要编写更具体的模式,仅合并您关心的某些带引号的字符串。在您的示例中,新的标记边界改善了预测 - 但我也可以想到许多其他情况,但它们没有改善,特别是当引用的字符串更长并且包含句子的重要部分时。

关于python-3.x - Spacy - 标记带引号的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50752266/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com