准确地分裂句子

时间:2015-09-23 20:27:10

标签: python parsing nlp

我的程序接受一个文本文件并使用split('.')将每个句子拆分成一个列表,这意味着它会在注册完全停止时拆分,但它可能不准确。

例如

str='i love carpets. In fact i own 2.4 km of the stuff.'

输出

listOfSentences = ['i love carpets', 'in fact i own 2', '4 km of the stuff']

期望输出

 listOfSentences = ['i love carpets', 'in fact i own 2.4 km of the stuff']

我的问题是:如何分割句子的结尾而不是每次句号。

5 个答案:

答案 0 :(得分:3)

任何基于正则表达式的方法都无法处理像"我看到史密斯先生的情况。" ,并且为这些情况添加黑客攻击是不可扩展的。用户 est 已经评论过,任何严肃的实现都会使用数据。

如果您只需要处理英语,那么spaCy优于NLTK:

from spacy.en import English
en = English()
doc = en(u'i love carpets. In fact i own 2.4 km of the stuff.')
for s in list(doc.sents):
    print s.string

更新:spaCy现在支持多种语言。

答案 1 :(得分:0)

如果你的句子都以"。"结尾。和"。 ",你可以试试正则表达式:

import re

text = "your text here. i.e. something."
sentences = re.split(r'(?<!\w\.\w.)(?<![A-Z][a-z]\.)(?<=\.|\?)\s', text)

来源:Python - RegEx for splitting text into sentences (sentence-tokenizing)

答案 2 :(得分:0)

我发现https://github.com/fnl/syntok/很好,实际上是所有受欢迎的产品中最好的。具体来说,我在英语新闻文章上测试了nltk(punkt),spacy和syntok。

import syntok.segmenter as segmenter

document = "some text. some more text"

for paragraph in segmenter.analyze(document):
    for sentence in paragraph:
        for token in sentence:
            # exactly reproduce the input
            # and do not remove "imperfections"
            print(token.spacing, token.value, sep='', end='')
    print("\n")  # reinsert paragraph separators

答案 3 :(得分:-1)

最简单的方法是将一个点分隔后跟一个空格:

>>> s = 'i love carpets. In fact i own 2.4 km of the stuff.'
>>> s.split('. ')
['i love carpets', 'In fact i own 2.4 km of the stuff.']

答案 4 :(得分:-1)

不能使用split模块的re函数来分割数字:

>>> import re
>>> s = 'i love carpets. In fact i own 2.4 km of the stuff.'
>>> re.split(r'\.[^0-9]', s)
['i love carpets', 'In fact i own 2.4 km of the stuff.']