如何使用 spacy 提取特定的引理或 pos/tag?

How to extract specific lemma or pos/tag using spacy?

我正在使用 spacy 对句子列表进行词形还原和解析。数据包含在 excel 文件中。

我想写一个函数,让我 return 我的句子的不同引理。

例如 return 仅使用特定标签的词条 ("VERB" OR "VERB" +"ADJ")

这是我的代码:

import spacy
from spacy.lang.fr import French
from spacy_lefff import LefffLemmatizer, POSTagger
nlp = spacy.load("fr_core_news_sm")
nlp=spacy.load('fr')
parser = French()


path = 'Gold.xlsx'
my_sheet ="Gold"
df = read_excel(path, sheet_name= my_sheet)

def tokenizeTexte(sample):
    tokens = parser(sample)
    lemmas = []
    for tok in tokens:
        lemmas.append((tok.lemma_.lower(), tok.tag_, tok.pos_))
    tokens = lemmas
    tokens = [tok for tok in tokens if tok not in stopwords]
    return tokens



df['Preprocess_verbatim'] = df.apply(lambda row:tokenizeTexte(row['verbatim']), axis=1) 

print(df)
df.to_excel('output.xlsx')

我希望能够 return all lemma with example "verb" or "adj" or "adv" tag 然后修改为 return all引理。

我也希望 return 不同的引理组合 ( "PRON" +" "VERB"+"ADJ")

我怎样才能用 spacy 做到这一点?

这是我用我的代码得到的

       id                        ...                                                        Preprocess_verbatim
0     463                        ...                          [(ce, , ), (concept, , ), (résoudre, , ), (que...
1    2647                        ...                          [(alors, , ), (ça, , ), (vouloir, , ), (dire, ...
2    5391                        ...                          [(ça, , ), (ne, , ), (changer, , ), (rien, , )...
3    1120                        ...                          [(sur, , ), (le, , ), (station, , ), (de, , ),

tok.tag和tok.pos没有出现,你知道为什么吗?

我的档案:

我的数据示例:

id verbatim

14   L'économe originellement est donc celui qui a la responsabilité, pour des      personnes d'une maison, d'une unité d'organisation donnée .  
25   De leur donner des rations de ressources au temps opportun. 
56   Contrairement à l'idée qu'on se fait l'économe n'est pas axé sur le capital, c'est-à-dire sur l'action de capitaliser, mais sur les individus d'une unité organisation, c'est-à-dire sur l'action de partager, de redistribuer d'une façon juste et opportune des ressources aux différents membre

首先,我认为您的模型无法正常工作,因为您定义了 nlp 对象两次。我相信你只需要一次。我也不确定 parser 在做什么,我不确定你是否需要它。对于此代码,我将使用如下内容:

nlp = spacy.load("fr_core_news_sm")
doc = nlp(sample)
tokens = [tok for tok in doc]

那么,doc是一个spacy Doc对象,tokens是spaCy Token对象的列表。从这里开始,遍历您的标记的循环将起作用。

如果你想在现有的预处理函数中进行 POS 选择,我认为你只需要在循环中更改一行:

for tok in tokens:
    if tok.pos_ in ("VERB", "ADJ", "ADV"):
       lemmas.append((tok.lemma_.lower(), tok.tag_, tok.pos_))

这只会将具有这些特定词性的标记添加到您的 lemmas 列表中。

我还注意到您的代码中的另一个问题,在此行的下方:

tokens = [tok for tok in tokens if tok not in stopwords]

此时 tok 是你的 (lemma, tag, pos) 的元组,所以除非你的 stopwords 列表是相同格式的元组,而不仅仅是你想要排除的引理或标记,这一步不会排除任何东西。

将它们放在一起,你会得到类似这样的东西,如果 POS 正确,这将是 return (lemma, tag, pos) 的元组列表:

nlp = spacy.load("fr_core_news_sm")

stopwords = ["here", "are", "some", "stopwords"]

def tokenizeTexte(sample):
    doc = nlp(sample)
    lemmas = []
    for tok in tokens:
        if tok.pos_ in ("VERB", "ADJ", "ADV"):
            lemmas.append((tok.lemma_.lower(), tok.tag_, tok.pos_))
    tokens = [(lemma, tag, pos) for (lemma, tag, pos) in lemmas if lemma not in stopwords]
    return tokens