好的,我知道有很多这方面的主题,我已经阅读了很多试图让它发挥作用。任务是将一个段落分成单独的句子。我想我不太确定正则表达式是如何工作的,因为我尝试了很多变化,但没有任何东西能给我我想要的结果。
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.
我缺少什么或不理解?
感谢。
答案 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])