从TXT文件中删除标点和大写字母

0 投票
2 回答
8048 浏览
提问于 2025-04-17 19:03

我在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) 得到的。你可以参考一下 filtermap。至于正则表达式的部分,你可以看看 re

撰写回答