我有一个包含多个 html 文件的文件夹。我希望代码遍历每个文件并使用 nlp 选择主语动词宾语三元组。然后我希望 Pandas 将所有文件都列在一个数据框中的所有文件的主语动词宾语标题下。我面临的问题是熊猫只列出了最后一个文件中的主语动词宾语,而不是前两个。当我在循环中打印 sub_verb_obj 时,它会在一个列表中显示 3 个列表。但是 pandas 不会选择 3 个列表三元组。有人能告诉我我做错了什么吗?
sub_verb_obj=[]
folder_path = 'C:/Users/user3/.ipynb_checkpoints/xyz/xyz_2018'
for filename in glob.glob(os.path.join(folder_path, '*.html')):
with open(filename, 'r',encoding='utf-8') as f:
pat = f.read()
doc=nlp(text)
text_ext = textacy.extract.subject_verb_object_triples(doc)
sub_verb_obj=list(text_ext)
sao=pd.DataFrame(sub_verb_obj)
sao.columns=['subject','verb','object']
sao=sao.set_index('subject')
print(sao)```
how can I make sure the pandas lists all the subject verb object from all the files in a folder in a single dataframe?
答案 0 :(得分:1)
因为您的数据在每次迭代中看起来都是一个元组列表,并且仅适用于一次运行,所以我建议在每个循环中构建一个数据框,将其存储在一个列表中,然后连接数据框列表
df_hold_list=[]
folder_path = 'C:/Users/user3/.ipynb_checkpoints/xyz/xyz_2018'
for filename in glob.glob(os.path.join(folder_path, '*.html')):
with open(filename, 'r',encoding='utf-8') as f:
pat = f.read()
soup = BeautifulSoup(pat, 'html.parser')
claim_section = soup.find_all('section', attrs={"itemprop":"claims"})
str_sect = claim_section[0]
claim_text=str_sect.get_text()
#print(str(type(claim_section)))
clean_lower=claim_text.lower()
text=clean_lower
doc=nlp(text)
text_ext = textacy.extract.subject_verb_object_triples(doc)
sub_verb_obj=list(text_ext)
df_hold_list.append(pd.DataFrame(sub_verb_obj)) # add each new dataframe here
sao=pd.concat(df_hold_list, axis=0) # this should concat all dfs on top of one another using axis=0
sao.columns=['subject','verb','object'] # change your columns on teh final df
sao=sao.set_index('subject')
print(sao)