我想把一个字符串中的句子列出来,然后打印出来。我不想用NLTK来做这个。因此,它需要在句子末尾的句号上进行拆分,而不是在小数、缩写或名称的标题上,或者如果句子有一个.com,这是在regex上的尝试,但不起作用。
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.
好的,所以我用regex、nltk、CoreNLP详细介绍了句子标记器。你最终会自己写,这取决于你的申请。这些东西是棘手和有价值的,人们不只是把他们的标记器代码泄露出去。(归根结底,标记化不是一个确定性的过程,它是概率的,而且在很大程度上取决于你的语料库或领域,例如,社交媒体帖子vs Yelp评论vs…)
一般来说,不能只依赖一个伟大的白色无误正则表达式,必须编写一个使用多个正则表达式(正反两种)的函数;还要编写一个缩写字典,以及一些基本的语言解析,这些函数知道英语中的“I”、“USA”、“FCC”、“TARP”是大写的。
为了说明这很容易变得非常复杂,让我们试着编写一个确定性标记赋予器的函数规范来决定是单句点还是多句点('.'/'…')表示句子结束,还是其他:
function isEndOfSentence(leftContext, rightContext)
在简单的(确定性的)情况下,
function isEndOfSentence(leftContext, rightContext)
将返回布尔值,但在更一般的意义上,它是概率的:它返回一个浮点0.0-1.0(特定的“.”是一个句子结尾的置信水平)。参考文献:[a]Coursera视频:“基本文本处理2-5-句子分段-斯坦福NLP-丹·朱拉夫斯基教授和克里斯·曼宁”[UPDATE: an unofficial version used to be on YouTube, was taken down]
试试这个。把你的线分开。你也可以检查演示。
http://regex101.com/r/nG1gU7/27
尝试根据空格而不是点或
?
拆分输入,如果这样做,则最终结果中将不会打印点或?
。相关问题 更多 >
编程相关推荐