Python和RegEx从未格式化的文本文件中查找说话人和他们的讲话?

2024-05-13 19:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

大家好,我需要Python和RegEx的混合帮助。我正在做一个项目,它将原始文本转换成XML。这篇课文由多个说不同话的人组成。我要做的是将演讲分解并将其转换为XML。你知道吗

示例字符串为:

Mr. COX. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum sollicitudin vestibulum consectetur. Aliquam rhoncus nisl id velit gravida, quis volutpat est eleifend. Donec posuere a magna ac molestie. Vivamus sed lacinia lectus, quis feugiat libero. Nam sapien lacus, hendrerit at posuere ut, ullamcorper sit amet augue. Ut fringilla lobortis nulla. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur rutrum dictum. Aenean a sem mollis justo scelerisque posuere eget sit amet orci. Praesent condimentum, leo at commodo dapibus, leo mi pretium lectus, et sagittis lorem sapien ut enim. Nulla sagittis varius eros, eget pretium arcu suscipit aliquet. Mr. SEABASS. Ut condimentum lobortis suscipit. Donec eget tempor ex, vel porttitor velit. Aliquam vulputate, leo in aliquet laoreet, sem ante dapibus velit, nec imperdiet felis tellus vel leo. Nunc mattis velit sed turpis consectetur tempus. Nam volutpat vel metus sed aliquam. Curabitur vitae elit urna. Nulla vehicula sapien quis libero elementum, vitae sodales tellus commodo. Pellentesque pulvinar felis vitae neque viverra posuere vitae sit amet neque. Curabitur lorem libero, mollis consectetur tempus sit amet, tincidunt vitae dolor. Cras ullamcorper arcu ac orci pharetra consequat. Nunc magna justo, sollicitudin at enim vel, volutpat elementum sapien. Mauris sit amet velit in diam imperdiet tempor facilisis et ex. Praesent consectetur leo a eros mattis tempor. Mr. REX. Nullam interdum urna quis nunc sodales, id posuere nisl malesuada. Nam nec lacus et ipsum ultrices pharetra. Nullam vitae mauris sodales, fringilla augue at, efficitur arcu. Sed ex diam, ullamcorper a auctor eget, volutpat sit amet est. Suspendisse urna eros, ullamcorper in semper at, lobortis eget quam. Fusce auctor, augue sit amet convallis condimentum, diam libero porta lectus, consectetur posuere nisi mi non nulla. Suspendisse vel ante efficitur, eleifend justo sed, lobortis augue. Sed rhoncus neque libero, et tempor ipsum imperdiet id. Integer at purus eget dolor pharetra varius ut et massa. Etiam risus enim, ultrices vitae nisl eu, interdum dignissim tellus. Nullam tellus metus, finibus non justo at, lobortis imperdiet tortor. Nulla nec tortor sagittis, fringilla nisi quis, bibendum leo.

以上只是一个例子。RegEx和Python代码需要通读一个完整的文件来编写说话者和他们的讲话。你知道吗

上述情况应产生如下结果:

<Gutenberg>
<Speaker>Mr. COX</Speaker>
<Speech>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum sollicitudin vestibulum consectetur. Aliquam rhoncus nisl id velit gravida, quis volutpat est eleifend. Donec posuere a magna ac molestie. Vivamus sed lacinia lectus, quis feugiat libero. Nam sapien lacus, hendrerit at posuere ut, ullamcorper sit amet augue. Ut fringilla lobortis nulla. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur rutrum dictum. Aenean a sem mollis justo scelerisque posuere eget sit amet orci. Praesent condimentum, leo at commodo dapibus, leo mi pretium lectus, et sagittis lorem sapien ut enim. Nulla sagittis varius eros, eget pretium arcu suscipit aliquet. </Speech>
<Speaker>Mr. SEABASS</Speaker>
<Speech>Ut condimentum lobortis suscipit. Donec eget tempor ex, vel porttitor velit. Aliquam vulputate, leo in aliquet laoreet, sem ante dapibus velit, nec imperdiet felis tellus vel leo. Nunc mattis velit sed turpis consectetur tempus. Nam volutpat vel metus sed aliquam. Curabitur vitae elit urna. Nulla vehicula sapien quis libero elementum, vitae sodales tellus commodo. Pellentesque pulvinar felis vitae neque viverra posuere vitae sit amet neque. Curabitur lorem libero, mollis consectetur tempus sit amet, tincidunt vitae dolor. Cras ullamcorper arcu ac orci pharetra consequat. Nunc magna justo, sollicitudin at enim vel, volutpat elementum sapien. Mauris sit amet velit in diam imperdiet tempor facilisis et ex. Praesent consectetur leo a eros mattis tempor.</Speech>
<Speaker>Mr. REX</Speaker>
<Speech>Nullam interdum urna quis nunc sodales, id posuere nisl malesuada. Nam nec lacus et ipsum ultrices pharetra. Nullam vitae mauris sodales, fringilla augue at, efficitur arcu. Sed ex diam, ullamcorper a auctor eget, volutpat sit amet est. Suspendisse urna eros, ullamcorper in semper at, lobortis eget quam. Fusce auctor, augue sit amet convallis condimentum, diam libero porta lectus, consectetur posuere nisi mi non nulla. Suspendisse vel ante efficitur, eleifend justo sed, lobortis augue. Sed rhoncus neque libero, et tempor ipsum imperdiet id. Integer at purus eget dolor pharetra varius ut et massa. Etiam risus enim, ultrices vitae nisl eu, interdum dignissim tellus. Nullam tellus metus, finibus non justo at, lobortis imperdiet tortor. Nulla nec tortor sagittis, fringilla nisi quis, bibendum leo. </Speech>
</Gutenberg>

