我正在使用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
答案 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