【问题标题】:How to split text into sentences when there is no space after full stop?句号后没有空格时如何将文本拆分成句子?
【发布时间】:2017-07-15 17:03:22
【问题描述】:

我有这样的文字

'自去年 5 月以来,Lapindo Brantas Inc. 运营的东爪哇泗水附近的一口气井喷出热气腾腾的泥浆,淹没了村庄、工业和田野。PT Lapindo Brantas 运营的东爪哇泗水附近的一口气井自去年 5 月以来,喷出热气腾腾的泥浆,淹没了村庄、工厂和田野。上周,印度尼西亚社会福利协调部长阿布里扎尔·巴克里 (Aburizal Bakrie) 表示,这座火山是与钻探活动无关的“自然灾害”。 .总统 Susilo Bambang Yudhoyono 上个月命令 Lapindo 支付 3.8 万亿印尼盾(4.207 亿美元)的赔偿和费用'

我想把它分成句子。 NLTK 或我在网上找到的任何标准正则表达式都失败了。

【问题讨论】:

  • 句子,如列表?还是您只想插入新行?
  • 一切都好。
  • 句尾的语法描述是什么?也许是句号(句号)后跟一个大写字母?
  • \.\"?[A-Z]\w+ 应该匹配一个以大写字母开头的单词,可以在句号后引用。
  • 您无法使用正则表达式解析 NLTK 句子。这是不可能的。

标签: python regex nlp nltk


【解决方案1】:

你可以使用这个正则表达式来捕捉新句子后面的点

(\.)(?:[A-Z]) 你可以把它传递给 re.sub 用 r'\1\n' 作为替换

parsed_text = re.sub(r'(\.)(?:[A-Z])',r'\1\n',your_text)

您也可以将其拆分为句子列表(但最后会丢失点)

 sentence_list = re.split(r'\.(?=[A-Z])',your_text)

【讨论】:

  • 这会将句号后的第一个字母替换为新行。
  • 我的错,我错过了非捕获组。现在修好了。
  • 还是不行。仍然替换第一个字母。
【解决方案2】:

您可以使用正则表达式肯定前瞻在句子末尾添加空格,然后将其传递给您选择的工具。这会为还没有空格的句点添加一个空格,但会跳过逗号等非字母数字。通过坚持使用字符类而不是 A-Z,这适用于任何语言。

>>> re.sub(r'\.(?=[^ \W\d])', '. ', 'Foo bar.Baz Inc., foobar. 1.1, and abc._')
'Foo bar. Baz Inc., foobar. 1.1, and abc. _'

您可以通过添加另一个查找斜杠的前瞻来捕获一些网址

>>> re.sub(r'\.(?=[^ \W\d])(?=[^\w*]/)', '. ', 'Foo bar.Baz Inc., foobar. 1.1, and abc._ http://www.example.com/whatever')
'Foo bar.Baz Inc., foobar. 1.1, and abc._ http://www.example.com/whatever'

【讨论】:

  • 不完全...我测试过,它在 420.7 中添加了一个空格。我会更新的。
  • 这将拆分文本中的 URL。这不是一个简单的问题...... NLTK 有一个"casual" tokenizer module,它对非标准拼写更健壮,但恐怕它只涵盖单词标记,而不是句子分割。
  • @lenz - 有趣。我添加了另一个前瞻来捕获一些 url,但如果 NLTK 清理了这个,那是更好的选择。
猜你喜欢
  • 2021-01-10
  • 2017-04-18
  • 2011-11-03
  • 2022-07-06
  • 2019-08-27
  • 2016-11-02
  • 1970-01-01
  • 2013-04-28
  • 2021-12-25
相关资源
最近更新 更多