Python-正则表达式,用于将文本拆分为句子(句子加令牌)
nlp
python
6
0

我想从字符串中列出句子,然后将它们打印出来。我不想使用NLTK来做到这一点。因此,它需要在句子末尾的句点处进行分隔,而不是小数点,缩写或名称的标题,或者句子中包含.com。这是对正则表达式的尝试无效。

import re

text = """\
Mr. Smith bought cheapsite.com for 1.5 million dollars, i.e. he paid a lot for it. Did he mind? Adam Jones Jr. thinks he didn't. In any case, this isn't true... Well, with a probability of .9 it isn't.
"""
sentences = re.split(r' *[\.\?!][\'"\)\]]* *', text)

for stuff in sentences:
        print(stuff)    

示例输出应该看起来像什么

Mr. Smith bought cheapsite.com for 1.5 million dollars, i.e. he paid a lot for it. 
Did he mind?
Adam Jones Jr. thinks he didn't.
In any case, this isn't true...
Well, with a probability of .9 it isn't.
参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

尝试根据空格而不是点或?分割输入? ,如果您喜欢这样,则点或?不会在最终结果中打印。

>>> import re
>>> s = """Mr. Smith bought cheapsite.com for 1.5 million dollars, i.e. he paid a lot for it. Did he mind? Adam Jones Jr. thinks he didn't. In any case, this isn't true... Well, with a probability of .9 it isn't."""
>>> m = re.split(r'(?<=[^A-Z].[.?]) +(?=[A-Z])', s)
>>> for i in m:
...     print i
... 
Mr. Smith bought cheapsite.com for 1.5 million dollars, i.e. he paid a lot for it.
Did he mind?
Adam Jones Jr. thinks he didn't.
In any case, this isn't true...
Well, with a probability of .9 it isn't.
收藏
评论
(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?)\s

尝试这个。分割您的字符串。您还可以查看演示。

http://regex101.com/r/nG1gU7/27

收藏
评论

好了,我使用正则表达式,nltk和CoreNLP来详细介绍句子标记器。您最终要编写自己的文件,这取决于应用程序。这些东西既棘手又有价值,人们不仅会放弃他们的令牌生成器代码。 (最终,标记化不是确定性的过程,它是概率性的,并且在很大程度上取决于您的语料库或领域,例如法律/财务文档,社交媒体帖子,Yelp评论,生物医学论文等。)

通常,您不能依赖一个伟大的White White可靠的正则表达式 ,而必须编写一个使用多个正则表达式(正负)的函数。也是缩写字典,以及一些基本的语言解析,这些解析知道例如“ I”,“ USA”,“ FCC”,“ TARP”用英语大写。

为了说明如何轻松地这样做会变得非常麻烦,让我们试着给你写了一个确定性的标记生成器功能性规范只是决定是否单个或多个周期(“‘/’...”)表示结束句 ,或一些其他:

function isEndOfSentence(leftContext, rightContext)

  1. 对于数字或货币中的小数,返回False,例如1.23,$ 1.23,“那只是我的$ .02”。还要考虑部分引用(如1.2.3),欧洲日期格式(如09.07.2014),IP地址(如192.168.1.1,MAC地址)...
  2. 对于已知的缩写,例如,“美国股市下跌”,请返回False(并且不要将其标记为单个字母);这需要已知缩写的字典。该词典以外的任何内容都将出错,除非您添加代码以检测未知缩写(如ABC)并将其添加到列表中。
  3. 句子结尾处的省略号“ ...”为末尾,但句子中间的省略号为“ ...”。这并不像您想象的那么容易:您需要查看左侧的上下文和右侧的上下文,特别是RHS大写,然后再次考虑大写的单词,例如“ I”和缩写。这是证明模棱两可的一个例子: 她让我留下来……一个小时后我离开了。 (是一两个句子吗?无法确定)
  4. 您可能还想编写一些模式来检测和拒绝标点符号的其他非句子结尾用法:表情符号:-),ASCII艺术作品,空格隔开。 。 。和其他东西,特别是推特。 (使适应性更加困难)。我们如何分辨@midnight是Twitter用户, Comedy Central上的节目 ,速记还是仅是不需要的/垃圾的/标点符号?严重不平凡。
  5. 处理完所有否定案例后,您可以随意地说,任何孤立的句点后跟空格都可能是句子的结尾。 (最终,如果您真的想购买更多的准确性,您最终将编写使用权重的概率句子令牌,并在特定的语料库上对其进行训练(例如法律文本,广播媒体,StackOverflow,Twitter,论坛评论等)。 )然后,您必须手动检查示例和训练错误。参见Manning和Jurafsky的书或Coursera的课程[a]。最终,您将获得与准备付款一样多的正确性。
  6. 以上所有内容显然都是针对英语/缩写,美国编号/时间/日期格式的。如果要使其独立于国家和语言,那是一个更大的主张,那么您将需要语料库,会说英语的人来标记所有内容并进行质量检查,等等。
  7. 以上所有仍然只是ASCII。允许输入为Unicode,事情会变得更加艰难(而且训练集必须更大或更稀疏)

在简单的(确定性)情况下, function isEndOfSentence(leftContext, rightContext)将返回布尔值,但是从更一般的意义上讲,它是概率性的:它返回浮点数0.0-1.0(该特定“。”是句子结尾的置信度) 。

参考资料:[a] Coursera视频:“基本文本处理2-5-句子细分-Stanford NLP-Dan Jurafsky和Chris Manning教授” [更新:曾经在YouTube上使用的非官方版本已被删除]

收藏
评论
sent = re.split('(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?)(\s|[A-Z].*)',text)
for s in sent:
    print s

这里使用的正则表达式为: (?<!\w\.\w.)(?<![AZ][az]\.)(?<=\.|\?)(\s|[AZ].*)

第一个块: (?<!\w\.\w.) :此模式在负反馈循环(?<!)搜索所有单词(\w)然后是句号(\.) ,之后是其他单词(\.)

第二个块: (?<![AZ][az]\.) :此模式在负反馈循环中搜索以大写字母([AZ])开头,然后是小写字母([az])直到点为止的所有内容(\.)已找到。

第三块: (?<=\.|\?) :此模式在点(\.)或问号(\?)的反馈循环中搜索

第四块: (\s|[AZ].*) :此模式在第三块中的点OR问号之后搜索。它搜索空格(\s)或以大写字母([AZ].*)开头的任何字符序列。如果输入为

世界,您好。我今天在这里。

即,如果在点后有空格或没有空格。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号