【问题标题】:Replace multiple fullstops with single fullstop用单个句号替换多个句号
【发布时间】:2016-03-10 07:44:18
【问题描述】:

如何用单个句号替换多个句号,以便 NLTK 句子标记器可以将它们区分为 2 个不同的句子

例如

a = "the food was good...what about the bread huh..Awesome"

如果我使用

nltk.sent_tokenize(a)

它给了我

['the food was good...what about the bread huh..Awesome']

但我想要的是

['the food was good.', 'what about the bread huh.', 'Awesome']

我该怎么做?

【问题讨论】:

  • 您是否检查过省略号几乎总是在您的语料库中结束一个句子?因为情况并非总是如此:“这……很有趣”。

标签: python regex nltk


【解决方案1】:

您可以通过使用regex and substitute 来做到这一点,多个点的出现只有一个,如下所示:

#!/usr/bin/env python3
# coding: utf-8

import re

a = "the food was good...what about the bread huh..Awesome"
a_replaced = re.sub(r'\.+', ".", a)

给你:

'the food was good.what about the bread huh.Awesome'

此外,我将向您简要说明其工作原理。 re.sub() 接受应替换的 regex 模式。在我们的例子中,这是r'\.+'

让我们更深入地了解一下这种模式。由于您正在寻找点.,我们需要抓住它们。但是,通常点号. 在正则表达式中用于匹配任何我们不想实现的字符。为了匹配点 . 而不是任何字符,我们需要通过在点前面添加反斜杠来转义这个字符,从而给出\.

由于我们想要找到任何出现的点并且我们不知道会有多少个点,我们只是在寻找“一个或多个”,我们通过将+ 附加到我们的匹配组/. 来实现.

我们有一个工作正则表达式:/.+,我们将其传递为r'\.+',以向 Python 表明这是一个正则表达式而不是普通字符串。接下来,如re.sub() docs 中所述,我们需要指定一个要放置的字符串,而不是我们的正则表达式模式。这只是一个点".",因为您想用一个点替换几个点。我们传递的第三个参数是您的字符串a,我们需要在其中进行所需的替换。

我不想宣传任何东西,但为了快速了解 Python 中的正则表达式,我可以建议 this cheat sheet

【讨论】:

    【解决方案2】:

    您也可以为此目的使用re.split。它也会返回一个列表

    a="the food was good...what about the bread huh..Awesome"
    sr = re.split("\.+", a)
    print sr
    

    你得到

    ['the food was good', 'what about the bread huh', 'Awesome']
    

    干杯!

    【讨论】:

    • 坏主意:句子标记器之所以存在是因为句号总是结束一个句子。但是您可以使用split() 将其拆分为三个句点,然后将每个片段句子标记为更多句子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多