Pandas 使用 Spacy 应用两个参数

Pandas apply two argument with Spacy

 df.head()
        lang    text
    0  eng      Johnnet went out on the field and felt under her feet..
    1  eng      John was shocked by this statement..
    2  de        Heute hat Marie köstlich gegessen und..

我有一个包含不同语言的数据框,这就是为什么我有一个包含两种语言的字典 spacy :

eng_nlp= spacy.load('en_core_web_lg')
de_nlp= spacy.load('de_core_news_lg')

spacy_lang = {
    'de': de_nlp,
    'eng': eng_nlp
}

我写了一个函数,它看起来只显示列中的人,具体取决于语言。

def label_lang(lang,text):
    model = spacy_lang[lang]
    doc = model(text)
    for ent in  doc.ents:
         if  (ent.label_ == 'PERSON'):
                 return ent.text

现在我想将其应用到列 df['text'],但出现错误

df.apply( lambda x: label_lang(spacy_lang[x],x['text']),axis = 1)

TypeError:无法散列的类型:'Series'

我不明白我应该使用什么作为参数函数(spacy_lang)

x 是一个系列,不是一个字符串,因此你不能使用 spacy_lang[x] 因为这里预期的字典键类型是一个字符串。在这种情况下,您需要在 lambda 中使用 spacy_lang[x['lang']] 而不是 spacy_lang[x]

此外,如果在lambda中获取模型,则无需在label_lang函数中重新尝试获取模型。看,你有 label_lang(spacy_lang[x]....model = spacy_lang[lang],其中后者已经在 lang 变量中包含 spacy 模型。

您可以使用

import spacy
import pandas as pd

eng_nlp= spacy.load('en_core_web_lg')
de_nlp= spacy.load('de_core_news_lg')
spacy_lang = {'de': de_nlp,'eng': eng_nlp}

def label_lang(model,text):
    doc = model(text)
    for ent in  doc.ents:
         if  (ent.label_ == 'PERSON'):
                 return ent.text

df = pd.DataFrame({'lang': ['eng','eng', 'de'], 'text':[
    'Johnnet went out on the field and felt under her feet..', 
    'John was shocked by this statement..',
    'Heute hat Marie köstlich gegessen und']})

print(df.apply( lambda x: label_lang(spacy_lang[x['lang']],x['text']),axis = 1))

输出:

0    None
1    John
2    None