Spacy 的法语反身代词短语匹配器

Spacy's phrasematcher with reflexive pronoun in french

首先,您不必懂法语来帮助我,因为我将在 python 中解释我需要在 spacy 中应用的语法规则。我有一个文件 (test.txt),其中包含多个法语短语(大约 5000 个),每个短语都不同,还有一封邮件 (textstr) 每次都不同(我们的客户发送给我们的邮件)。对于每封邮件,我都必须查看文件中的某个短语是否在邮件中。我想过使用 spacy 的 phrasmatcher,但我有一个问题:在每封邮件中,句子都是共轭的,所以我不能使用 phrasmatcher 的默认 属性 (因为它使用逐字标记文本并且没有考虑动词的变位)。所以我首先想到使用 spacy 的短语匹配和引理来解决我的问题,因为所有共轭动词都有相同的引理:

def treatemail(emailcontent):
        nlp = spacy.load("fr_core_news_sm")
        with open('test.txt','r',encoding="utf-8") as f:
            phrases_list= f.readlines()
        phrase_matcher = PhraseMatcher(nlp.vocab,attr="LEMMA")
        patterns = [nlp(phrase.strip()) for phrase in phrases_list]
        phrase_matcher.add('phrases', None, *patterns)
        mail = nlp (emailcontent)
        matched_phrases = phrase_matcher(mail)
        for match_id, start, end in matched_phrases:
            span = sentence[start:end]
            print(span.text)

这对文件中 85% 的短语没问题,但对于剩余的 15% 它不起作用,因为法语中的一些动词有反身代词(代词出现在动词之前):me, te , se, nous, vous, se + 动词和等价的 m',t' 和 s' + 动词,如果动词以 voyelle 开头。 (他们基本上总是同意他们所指的主题。)

在文本文件中,短语以不定式形式书写,因此如果短语中有反身代词,则以不定式形式书写(se + 动词或 s' + 以 voyelle 开头的动词,例如:“S'amuser”(玩得开心),“se promener”(散步)。在邮件中,动词与其反省代词共轭(Je me promene(我散步))。

我要做的基本上是让短语匹配器考虑反身代词。所以这是我的问题:我该怎么做?我应该制作一个自定义组件来检查电子邮件中是否有反身代词并将文本更改为其不定式形式还是有其他方法?

非常感谢!

您可以为此使用依赖关系。

将一些反身动词句子示例粘贴到displaCy demo中,您可以看到这些动词的反身代词始终具有expl:comp关系。找到这些动词的一种非常简单的方法是遍历标记并检查该关系。 (我不是 100% 确定这是它的唯一使用方式,所以你应该检查一下,但看起来很有可能。)

我不懂法语,所以我不确定这些动词是否有严格的顺序,或者代词和动词之间是否可以出现单词。如果是后者(看起来很有可能),则不能使用普通的 Matcher 或 PhraseMatcher,因为它们依赖于连续的单词序列。但是您可以使用 DependencyMatcher。像这样:

from spacy.matcher import DependencyMatcher

VERBS = [ ... verbs in your file ... ]

pattern = [
  # anchor token: verb
  {
    "RIGHT_ID": "verb",
    "RIGHT_ATTRS": {"LEMMA": {"IN": VERBS}}
  },
  # has a reflexive pronoun
  {
    "LEFT_ID": "verb",
    "REL_OP": ">",
    "RIGHT_ID": "reflexive-pronoun",
    "RIGHT_ATTRS": {"DEP": "expl:comp"}
  }
]

matcher = DependencyMatcher(nlp.vocab)
matcher.add("REFLEXIVE", [pattern])
matches = matcher(doc)

这假定您只关心动词词元。如果您关心 verb/pronoun 组合,您可以制定一堆 depmatcher 规则或其他东西。