python pandas:从一个细胞生成(三个)细胞

问题描述 投票:0回答:1

我有一个简单的数据框,由几列中的一些元数据组成,然后是一个包含句子的列。我想使用 textacy 的 SVO 提取器生成三个新列,各一列用于主语、动词和宾语。我正在尝试尽可能以熊猫的方式做到这一点:

metadata   sentence
1-0        Thank you so much, Chris.
1-1        And it's truly a great honor to be here. 
1-2        I have been blown away by this conference.
1-3        And I say that sincerely.

我尝试过这个:

def svo(text):
    svotriple = textacy.extract.triples.subject_verb_object_triples(nlp(text))
    for item in svotriple:
        df['subject'] = str(item[0][-1])
        df['verb']    = str(item[1][-1])
        df['object']  = str(item[2])

df.apply(svo(df['sentence'].values[0]))

我尝试用几种方法将句子作为字符串从句子列中取出。他们中的大多数人都回复了我实际上正在拍一个系列的事实。我希望这个能够逐行工作。我的冲动是使用

for
循环,但我真的想尝试以 pandas 的方式做到这一点。 (并不是说我的 for 循环运行得非常好。)

python pandas nlp spacy
1个回答
0
投票

您使用

apply
的方式不正确。您应该创建一个空的 DataFrame 来存储 SVO 三元组,您在每次迭代中直接更新现有 DataFrame 的列,这将覆盖以前的值。

试试这个方法

import pandas as pd
import textacy
import spacy

nlp = spacy.load('en_core_web_sm')

def svo(text):
    svotriples = textacy.extract.triples.subject_verb_object_triples(nlp(text))
    svo_list = []
    for item in svotriples:
        subject = str(item[0][-1])
        verb = str(item[1][-1])
        obj = str(item[2])
        svo_list.append([subject, verb, obj])
    return svo_list

data = {
    'sentence': [
        'Thank you so much, Chris.',
        "And it's truly a great honor to be here.",
        'I have been blown away by this conference.',
        'And I say that sincerely.'
    ]
}

df = pd.DataFrame(data)

df[['subject', 'verb', 'object']] = df['sentence'].apply(svo).apply(pd.Series)

print(df)
© www.soinside.com 2019 - 2024. All rights reserved.