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

时间:2019-11-28 17:07:29

标签: python pandas lambda token spacy

我正在使用spacy来定格和分析句子列表。数据包含在一个excel文件中。

我想编写一个函数,使我可以返回句子的不同引理。

例如,仅返回带有特定标记(“ VERB”或“ 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')

我希望能够使用“动词”或“ 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

1 个答案:

答案 0 :(得分:0)

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

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

然后,doc是一个随机Doc对象,tokens是一个空间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正确,它将返回(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