1

我正在编写一个解析 epub 2 的 python 脚本,我正在努力实现它,以便我可以将单词、句子和段落拆分为它们自己的对象......我已经让单词和段落工作了,但问题在于在句子中,因为有时会有“......” 在句末作为分隔符。但问题是我正在逐个字符解析,所以当我点击“。”,“!”或“?”时 我的系统将其视为句子的结尾......我正在考虑编写一些复杂的 if 语句来读取前一个字符以查看它是空格还是句子分隔符,但我尝试过的每件事都不起作用。对此的任何建议将不胜感激。我应该提到的一件事是我没有使用正则表达式,我也不会,

这是我一直在尝试使用的代码:

def add_until(self):

    char_list = []
    end_sentence = False

    for char in self.source:

        if isinstance(char, Character) or isinstance(char, EntityRef):
            char_list.append(char)

            if len(char_list) >= 2 and char_list[-2].is_whitespace or len(char_list) >= 2 and char_list[-2].split_sent and char.is_whitespace or char.split_sent: 
                  char_list.append(char)


            if len(char_list) >= 2 and char_list[-2].is_whitespace and char.split_sent == False and char.is_whitespace == False:
                 char_list.pop() # pop's the last space off because it should be part of the next sentience. 
4

1 回答 1

1

您需要使用贪心字符串匹配。通常,为了做这类事情,我将字符串切成块并迭代它们,同时在必要时减少它们的长度。用你的例子:

source = """This is a sentence... This is a second sentence.
         Is this a sentence? Sure it is!!!"""

stop = ('...', '.', '?', '!', '!!!')

i = 0
M = max(len(s) for s in stop)
L = len(source)

while i <= L:
    m = M
    while m > 0:
        chunk = source[i:i + m]
        if chunk in stop:
            print("end of sentence with: %s" % chunk)
            break
        m -= 1
    else:
        m = 1
    i += m

这输出:

end of sentence with: ...
end of sentence with: .
end of sentence with: ?
end of sentence with: !!!

您可能还想检查“句末”标记之后的第一个非空白字符是否为大写(或数字)。

编辑

预处理器示例,用于剥离不需要的空白:

def read(source):
    had_blank = False
    for char in source:
        if char == ' ':
            had_blank = True
        else:
            if had_blank and not char in '.?!':
                yield ' '
                yield char
                had_blank = False
            else:
                yield char

使用它:

>>> source = "Sentence1  .. . word1    word2.    . .  word other_word  . .   ."
>>> ''.join(c for c in read(source))
'Sentence1... word1 word2... word other_word...'
于 2013-06-06T19:32:22.603 回答