【发布时间】:2019-09-25 20:16:10
【问题描述】:
今天好,
我正在尝试对被标记为单独标记的连字符进行后处理,而这些单词应该是单个标记。例如:
Example:
Sentence: "up-scaled"
Tokens: ['up', '-', 'scaled']
Expected: ['up-scaled']
目前,我的解决方案是使用匹配器:
matcher = Matcher(nlp.vocab)
pattern = [{'IS_ALPHA': True, 'IS_SPACE': False},
{'ORTH': '-'},
{'IS_ALPHA': True, 'IS_SPACE': False}]
matcher.add('HYPHENATED', None, pattern)
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()
#print(doc)
return doc
nlp.add_pipe(quote_merger, first=True) # add it right after the tokenizer
doc = nlp(text)
但是,这将导致以下预期问题:
Example 2:
Sentence: "I know I will be back - I had a very pleasant time"
Tokens: ['i', 'know', 'I', 'will', 'be', 'back - I', 'had', 'a', 'very', 'pleasant', 'time']
Expected: ['i', 'know', 'I', 'will', 'be', 'back', '-', 'I', 'had', 'a', 'very', 'pleasant', 'time']
有没有一种方法可以只处理由连字符分隔且字符之间没有空格的单词?因此,像“up-scaled”这样的词将被匹配并组合成一个标记,而不是“.. back - I ..”
非常感谢
编辑: 我已经尝试过发布的解决方案:Why does spaCy not preserve intra-word-hyphens during tokenization like Stanford CoreNLP does?
但是,我没有使用此解决方案,因为它导致带有撇号 (') 的单词和带有小数的数字的错误标记化:
Sentence: "It's"
Tokens: ["I", "t's"]
Expected: ["It", "'s"]
Sentence: "1.50"
Tokens: ["1", ".", "50"]
Expected: ["1.50"]
这就是我使用 Matcher 而不是尝试编辑正则表达式的原因。
【问题讨论】:
-
我在问题中添加了额外的细节,希望它能为问题提供更多信息并进一步区分问题。是否可以删除重复的标签?
-
你试过code from the docs吗?
-
我也使用了链接中的示例,以及:自定义 spaCy 的 Tokenizer 类中的示例,我无法生成可以处理上述所有情况的正则表达式..
-
谢谢,这有帮助!但我意识到我必须再次处理所有带有撇号的收缩。我编译了一个收缩列表并手动将它们插入到规则集中。