【问题标题】:Token-base matching with spaCy REGEX与 spaCy REGEX 的基于令牌的匹配
【发布时间】:2019-04-06 00:50:02
【问题描述】:

我是 spacy 的新手,我已经阅读了有关基于令牌的匹配的文档。我已经使用 REGEX 尝试了 spaCy 匹配器,但我没有任何结果。

当我使用 re 库进行匹配时,它仍然有效。

我是不是在代码中做错了什么。

我正在尝试匹配“accès'd”这个词

感谢您的帮助

# REGEX
import re
text = u"accès'd est ferme aujpourd'hui"
pattern_re = re.compile("^acc?é?e?è?s?s?'?D" , re.I)
pattern_re.match(text)

# <re.Match object; span=(0, 7), match="accès'd">

# REGEX SPACY VERSION 1
import spacy
from spacy.matcher import Matcher
nlp = spacy.load("fr_core_news_sm")

pattern = [{'TEXT': {'REGEX' : "^acc?é?e?è?s?s?'?D"}}]
matcher = Matcher(nlp.vocab)
matcher.add('AccèsD' , None , pattern)


doc = nlp(text)

matches = matcher(doc)
for match_id, start , end in matches:
    match_string = nlp.vocab.strings[match_id]
    span = doc[start:end]
    print(match_id, match_string, start , end , span.text)

# NOTHING

# REGEX SPACY VERSION 2
import spacy
from spacy.matcher import Matcher
nlp = spacy.load("fr_core_news_sm")

accesd_flag = lambda text : bool(re.compile(r"^acc?é?e?è?s?s?'?D" , re.I).match(text))
IS_ACCESD = nlp.vocab.add_flag(accesd_flag)
pattern=  [{IS_ACCESD : True}]

matcher = Matcher(nlp.vocab)
matcher.add('AccèsD' , None , pattern)

doc = nlp(text)

matches = matcher(doc)
for match_id, start , end in matches:
    match_string = nlp.vocab.strings[match_id]
    span = doc[start:end]
    print(match_id, match_string, start , end , span.text)


# NOTHING

【问题讨论】:

  • 你为什么不做一个on_match函数而不是None然后你可以用它来帮助你调试

标签: python regex nlp spacy


【解决方案1】:

2.1.0 版中引入了对 spacy 的正则表达式支持

来自the website

v2.1.0 之前的版本尚不支持 REGEX 运算符。

可能与此有关,因为 REGEX 否则将不会使用匹配器

否则,我认为答案与不匹配所有上下文标记有关。然后,您只需稍微修改正则表达式并使用 LOWER 匹配属性来捕获两个令牌上下文。

text = u"accès'd est ferme aujpourd'hui"
pattern = [{"LOWER" : { "REGEX": "^acc?é?e?è?s?s?" }, {"LOWER": "d"}]
matcher = Matcher(nlp.vocab)
matcher.add("accesd", None, pattern) 
doc = nlp(text) 
matches = matcher(doc)

这是因为您使用的是 re.I 标志,因此匹配器将通过仅查看 LOWER 属性以不区分大小写的方式工作

【讨论】:

  • 嗨内森,感谢您的回复。我检查了 spaCy 版本,它是最后一个
  • 哦,太糟糕了,还以为会是这样。
  • 我想我找到了问题的根源。它是将文本拆分为 ['accès', 'd', 'est', 'ferme', "aujpourd'", 'hui'] 的 spacy tokenizer,这就是正则表达式不匹配的原因
  • 哦,我明白了,没错。我会添加一个我相信会起作用的答案
猜你喜欢
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多