如何删除标点符号?

发布于 2021-01-29 16:04:23

我正在 Python中 使用 NLTK中 的标记器。

已经有很多答案可以消除论坛上的标点符号。但是,它们都不能同时解决以下所有问题:

  1. 连续多个符号 。例如,句子:他说,“就是这样”。因为引号后面有逗号,所以标记化程序不会删除。“。标记化程序将给出[‘He’,’said’,’,’,’that’,’s’,’it。 ‘]代替[‘He’,’said’,’that’,’s’,’it’]。其他一些示例包括’…’,’-‘,’!?’,’,’‘等。
  2. 删除句子结尾的符号 。即句子:Hello World。令牌生成器将给出[‘Hello’,’World。],而不是[‘Hello’,’World’]。注意“世界”一词末尾的句点。其他一些示例在任何字符的开头,中间或结尾都包含“-”,“”。
  3. 删除前面和后面带有符号的字符 。即'*u*', '''','""'

有解决这两个问题的优雅方法吗?

关注者
0
被浏览
308
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您想一次性对字符串进行标记化,我认为您唯一的选择就是使用nltk.tokenize.RegexpTokenizer。通过以下方法,您可以在完全删除标点符号之前,使用标点符号作为标记来删除字母字符(如您的第三个要求中所述)。换句话说,此方法将*u*在剥离所有标点符号之前删除。

    因此,解决此问题的一种方法是标记空白,如下所示:

    >>> from nltk.tokenize import RegexpTokenizer
    >>> s = '''He said,"that's it." *u* Hello, World.'''
    >>> toker = RegexpTokenizer(r'((?<=[^\w\s])\w(?=[^\w\s])|(\W))+', gaps=True)
    >>> toker.tokenize(s)
    ['He', 'said', 'that', 's', 'it', 'Hello', 'World']  # omits *u* per your third requirement
    

    这应该满足您上面指定的所有三个条件。但是请注意,该令牌生成器不会返回令牌"A"。此外,我仅对以标点符号开头
    结尾的单个字母进行标记。否则,“开始”。不会返回令牌。您可能需要以其他方式细化正则表达式,具体取决于数据的外观和期望。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看