如何删除标点符号?
nlp
nltk
python
6
0

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

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

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

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

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

解决方案1:令牌化和删除标点符号

>>> from nltk import word_tokenize
>>> import string
>>> punctuations = list(string.punctuation)
>>> punctuations
['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~']
>>> punctuations.append("''")
>>> sent = '''He said,"that's it."'''
>>> word_tokenize(sent)
['He', 'said', ',', "''", 'that', "'s", 'it', '.', "''"]
>>> [i for i in word_tokenize(sent) if i not in punctuations]
['He', 'said', 'that', "'s", 'it']
>>> [i.strip("".join(punctuations)) for i in word_tokenize(sent) if i not in punctuations]
['He', 'said', 'that', 's', 'it']

解决方案2:删除标点符号然后标记化

>>> import string
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> sent = '''He said,"that's it."'''
>>> " ".join("".join([" " if ch in string.punctuation else ch for ch in sent]).split())
'He said that s it'
>>> " ".join("".join([" " if ch in string.punctuation else ch for ch in sent]).split()).split()
['He', 'said', 'that', 's', 'it']
收藏
评论

如果您想一次性对字符串进行标记化,我认为您唯一的选择是使用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"标记。此外,我只对以标点符号开头结尾的单个字母进行标记。否则,“开始”。不会返回令牌。您可能需要以其他方式细化正则表达式,具体取决于数据的外观和期望。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号