我正试图从文本数据中提取一个短语。我目前正在使用基于SpaCy规则的匹配。在我看到"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"}]但它没有检测到。
还有别的办法吗?
发布于 2021-07-01 10:49:07
当您有这样的问题时,首先要确保您了解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[\W_]\d{1,2}$正则表达式
^ -字符串的开始(在这里,令牌)hiv - hiv文本[\W_] -任何非字母数字字符\d{1,2} -一位或两位数$ -字符串的末尾(在这里,令牌)。见regex演示。
https://stackoverflow.com/questions/68208653
复制相似问题