Получить предложения из файла стенограммы

У меня есть файлы стенограмм в формате

(name 1): (sentence)\n (<-- There can be multiples of this pattern)

(name 2): (sentence)\n (sentence)\n

и так далее. Мне нужны все предложения. Пока что я заставил его работать, жестко закодировав имена в файле, но мне нужно, чтобы это было общим.

utterances = re.findall(r'(?:CALLER: |\nCALLER:\nCRO: |\nCALLER:\nOPERATOR: |\nCALLER:\nRECORDER: |RECORDER: |CRO: |OPERATOR: )(.*?)(?:CALLER: |RECORDER : |CRO: |OPERATOR: |\nCALLER:\n)', raw_calls, re.DOTALL)

Python 3.6 с использованием re. Или, если кто-нибудь знает, как это сделать с помощью spacy, это будет большим подспорьем, спасибо.

Я хочу просто взять \n после пустого оператора и поместить его в отдельную строку. И я полагаю, мне просто нужно будет взять информацию на ленте, приведенную в конце, например, поскольку я не могу придумать способ отличить, является ли эта строка частью чьей-то речи или нет. Также иногда между началом строки и двоеточием находится более одного слова.

Мнимые данные:

CRO: How far are you from the World Trade Center, how many blocks, about? Three or four blocks?
63FDNY 911 Calls Transcript - EMS - Part 1 9-11-01
CALLER:
CRO: You're welcome. Thank you.
OPERATOR: Bye.
CRO: Bye.
RECORDER: The preceding portion of tape concludes at 0913 hours, 36 seconds.
This tape will continue on side B.
OPERATOR NEWELL: blah blah.
GUY IN DESK: I speak words!

Но какой результат вы хотите получить?

Jerry 26.10.2018 07:42
0
1
64
2

Ответы 2

Вы можете использовать опережающее выражение, которое ищет тот же образец имени в начале строки, за которым следует двоеточие:

s = '''CRO: How far are you from the World Trade Center, how many blocks, about? Three or four blocks?
63FDNY 911 Calls Transcript - EMS - Part 1 9-11-01
CALLER:
CRO: You're welcome. Thank you.
OPERATOR: Bye.
CRO: Bye.
RECORDER: The preceding portion of tape concludes at 0913 hours, 36 seconds.
This tape will continue on side B.
OPERATOR NEWELL: blah blah.
GUY IN DESK: I speak words!'''
import re
from pprint import pprint
pprint(re.findall(r'^([^:\n]+):\s*(.*?)(?=^[^:\n]+?:|\Z)', s, flags=re.MULTILINE | re.DOTALL), width=200)

Это выводит:

[('CRO', 'How far are you from the World Trade Center, how many blocks, about? Three or four blocks?\n63FDNY 911 Calls Transcript - EMS - Part 1 9-11-01\n'),
 ('CALLER', ''),
 ('CRO', "You're welcome. Thank you.\n"),
 ('OPERATOR', 'Bye.\n'),
 ('CRO', 'Bye.\n'),
 ('RECORDER', 'The preceding portion of tape concludes at 0913 hours, 36 seconds.\nThis tape will continue on side B.\n'),
 ('OPERATOR NEWELL', 'blah blah.\n'),
 ('GUY IN DESK', 'I speak words!')]

Я бы использовал regular expressions и вложенный for loops в понимании списка, чтобы захватить все предложения, как показано в приведенном ниже коде.

s ='''(name 1): (sentence1 here)\n (<-- There can be multiples of this pattern)

(name 2): (sentence2 here)\n (sentence3 here)\n'''

[y.strip('()') for x in re.split('\(name \d+\):', s) for y in re.findall('\([^\)]+\)', x)]

>>> ['sentence1 here',
    '<-- There can be multiples of this pattern',
    'sentence2 here',
    'sentence3 here']

Другие вопросы по теме