现在我已经有了正则表达式来寻找说话者。然而,我很难把演讲稿和演讲者搭配起来。而且演讲和演讲者也会有所不同,三个演讲者或演讲不一样。所以正则表达式需要灵活。你知道吗

这个问题不是重复的,因为参考文献中的另一个问题是关于电影剧本的,这是关于古腾堡项目电子书的。你知道吗


Tags: atetipsumleoametsitvitaevel
1条回答
网友
1楼 · 发布于 2024-05-13 19:20:44

为有限的示例提供regex很容易,但不可避免地会不可靠和脆弱。 必须有另一种方法来提取更相关的信息块。原因是,允许识别新的说话人/语音组合的可预测模式有限。在这种情况下,Mr. ALLCAPSNAME.似乎是唯一半可靠的标识符。使用这种方法,如果任何一个语音的单词Mr|Ms|Mrs后跟一个全大写的单词,那将被误认为是断点。所以这会把它绊倒:

Mr. ABC. I think Mrs. ABC. is awsome.

会给你:

[('Mr. ABC.', 'I think'), ('Mrs. ABC.', 'is awesome.')]

我很容易看到有人在演讲中提到任何人。 如果没有更好的方法来提取它,这可能会奏效,但我不相信它:

In [1]: pattern = re.compile(r"""
            (?<=\b)\s*
            (?P<Speaker>M(?:rs?|s)\.\s+[A-Z]+\.)\s+
            (?P<Speech>.+?\.)
            (?=\s+M(?:rs?|s)\.\s+[A-Z]+\.|$)
            """, 
            re.VERBOSE)
In [1]:  pattern.findall(example)
Out[1]: 
[('Mr. COX.',
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum sollicitudin vestibulum consectetur. Aliquam rhoncus nisl id velit gravida, quis volutpat est eleifend. Donec posuere a magna ac molestie. Vivamus sed lacinia lectus, quis feugiat libero. Nam sapien lacus, hendrerit at posuere ut, ullamcorper sit amet augue. Ut fringilla lobortis nulla. Nulla facilisi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam efficitur rutrum dictum. Aenean a sem mollis justo scelerisque posuere eget sit amet orci. Praesent condimentum, leo at commodo dapibus, leo mi pretium lectus, et sagittis lorem sapien ut enim. Nulla sagittis varius eros, eget pretium arcu suscipit aliquet.'),
 ('Mr. SEABASS.',
  'Ut condimentum lobortis suscipit. Donec eget tempor ex, vel porttitor velit. Aliquam vulputate, leo in aliquet laoreet, sem ante dapibus velit, nec imperdiet felis tellus vel leo. Nunc mattis velit sed turpis consectetur tempus. Nam volutpat vel metus sed aliquam. Curabitur vitae elit urna. Nulla vehicula sapien quis libero elementum, vitae sodales tellus commodo. Pellentesque pulvinar felis vitae neque viverra posuere vitae sit amet neque. Curabitur lorem libero, mollis consectetur tempus sit amet, tincidunt vitae dolor. Cras ullamcorper arcu ac orci pharetra consequat. Nunc magna justo, sollicitudin at enim vel, volutpat elementum sapien. Mauris sit amet velit in diam imperdiet tempor facilisis et ex. Praesent consectetur leo a eros mattis tempor.'),
 ('Mr. REX.',
  'Nullam interdum urna quis nunc sodales, id posuere nisl malesuada. Nam nec lacus et ipsum ultrices pharetra. Nullam vitae mauris sodales, fringilla augue at, efficitur arcu. Sed ex diam, ullamcorper a auctor eget, volutpat sit amet est. Suspendisse urna eros, ullamcorper in semper at, lobortis eget quam. Fusce auctor, augue sit amet convallis condimentum, diam libero porta lectus, consectetur posuere nisi mi non nulla. Suspendisse vel ante efficitur, eleifend justo sed, lobortis augue. Sed rhoncus neque libero, et tempor ipsum imperdiet id. Integer at purus eget dolor pharetra varius ut et massa. Etiam risus enim, ultrices vitae nisl eu, interdum dignissim tellus. Nullam tellus metus, finibus non justo at, lobortis imperdiet tortor. Nulla nec tortor sagittis, fringilla nisi quis, bibendum leo.')]

如果此模式有效,您可以使用它将其XML化:

def to_xml(l):
    base_element = Element('Gutenburg')
    speeches = SubElement(base_element, 'Speeches')

    for speaker, speech in l:
        sp = SubElement(speeches, 'Speech')

        s = SubElement(sp, 'Speaker')
        s.text = speaker

        text = SubElement(sp, 'Text')
        text.text = speech

    return base_element

然后:

tostring(result)

用于xml字符串。你知道吗

相关问题 更多 >