【问题标题】:Tokenize sentence function分词功能
【发布时间】:2021-03-11 07:08:19
【问题描述】:

我需要在不使用正则表达式或任何导入模块的情况下对句子进行标记,但使用内置的 split() 函数。该函数应将文本作为输入,并返回一个包含文本中句子的列表,由“?”、“!”分隔和 '。' 一个例子是:

>>> t = "Are you out of your mind? I can't believe it! I'm so disappointed."
>>> get_sentences(t)
['Are you out of your mind', 'I can't believe it', 'I'm so disappointed']

这是我目前的工作:

def get_sentences(text):
    l1 = text.split('.')
    for l2 in l1:
        l2 = l2.split('!')
        for l3 in l2:
            l3 = l3.split('?')
    return l1

有什么帮助吗?

【问题讨论】:

  • 发布的代码无效(缩进错误)。
  • 您的代码以何种方式无法回答您要解决的问题?为什么你认为它应该

标签: python python-3.x string split


【解决方案1】:

解决此问题的一种方法是一次使用一个分隔符逐步拆分文本,然后将这些片段与sum()itertools.chain() 合并。后者要快得多,但需要一个外部模块。分隔符的顺序无关紧要。 stripping 删除了句子之间不需要的空格。

sents = sum([sum([[z.strip() for z in y.split("?")] 
                             for y in x.split("!")], []) 
                             for x in t.split(".")], [])

输出中可能有空字符串剩余。摆脱它们:

sents = [sent for sent in sents if sent]
#['Are you out of your mind', "I can't believe it", 
# "I'm so disappointed"]

【讨论】:

  • 你最终得到了 4 件物品;解决方案应该有 3.
  • 谢谢,你知道没有 sum() 和 itertools.chain() 的其他方法吗? (我对模块和函数的使用非常有限......)有没有办法通过使用循环和拆分来解决问题?
  • sum() 是一个内置函数。它有什么问题?
  • 如果你不能使用内置函数(你应该已经警告我们了),你可以根据this answer编写你自己的。
猜你喜欢
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2012-02-28
  • 2023-03-10
  • 2021-10-30
  • 1970-01-01
  • 2020-10-02
  • 2017-02-11
相关资源
最近更新 更多