spaCy NLP自定义规则匹配

2024-06-16 13:20:44 发布

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

我是NLP的乞丐。我正在为我的NLP项目使用spaCy python库。这是我的要求

我有一个包含所有国家名称的JSON文件。现在我需要解析并得到文件中每个国家的金牌数。鉴于 在例句下面

"Czech Republic won 5 gold medals at olympics. Slovakia won 0 medals olympics"

我能查到国家的名字,但不是奖牌数。下面是我的代码。请帮助继续。在

^{pr2}$

另外,如果给定的文本是

"Czech Republic won 5 gold medals at olympics in 1995. Slovakia won 0 medals olympics"

Tags: 文件项目名称nlpspacy国家atwon
1条回答
网友
1楼 · 发布于 2024-06-16 13:20:44

Spacy提供了您可以使用的Rule-based matching。在

它们可以如下使用:

import spacy
from spacy.pipeline import EntityRuler
nlp = spacy.load('en_core_web_sm', disable=["ner", "parser"])

countries = ['Czech Republic', 'Slovakia']
ruler = EntityRuler(nlp)
for a in countries:
    ruler.add_patterns([{"label": "country", "pattern": a}])
nlp.add_pipe(ruler)


doc = nlp("Czech Republic won 5 gold medals at olympics. Slovakia won 0 medals olympics")

with doc.retokenize() as retokenizer:
    for ent in doc.ents:
        retokenizer.merge(doc[ent.start:ent.end])


from spacy.matcher import Matcher
matcher = Matcher(nlp.vocab)
pattern =[{'ENT_TYPE': 'country'}, {'lower': 'won'},{"IS_DIGIT": True}]
matcher.add('medal', None, pattern)
matches = matcher(doc)


for match_id, start, end in matches:
    span = doc[start:end]
    print(span)

输出:

Czech Republic won 5
Slovakia won 0

上面的代码应该可以让你开始。当然,您必须编写自己更复杂的规则,以便处理以下情况: “捷克共和国在1995年奥运会上获得了5枚金牌,这一点也不奇怪。” 以及其他更复杂的句子结构。在

相关问题 更多 >