首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于空间规则的匹配问题

基于空间规则的匹配问题
EN

Stack Overflow用户
提问于 2021-07-01 10:37:26
回答 1查看 188关注 0票数 2

我正试图从文本数据中提取一个短语。我目前正在使用基于SpaCy规则的匹配。在我看到"Hiv-1 dna定量“之前,这句话没有被发现。下面的代码显示了我使用的模式。

代码语言:javascript
复制
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)

我也尝试过以下模式

代码语言:javascript
复制
pattern = [{"LOWER": "hiv"}, {"IS_PUNCT": True}, {"LOWER":"1"}, {"LOWER": "dna"}, {"LOWER":"quant"}]

但它没有检测到。

还有别的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-01 10:49:07

当您有这样的问题时,首先要确保您了解Spacy如何标记您的字符串。看:

代码语言:javascript
复制
>>> [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}$正则表达式。

您可以使用

代码语言:javascript
复制
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[\W_]\d{1,2}$正则表达式

  • ^ -字符串的开始(在这里,令牌)
  • hiv - hiv文本
  • [\W_] -任何非字母数字字符
  • \d{1,2} -一位或两位数
  • $ -字符串的末尾(在这里,令牌)。

regex演示

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68208653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档