【问题标题】:How to extract specific lemma or pos/tag using spacy?如何使用 spacy 提取特定的引理或 pos/tag?
【发布时间】:2019-11-28 17:07:29
【问题描述】:

我正在使用 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')

我希望能够返回所有带有例如“verb”或“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

【问题讨论】:

  • 如果您有minimal reproducible example,会更容易提供帮助。这样,别人就可以将您的代码复制并粘贴到他们的编辑器中。
  • @JeffTilton 我添加了我的数据示例

标签: python pandas lambda token spacy


【解决方案1】:

首先,我认为您的模型无法正常工作,因为您定义了 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 正确,它将返回一个 (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

【讨论】:

  • 我的停用词列表不是元组的形式,而是 txt 文件中每行一个单词,正如预期的那样,它们并不排除,任何想法如何应对,此外,spacy 没有得到法语中某些单词的正确pos或lemma,是否可以纠正它?
  • 您可以使用更大的模型,例如fr_core_news_md,以获得更好的词性标注性能。但是,您应该知道,您永远不会有完美的准确性。如果stopwords 是一个列表,我给出的最后一个代码示例将排除停用词中的任何单词。
  • 谢谢你,我试过你的提议,但停用词不起作用,我确定是因为我的列表看起来像这样:[ b'Yanagida',b'Yandell',b'Yanosik', b'Yarbrough', b'Yarnell', b'Yazdani', b'Yearwood'] 我从 txt.file 中获取它所以要加载它我这样做: path = '/home/k/Documents/XP/ressources/ MotsVides.txt' file = open(path, mode='rb') stopwords = file.read() stopwords = [x.strip() for x in stopwords] print(stopwords) 在我的 stopwords 文件中,每个单词对应一行.我试图将其转换为列表,但是当我使用它时,脚本不会删除单词
  • 尝试使用 open(path, mode='r') - 我不确定是否将它们作为二进制字符串读取是否存在问题。
  • 太好了,请尽可能接受我的回答,@EMMAKENJI
猜你喜欢
  • 1970-01-01
  • 2019-08-26
  • 2020-02-01
  • 1970-01-01
  • 2021-01-27
  • 2016-03-10
  • 2022-08-19
  • 1970-01-01
  • 2017-11-23
相关资源
最近更新 更多