我有一个简单的数据框,由几列中的一些元数据组成,然后是一个包含句子的列。我想使用 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 循环运行得非常好。)
您使用
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)