【问题标题】:When adding SpaCy output to existing dataframe, columns do not align将 SpaCy 输出添加到现有数据框时,列不对齐
【发布时间】:2021-03-24 20:21:30
【问题描述】:

我有一个包含一列文章标题的 csv,我使用 SpaCy 从中提取出现在标题中的任何人的姓名。当尝试使用 SpaCy 提取的名称向 csv 添加新列时,它们与提取它们的行不对齐。

我相信这是因为 SpaCy 结果有自己的索引,独立于原始数据的索引。

我尝试将 , index=df.index) 添加到新列行,但我得到“ValueError:传递值的长度为 2,索引意味着 10。”

如何将 SpaCy 输出与它们的来源行对齐?

这是我的代码:

import pandas as pd
from pandas import DataFrame
df = (pd.read_csv(r"C:\Users\Admin\Downloads\itsnicethat (5).csv", nrows=10,
                  usecols=['article_title']))
article = [_ for _ in df['article_title']]

import spacy
nlp = spacy.load('en_core_web_lg')
doc = nlp(str(article))
ents = list(doc.ents)
people = []
for ent in ents:
    if ent.label_ == "PERSON":
        people.append(ent)

import numpy as np
df['artist_names'] = pd.Series(people)
print(df.head())

这是生成的数据框:

                                       article_title       artist_names
0  “They’re like, is that? Oh it’s!” – ...               (Hannah, Ward)
1  Billed as London’s biggest public festival of ...  (Dylan, Mulvaney)
2  Transport yourself back to the dusky skies and...                NaN
3  Turning to art at the beginning of quarantine ...                NaN
4  Dylan Mulvaney, head of design at Gretel, expl...                NaN

这是我所期待的:

                                       article_title       artist_names
0  “They’re like, is that? Oh it’s!” – ...               (Hannah, Ward)
1  Billed as London’s biggest public festival of ...                NaN
2  Transport yourself back to the dusky skies and...                NaN
3  Turning to art at the beginning of quarantine ...                NaN
4  Dylan Mulvaney, head of design at Gretel, expl...   (Dylan, Mulvaney)

您可以看到artist_names 列中的第5 个值与第5 个文章标题相关。我怎样才能让它们对齐?

感谢您的帮助。

【问题讨论】:

    标签: python pandas spacy


    【解决方案1】:

    我会遍历文章,分别从每篇文章中检测实体,并将检测到的实体放在一个列表中,每篇文章一个元素:

    nlp = spacy.load('en_core_web_lg')
    article = [_ for _ in df['article_title']]
    
    entities_by_article = []
    for doc in nlp.pipe(article):
      people = []
      for ent in doc.ents:
        if ent.label_ == "PERSON":
          people.append(ent)
      entities_by_article.append(people)
    
    df['artist_names'] = pd.Series(entities_by_article)
    

    注意:for doc in nlp.pipe(article) 是 spaCy 循环文本列表的更有效方式,可以替换为:

    for a in article:
      doc = nlp(a)
      ## rest of code within loop
    

    【讨论】:

    • 成功了 - 非常感谢!
    【解决方案2】:
        if ent.label_ == "PERSON":
            people.append(ent)
        else:
            people.append(np.nan) # if ent.label_ is not a PERSON
    

    包含一个 else 语句,因此如果 label_ 不是 PERSON,它将被视为 NaN。

    【讨论】:

    • 我一开始确实尝试过,但它只是为数据框上方没有列出的所有实例返回 NaN,而不是按正确的顺序。
    猜你喜欢
    • 2022-12-19
    • 1970-01-01
    • 2019-03-06
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多