2

我正在使用 Python 2.7.4

我拼凑了一个程序,它将读取 .txt 文件,分隔单词,删除空格和标点符号,将大写字母转换为小写,并返回 x 最常见的单词,以及这些单词出现的次数文件。我正在尝试(但未能)做的是从输出中排除某些最常见的单词(即“a”、“i”、“to”、“for”等)。

我是初学者,所以我可能只是误解了对某些已经回答(并且我无法利用)的问题的回答,例如:

如何从字符串列表中删除单词列表

从 python 列表中删除字符串中所有出现的单词

我试图将不同的方面分成不同的功能,希望能简化事情,尽管我怀疑我实际上可能过于复杂了。我的程序如下:

import string

from collections import Counter

def wordlist(line):
    wordlist2 = []
    wordlist1 = line.split()
    for word in wordlist1:
        cleanword = ""
        for char in word:
            if char in string.punctuation:
                char = ""
            if char in string.whitespace:
                char = ""
            cleanword += char
        wordlist2.append(cleanword)
    return wordlist2

def wordcaps(line):
    line = [char.lower() for char in line]
    return line

def countwords(document): 
    words = Counter()
    words.update(document)
    x = words.most_common() 
    print x

def readfile(filename):
    fin = open(filename).read()
    print countwords(wordcaps(wordlist(fin)))

以下是我尝试过的一些事情。我试图创建一个列表 - 例如 filterlist = ['i', 'to', 'and'] - 并将其用作 wordlist 函数中的条件:

for word in wordlist1:
    if word in filterlist:
        word = ""

这似乎没有任何效果。我也试过了,没用:

for word in wordlist1:
    if word in filterlist:
        wordlist1.append("")

我已经尝试了很多其他的东西,但是无论如何这个问题似乎都太长了。我已经看到对“正则表达式”的引用,但我只是不确定那是什么或它如何适合。

4

2 回答 2

2

通常就足够了:

for word in wordlist1:
   if word.lower() not in filterlist:
        words.append(word)

words是包含有效单词的输出列表。

您的方法不起作用,因为您使用相同的列表来存储输入和输出列表wordlist1

for word in wordlist1:
    if word in filterlist:
        wordlist1.append("")

你也可以这样做:

wordlist1 = [word for word in wordslist1 if word not in filterlist]

它使用临时列表来存储有效单词,然后将它们分配回您的原始输入列表。

于 2013-10-19T21:08:35.063 回答
0

一次读取一个字符并检查要包含的字符而不是要排除的字符可能是最简单的。

一旦提取了候选词,就可以将其转换为小写,并针对要跳过的一组词进行测试。

这是一个可能的实现:

def parse(text, skip=()):
    text += '\n'
    words = []
    word = ''
    for char in text:
        if char.isalpha():
            word += char
        elif word:
            word = word.lower()
            if word not in skip:
                words.append(word)
            word = ''
    return words

(注意:在输入中附加一个换行符以确保正确处理最后一个单词)。

当然,使用正则表达式进行解析会更有效率

import re

def parse(text, skip=()):
    words = []
    for word in re.findall(r'\w+', text):
        word = word.lower()
        if word not in skip:
            words.append(word)
    return words

这是一个简单的脚本,它使用 parse 函数从输入文件中获取字数:

import sys
from collections import Counter

SKIP = set('a an and be i is of so the to'.split())

def main(args):
    try:
        with open(args[0]) as stream:
            words = parse(stream.read(), SKIP)
    except IndexError:
        print 'ERROR: no path given'
    except IOError as exception:
        print 'ERROR: could not read file:'
        print '  :', exception
    else:
        counter = Counter(words)
        print counter.most_common()

if __name__ == '__main__':

    main(sys.argv[1:])
于 2013-10-20T01:37:57.443 回答