【问题标题】:Python NLP/regex: How to split a long text into two parts, but ensure that sentences are not split up?Python NLP/regex:如何将长文本拆分为两部分,但确保句子不拆分?
【发布时间】:2020-07-20 22:15:44
【问题描述】:

我有一个包含 50000 个字符的文本。我正在使用 APP 处理文本,但 APP 最多只能处理 10000 个字符的文本。所以我必须将文本分成至少 5 个部分。

简单的分隔文本的方法是 text[:10000], text[10000:20000], ...,这种方式可能会将一个句子分成两部分,这不是我想要的。

另一种方式是使用 tokenize.sent_tokenize(text) 来分隔句子,但这种方式的输出是所有分隔句子的列表。太无效了,因为我不想把所有的句子都分开。

有没有什么有效的方法可以将长文本分成几部分?

【问题讨论】:

    标签: python regex nlp


    【解决方案1】:

    以下正则表达式匹配不超过 200 个字符且由一个或多个句子组成的最长字符串。因此,匹配字符串的最后一个字符是句子终止符(句号、问号或感叹号)。

    .{1,200}(?<=[.!?])(?=$| )
    

    Regex 1 | Regex 2

    (?&lt;=[.!?]) 是一个正向回溯,它要求匹配的最后一个字符作为句子终止符。 (?=$| ) 是一个正向预测,它要求匹配的最后一个字符后跟一个空格或行尾。

    请注意,每个匹配的字符串都可以以一个或多个空格开头,后面跟一个行终止符。

    【讨论】:

    • .{1,200}(?
    • @user13202738,你需要使用findall而不是split。查看我的编辑。
    • 谢谢!现在可以了。我还在包含数字的文本的表达式后面添加了 \s。但是还是有一些问题。它无法处理包含换行符的文本。试试这个文本“狗的身高和体重变化很大。\r\n\r\n已知最小的成年犬是约克夏犬。\r\n已知最大的犬是圣伯纳犬,重 167.6 公斤(369 1⁄2 lb),从鼻子到尾巴有 250 厘米(8 英尺 2 英寸)。\r\n最高的狗是大丹犬。"
    • 您的示例指出了两个问题。首先是我不允许段落。第二个是我忘记了句号(尤其是),问号和感叹号可以出现在字符串中而不是句子的终止符。在我的修订中,我假设这些字符中的任何一个都是句子终止符,当且仅当它位于行尾或后跟空格时。然而,这是不完美的(“华生博士,我想。”)。我所做的调整在正则表达式测试中正常工作,但我还没有让它在 Python 代码中工作。
    猜你喜欢
    • 2012-09-03
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多