Здесь я предложил простое решение.Это простое решение состоит из трех частей:
- Когда есть пустая строка
- Когда строка заканчивается на
:
- В противном случае
Вот код:
import re
from collections import defaultdict
def clean_speaker(sp):
sp = re.sub(r"(\(\w+\))", "", sp) #remove single words within parentheses
sp = re.sub(r"(\d+\.?)", "", sp) #remove digits such as 1. or 2.
return sp.strip()
document = []
with open('the document','r') as fin:
foundSpeaker = False
dialogue = defaultdict(str)
for line in fin.readlines():
line = line.strip() #remove white-spaces
#----- when line is empty -----
if not line:
dialogue = defaultdict(str)
foundSpeaker = False
#----- When line ends with : -----
elif line[-1] == ":":
if dialogue:
document.append(dialogue)
dialogue = defaultdict(str)
foundSpeaker = True
dialogue["Speaker"] = clean_speaker(line[:-1])
#----- Otherwise -----
else:
if foundSpeaker:
dialogue["Sentence"] += " " + line
else:
if dialogue:
document.append(dialogue)
dialogue = defaultdict(str)
foundSpeaker = False
continue
Теперь переменная document
содержит все диалоги в данном файле ... это список словарей, где каждый словарь имеет только два ключа (speaker
,и sentence
).Итак, мы можем посмотреть, что внутри document
, вот так:
for d in document:
for key, value in d.items():
print(key+":", value)
Или вы можете сделать что-то более умное, превратив этот список в pandas.dataframe
и записав этот фрейм данных в csv следующим образом:
import pandas as pd
pd.DataFrame.from_dict(document).to_csv('document.csv')
Теперь откройте document.csv
, и вы найдете все в порядке ... Надеюсь, это поможет вам