从TXT文件中删除标点和大写字母
我在Python里遇到了一个小问题。
我有一个脚本:
import nltk
def analyzer():
inputfile=raw_input("Which file?: ")
review=open(inputfile,'r')
review=review.read()
tokens=review.split()
for token in tokens:
if token in string.punctuation:
tokens.remove(token)
token=tokens.lower()
这个脚本应该是导入一个文本文件,把它分成单词,然后去掉标点符号并把所有字母转换成小写。听起来应该不难,对吧?但是它运行后,结果还是保留了标点符号和大写字母。没有错误提示,它似乎只是忽略了代码中的一部分。
如果能帮忙解决这个问题,我会非常感激。
2 个回答
2
我假设你已经导入了 string
模块。把这一行
if token in string.punctuation:
tokens.remove(token)
token=tokens.lower()
替换成
token = token.translate(None,string.punctuation).lower()
另外,在 Python 中,字符串是不可变的,这意味着给字符串赋值只是重新绑定了名字,并没有改变原来的内容。如果你想要改变内容,可以这样做:
tokens = [token.translate(None,string.punctuation).lower() for token in tokens]
我个人会把整个代码整理成这样:
def read_tokens(path):
import string
with open(path) as f:
tokens = f.read().split()
return [ token.translate(None, string.punctuation).lower() for token in tokens ]
read_tokens(raw_input("which file?"))
请注意,这只是忠实地反映了你最初的意图,这意味着像 'test.me'
这样的“单词”会变成 ['testme']
,而不是 ['test','me']
2
你的代码有几个问题:
首先,split()
这个函数不能把标点符号分开。
其次,如果你用 for token in tokens
这样的写法,token
其实是 tokens
中元素的一个拷贝,所以对 token
的修改不会影响到 tokens
。
你可以试试这个:
import string
import re
def analyzer():
inputfile=raw_input("Which file?: ")
review=open(inputfile,'r')
review=review.read()
tokens=[e.lower() for e in map(string.strip, re.split("(\W+)", review)) if len(e) > 0 and not re.match("\W",e)]
print tokens
analyzer()
这个模式 [FUNC(x) for x in LIST if COND]
会生成一个列表,这个列表是通过对 LIST
中符合 COND
条件的每个元素 x
应用 FUNC(x)
得到的。你可以参考一下 filter 和 map。至于正则表达式的部分,你可以看看 re。