【问题标题】:tokenize words, delete punctuaction using nltk标记单词,使用 nltk 删除标点符号
【发布时间】:2019-03-12 20:27:29
【问题描述】:

这是我如何为我的语言(西班牙语)标记短语的示例。

texto= "esto es un texto, para el sr. gómez. Esto; es una prueba que puedes encontrar en www.google.com quisiera encontrarla.. claro esta,.Quisiera mejorarlo"

当我使用 nltk 标记我的短语时,这是输出:

['esto', 'es', 'un', 'texto', ',', 'para', 'el', 'sr.', 'gómez', '.', 'Esto', ';', 'es', 'una', 'prueba', 'que', 'puedes', 'encontrar', 'en', 'www.google.com','quiero','encontarla..','esta,.', 'quisiera','mejoralo']

除了sr.www.google.com 等有效分数外,我怎样才能消除标点符号

from nltk.tokenize import word_tokenize
texto= "esto es un texto, para el sr. gómez. Esto; es una prueba que puedes encontrar en www.google.com quisiera encontrarla.."
palabras_tokenizadas=(word_tokenize(texto,"spanish"))
print(palabras_tokenizadas)

这应该是结果:

['esto', 'es', 'un', 'texto',  'para', 'el', 'sr.', 'gómez',  'Esto',  'es', 'una', 'prueba', 'que', 'puedes', 'encontrar', 'en', 'www.google.com', 'quisiera', 'encontrarla', 'claro', 'esta', 'quisiera', 'mejorarlo']

我尝试过这样的事情,但它并没有解决我的问题(像"encontarla..""esta,." 这样的字眼的问题

punctuation = [",", ";", ".",...............] # The tokens that I want to skip
palabras_tokenizadas_1 = [ palabra for palabra in palabras_tokenizadas if palabra not in punctuation ]

我想用最好的方法在任何有分数的句子中全局解决我的问题,而不仅仅是解决这个句子的问题。怎么办?

【问题讨论】:

  • 数字应该包含还是排除?以'1995' 为例。
  • 包括在内,我认为

标签: python


【解决方案1】:

您可以轻松地使用标点符号列表:

punctuation = [",", ";", "."] # The tokens that you want to skip
palabras_tokenizadas2 = [ palabra for palabra in palabras_tokenizadas1 if palabra not in punctuation ]

输出:

['esto', 'es', 'un', 'texto', 'para', 'el', 'sr.', 'gómez', 'Esto', 'es', 'una', 'prueba', 'que', 'puedes', 'encontrar', 'en', 'www.google.com']

对于所有标点符号,您可以检查 string.punctuation 并像这样使用:

import string
punctuation = list(string.punctuation)

输出:

['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~']

【讨论】:

  • 这并不能解决我的问题。在“www.google.com”和“sr”的情况下。将消除标点符号
  • @unusuario 不应该。如果简单标记化的输出是您在开头发布的内容,则此方法不会删除“。”来自“sr”或“www.google.com”。那是因为您是在比较单词而不是字符级别。
  • 哦,你是对的,我认为图书馆会有更聪明的方法来获取它。对不起
  • 感谢您的帮助,但是这对最后一个字不起作用,请查看输出。
  • @unusuario 这不是您在问题中暴露的问题。句子有错误,分词器无法处理。我的解决方案无法解决这个问题,因为这是另一个完全不同的问题。
【解决方案2】:

你可以使用:

res = [tkn for tkn in tkn_lst if tkn.lower().islower() or any(chr.isdigit() for chr in tkn)]

它们要求每个标记都包含一些字母数字部分,但如果我使用它,我会通过辅助函数使其更具可读性:

def has_alphanum(token):
    return token.lower().islower() or any(character.isdigit() for character in token)

res = [token for token in palabras_tokenizadas1 if has_alphanum(token)]

【讨论】:

  • 对不起,我不知道如何使用你的代码,当我去实现它时遇到了问题。 s="esto es un texto, para el sr. gómez. Esto; es una prueba que puedes encontrar en www.google.com quisiera encontrarla.." 请看输出。谢谢
  • @unusuario 输入应该是palabras_tokenizadas1(令牌列表),而不是字符串。
  • def has_alphanum(str): return token.lower().islower() or any(character.isdigit() for character in token) palabras_tokenizadas=['esto', 'es', 'un '、'texto'、','、'para'、'el'、'sr.'、'gómez'、'.'、'Esto'、';'、'es'、'una'、'prueba' , 'que', 'puedes', 'encontrar', 'en', 'www.google.com','quiero','encontarla..'] res = [token for token in palabras_tokenizadas if has_alphanum(token)] this不适用于我...islower() 或 any(character.isdigit() for character in token) TypeError: 'int' object is not callable) 这适用于我的最后一句话吗?我已经更新了问题,以便您理解
  • @unusuario 不知道为什么它会给你一个例外。它works on repl.it.
  • 哦...请看终极词
猜你喜欢
  • 2021-12-18
  • 2013-03-10
  • 2020-11-06
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
相关资源
最近更新 更多