句子分割和正则表达式

时间:2014-04-23 05:30:05

标签: regex python-3.x

好的,我知道有很多这方面的主题,我已经阅读了很多试图让它发挥作用。任务是将一个段落分成单独的句子。我想我不太确定正则表达式是如何工作的,因为我尝试了很多变化,但没有任何东西能给我我想要的结果。

paragraph = "Mr. Smith bought cheapsite.com for 1.5 million dollars, i.e. he "\
        "paid a lot for it.  Did he mind?  Adams Jones Jr. thinks he "\
        "didn't.  In any case, this isn't true...  Well, with a "\
        "probability of .9 it isn't."

sentenceEnd = re.compile('[.!?][\s]{1,2}(?=[A-Z])')
sentenceList = sentenceEnd.split(paragraph)

for sentence in sentenceList:
        print(sentence)

这是我一直在尝试的代码,在我看来的任何地方,它似乎都是[。?!] [/ s]等。是re.compile中推荐的。但是,当我用这段代码打印段落时,我得到:

OUTPUT:
Mr
Smith bought cheapsite.com for 1.5 million dollars, i.e. he paid a lot for it
Did he mind
Adams Jones Jr. thinks he didn't
In any case, this isn't true..
Well, with a probability of .9 it isn't.

我缺少什么或不理解?

感谢。

1 个答案:

答案 0 :(得分:1)

你事先不知道正则表达式,你做得很好!

您的问题与代码的关系不如简单的排版模糊。非智能计算机应该如何知道Mr.不是句子,因为它在技术上遵循您规定的规则?也就是说,一个句点后跟一个或两个空格后跟一个大写字母?

您可能会发现下一个有用的词是启发式。也就是说,你需要一个聪明的启发式来近似我们分离句子的智能方式,就像人类一样。这不一定是一件容易的事 - 搜索句子分裂启发式的第一个Google结果是this presentation involving Markov chains and other fancy schmancy ideas

如果您想要实现自己的启发式方法,您可以例如通过称呼例如 (?<!Mr|Mrs|Ms|Dr)排除句点之前的情况。我还建议将句点置于零宽度断言中(一个前瞻或后瞻断言),以便在分裂期间不会“吃掉”句号。


以下评论摘要

将称呼过滤为句子:

(?<=(?<!Mr)(?<!Mrs)(?<!Ms)(?<!Dr)(?<!Jr)[.!?])\s{1,2}(?=[A-Z])

这是an Ideone demo