Как извлечь (динамик, текст) кортежи из записи транскриптов с помощью регулярных выражений? - PullRequest
0 голосов
/ 13 января 2019

Для моей магистерской диссертации мне нужно извлечь (спикер, текст) кортежи из корпоративных записей звонков заработка.

Стенограмма имеет следующий вид:

OPERATOR: Some text with numbers, special characters and linebreaks.

NAME, COMPANY, POSITION: Some text with numbers, special characters and linebreaks.

NAME: Some text with numbers, special characters and linebreaks.

Я хочу извлечь все (динамик, текст) кортежи из документа. Например:

[("OPERATOR", "Some text with numbers, special characters and linebreaks."), ..]

До сих пор я пробовал разные регулярные выражения с функцией re.findall в Python.

Вот пример извлечения:

example = """OPERATOR: Good day, ladies and gentlemen, and welcome to the first-quarter 2012
Agilent Technologies earnings conference call. My name is Keith, and I will be
your operator for today. At this time, all participants are in a listen-only
mode. Later on, we will have a question and answer session. (Operator
Instructions) As a reminder, today's conference is being recorded for replay
purposes.

And I would now like to turn the conference over to your host for today, Ms.
Alicia Rodriguez, Vice President of Investor Relations. Please go ahead, ma'am.

ALICIA RODRIGUEZ, VP - IR, AGILENT TECHNOLOGIES INC: Thank you, Keith, and
welcome, everyone, to Agilent's first quarter conference call for fiscal-year
2012. With me are Agilent's President and CEO, Bill Sullivan, as well as Senior
Vice President and CFO, Didier Hirsch. Joining in the Q&A after Didier's
comments will be Agilent's Chief Operating Officer, Ron Nersesian, and the
Presidents of our Electronic Measurement, Life Sciences, and Chemical Analysis
Groups -- Guy Sene, Nick Roelofs, and Mike McMullen.

You can find the press release and information to supplement today's discussion
on our website at www.investor.agilent.com. While there, please click on the
link for financial results, where you will find revenue breakouts and historical
financials for Agilent's operations. We will also post a copy of the prepared
remarks following this call. For any non-GAAP financial measures, you will find
the most directly comparable GAAP financial metrics and reconciliations on our
website.

We will make forward-looking statements about the financial performance of the
Company. These statements are subject to risks and uncertainties, and are only
valid as of today. The Company assumes no obligation to update them. Please look
at the Company's recent SEC filings for a more complete picture of our risks and
other factors.

Before turning the call over to Bill, I would like to remind you that Agilent
will host its annual analysts meeting in New York City on March 8. Details about
the meeting and webcast will be available on the Agilent investor relations
website two weeks prior.

And now, I'd like to turn the call over to Bill.

BILL SULLIVAN, PRESIDENT AND CEO, AGILENT TECHNOLOGIES INC: Thanks, Alicia, and
hello, everyone. Agilent's Q1 orders of $1.62 billion were flat versus last
year. Q1 revenues of $1.64 billion were up 7% year-over-year. Non-GAAP EPS was
$0.69 per share, and operating margin was 19%."""

А вот и мой код:

import re

# First approach:
r = re.compile(r"^([^a-z:]+?):([\s\S]+?)", flags=re.MULTILINE)
re.findall(r, example)

# Second approach:
r = re.compile(r"^([^a-z:]+?):([\s\S]+)", flags=re.MULTILINE)
re.findall(r, example)

Проблема первого (не жадного) подхода заключается в том, что он не захватывает полный текст говорящего.

Проблема второго (жадного) подхода заключается в том, что он не останавливается при появлении следующего оратора.

РЕДАКТИРОВАТЬ: Дополнительная информация

  • Текстовая группа также может содержать двойные точки. Есть также некоторые случаи, когда двойная точка появляется сразу после первого слова строки, например, "Для \ nexample: ..."
  • Группа динамиков также может занимать несколько строк, например, когда название компании и описание должности очень длинны

1 Ответ

0 голосов
/ 13 января 2019

Вы можете сопоставить без использования [\s\S]+, потому что это будет соответствовать любому символу, включая новые строки.

Для второй группы захвата вы можете сопоставить .*, а затем использовать повторяющуюся группу с отрицательным прогнозом, которая будет соответствовать до тех пор, пока следующая строка не начинается с (?:(?!\n[^a-z\r\n]+:)

^([^a-z\r\n]+):(.*(?:(?!\n[^a-z\r\n]+:)[\r\n].*)*)

Regex demo | Python demo

...