0

我在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()

它应该导入一个txt文件,将其拆分为单词,然后删除标点符号并将所有转换为小写。应该不难吧?它只是原封不动地返回标点符号和大写字母。没有错误信息,它似乎只是忽略了部分代码。

任何帮助将非常感激。

4

2 回答 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']

于 2013-03-14T06:35:47.507 回答
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]给出了一个由 FUNC(x) 构造的列表,其中 x 是当 COND 为真时来自 LIST 的元素。您可以参考filtermap。对于正则表达式部分,您可以查看re

于 2013-03-14T06:48:14.803 回答