Python 如何使用spacy提取特定引理或pos/标记?

Python 如何使用spacy提取特定引理或pos/标记?,python,pandas,lambda,token,spacy,Python,Pandas,Lambda,Token,Spacy,我正在使用spacy对一系列句子进行语法化和解析。数据包含在excel文件中 我想写一个函数,它允许我返回句子的不同引理 例如,只返回带有特定标记的引理(“动词”或“动词”+“形容词”) 这是我的代码: import spacy from spacy.lang.fr import French from spacy_lefff import LefffLemmatizer, POSTagger nlp = spacy.load("fr_core_news_sm") nlp=spacy.load(

我正在使用spacy对一系列句子进行语法化和解析。数据包含在excel文件中

我想写一个函数,它允许我返回句子的不同引理

例如,只返回带有特定标记的引理(“动词”或“动词”+“形容词”)

这是我的代码:

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')

我希望能够返回所有引理,例如“动词”或“adj”或“adv”标记,然后修改以返回所有引理

我还希望返回引理的不同组合(“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
对象。我相信您只需要一次。我也不确定
解析器
在做什么,也不确定您是否需要它。对于此代码,我将使用如下内容:

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_))
这只会将带有这些特定词性的标记添加到
引理列表中

我还注意到您代码中的另一个问题:

tokens = [tok for tok in tokens if tok not in stopwords]
此时,
tok
(引理、标记、位置)
的元组,因此除非你的
停止词列表是相同格式的元组,并且不仅仅是你想要排除的引理或标记,否则这一步不会排除任何东西

把它们放在一起,你会得到这样的结果,如果pos是正确的,它会返回一个元组列表,元组是
(引理、标记、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

如果你有一个。这样,有人可以将你的代码复制粘贴到他们的编辑器中。@JeffTilton我添加了一个我的数据示例。我的停止字列表不是以元组的形式出现的,而是txt文件中每行一个字,正如预期的那样,它们不是排除项,你知道如何应对吗?此外,spacy没有得到正确的po一些法语单词的s或引理,是否可以更正?您可以使用更大的模型,如
fr\u core\u news\u md
,以获得更好的词性标注性能。但是,您应该知道,您永远不会有完美的准确性。如果
stopwords
是一个列表,我给出的最后一个代码示例将排除stopwords中的任何单词。谢谢,我尝试了你的建议,但因为stopword不起作用,我确信是因为我的列表如下:[b'Yanagida',b'Yandell',b'Yanosik',b'Yarbrough',b'Yarnell',b'Yazdani',b'Yearwood']我从一个txt.file中获取了它,所以要加载它,我这样做:path='/home/k/Documents/XP/resources/MotsVides.txt'file=open(path,mode='rb')stopwords=file.read()stopwords=[x.strip()for x in stopwords]print(stopwords)在我的stoplist文件中,每个单词对应一行。我试图将其转换为列表,但当我使用它时,脚本不会删除单词try using open(path,mode='r'))-我不确定它是否将它们作为二进制字符串读取是一个问题。太好了,请尽可能接受我的答案,@EMMAKENJI