基于空间规则的匹配问题

2024-04-28 13:44:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从文本数据中提取一个短语。我目前正在使用基于空间规则的匹配。在我看到“Hiv-1 dna定量”这句话之前,这句话还不错,但没有被检测出来。我使用的模式如下面的代码所示

matcher = Matcher(nlp.vocab)
pattern = [{'LOWER': 'hiv'}, {"IS_PUNCT": True}, {"TEXT": {"REGEX":"\d{1,2}"}},
         {'LOWER': 'dna'},
         {'LOWER': 'quant'}]
matcher.add("HelloWorld", [pattern])
data = "probe Hiv-1 dna amp probe Hiv-1 dna quant Hiv-2 dna dir probe Hiv-2 dna"
doc = nlp(data)
matches = matcher(doc)
for match_id, start, end in matches:
    string_id = nlp.vocab.strings[match_id]  # Get string representation
    span = doc[start:end]  # The matched span
    print(span.text)

我还尝试了以下模式

pattern = [{"LOWER": "hiv"}, {"IS_PUNCT": True}, {"LOWER":"1"}, {"LOWER": "dna"}, {"LOWER":"quant"}]

但是它没有检测到它

还有别的办法吗


1条回答
网友
1楼 · 发布于 2024-04-28 13:44:14

当您遇到此类问题时,首先确保您了解Spacy如何标记字符串。看:

>>> [t for t in doc]
[probe, Hiv-1, dna, amp, probe, Hiv-1, dna, quant, Hiv-2, dna, dir, probe, Hiv-2, dna]

因此,您的Hiv-1是单个令牌。现在,您需要添加另一个模式来解释{'LOWER': 'hiv'}, {"IS_PUNCT": True}, {"TEXT": {"REGEX":"\d{1,2}"}}可以是单个令牌这一事实。例如,它可以看起来像{'LOWER': {"REGEX":"^hiv[\W_]\d{1,2}$"}},其中小写标记文本必须匹配^hiv[\W_]\d{1,2}$正则表达式

你可以用

patterns = [
    [{'LOWER': 'hiv'}, {"IS_PUNCT": True}, {"TEXT": {"REGEX":"\d{1,2}"}}, {'LOWER': 'dna'}, {'LOWER': 'quant'}],
    [{'LOWER': {"REGEX":"^hiv[\W_]\d{1,2}$"}}, {'LOWER': 'dna'}, {'LOWER': 'quant'}]
]
matcher = Matcher(nlp.vocab)
matcher.add("HelloWorld", patterns)
doc = nlp(data)
print([doc[start:end].text for _, start,end in matcher(doc)])
# => ['Hiv-1 dna quant']

{}正则表达式表示

  • ^-字符串的开头(此处为标记)
  • hiv-hiv文本
  • [\W_]-任何非字母数字字符
  • \d{1,2}-一位或两位数字
  • $-字符串的结尾(这里是token)

regex demo

相关问题 更多 >