使用 string.punctuation 删除字符串标点符号时出错
Error when using string.punctuation to remove punctuation for a string
快速提问:
我正在使用 string
和 nltk.stopwords
去除文本块中的所有标点符号和停用词,作为数据预处理的一部分,然后再将其输入某些自然语言处理算法。
我已经在几个原始文本块上分别测试了每个组件,因为我还在习惯这个过程,而且看起来还不错。
def text_process(text):
"""
Takes in string of text, and does following operations:
1. Removes punctuation.
2. Removes stopwords.
3. Returns a list of cleaned "tokenized" text.
"""
nopunc = [char for char in text.lower() if char not in string.punctuation]
nopunc = ''.join(nopunc)
return [word for word in nopunc.split() if word not in
stopwords.words('english')]
然而,当我将这个函数应用于我的数据框的文本列时——它是来自一堆 Pitchfork 评论的文本——我可以看到标点符号实际上并没有被删除,尽管停用词被删除了。
未处理:
pitchfork['content'].head(5)
0 “Trip-hop” eventually became a ’90s punchline,...
1 Eight years, five albums, and two EPs in, the ...
2 Minneapolis’ Uranium Club seem to revel in bei...
3 Minneapolis’ Uranium Club seem to revel in bei...
4 Kleenex began with a crash. It transpired one ...
Name: content, dtype: object
已处理:
pitchfork['content'].head(5).apply(text_process)
0 [“triphop”, eventually, became, ’90s, punchlin...
1 [eight, years, five, albums, two, eps, new, yo...
2 [minneapolis’, uranium, club, seem, revel, agg...
3 [minneapolis’, uranium, club, seem, revel, agg...
4 [kleenex, began, crash, it, transpired, one, n...
Name: content, dtype: object
想知道这里出了什么问题吗?我浏览了文档,但没有看到任何人以完全相同的方式解决这个问题,所以我很想知道如何解决这个问题。非常感谢!
这里的问题是utf-8对左引号和右引号(单引号和双引号)的编码不同,而不仅仅是string.punctuation
中包含的正引号。
我会做类似
punctuation = [ c for c in string.punctuation ] + [u'\u201c',u'\u201d',u'\u2018',u'\u2019']
nopunc = [ char for char in text.decode('utf-8').lower() if char not in punctuation ]
这会将非 ascii 引号的 utf-8 值添加到名为 punctuation
的列表中,然后将文本解码为 utf-8
,并替换这些值。
注意:这是 python2,如果您使用 python3,utf 值的格式可能会略有不同
快速提问:
我正在使用 string
和 nltk.stopwords
去除文本块中的所有标点符号和停用词,作为数据预处理的一部分,然后再将其输入某些自然语言处理算法。
我已经在几个原始文本块上分别测试了每个组件,因为我还在习惯这个过程,而且看起来还不错。
def text_process(text):
"""
Takes in string of text, and does following operations:
1. Removes punctuation.
2. Removes stopwords.
3. Returns a list of cleaned "tokenized" text.
"""
nopunc = [char for char in text.lower() if char not in string.punctuation]
nopunc = ''.join(nopunc)
return [word for word in nopunc.split() if word not in
stopwords.words('english')]
然而,当我将这个函数应用于我的数据框的文本列时——它是来自一堆 Pitchfork 评论的文本——我可以看到标点符号实际上并没有被删除,尽管停用词被删除了。
未处理:
pitchfork['content'].head(5)
0 “Trip-hop” eventually became a ’90s punchline,...
1 Eight years, five albums, and two EPs in, the ...
2 Minneapolis’ Uranium Club seem to revel in bei...
3 Minneapolis’ Uranium Club seem to revel in bei...
4 Kleenex began with a crash. It transpired one ...
Name: content, dtype: object
已处理:
pitchfork['content'].head(5).apply(text_process)
0 [“triphop”, eventually, became, ’90s, punchlin...
1 [eight, years, five, albums, two, eps, new, yo...
2 [minneapolis’, uranium, club, seem, revel, agg...
3 [minneapolis’, uranium, club, seem, revel, agg...
4 [kleenex, began, crash, it, transpired, one, n...
Name: content, dtype: object
想知道这里出了什么问题吗?我浏览了文档,但没有看到任何人以完全相同的方式解决这个问题,所以我很想知道如何解决这个问题。非常感谢!
这里的问题是utf-8对左引号和右引号(单引号和双引号)的编码不同,而不仅仅是string.punctuation
中包含的正引号。
我会做类似
punctuation = [ c for c in string.punctuation ] + [u'\u201c',u'\u201d',u'\u2018',u'\u2019']
nopunc = [ char for char in text.decode('utf-8').lower() if char not in punctuation ]
这会将非 ascii 引号的 utf-8 值添加到名为 punctuation
的列表中,然后将文本解码为 utf-8
,并替换这些值。
注意:这是 python2,如果您使用 python3,utf 值的格式可能会略有不同