读取文件时排除单词列表

时间:2013-10-19 21:04:55

标签: python regex list

我正在使用Python 2.7.4

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

我是初学者,因此我可能只是误解了对已经回答的某些问题(我无法使用)的回答,例如:

How to remove list of words from a list of strings

Remove all occurrences of words in a string from a python list

我试图将不同的方面分成不同的功能以希望简化事情,但我怀疑我实际上可能过于复杂。我的计划如下:

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','和'] - 并将其用作wordlist函数中的条件:

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

这似乎没有任何效果。我也试过,但无济于事:

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

我尝试了很多其他的东西,但这个问题似乎在任何情况下都会变得太长。我看过“正则表达式”的引用,但我不确定它是什么或它是如何适应的。

2 个答案:

答案 0 :(得分:1)

通常就足够了:

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

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

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

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

您也可以这样做:

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

使用 temporany 列表存储有效字词,然后将它们分配回原始输入列表。

答案 1 :(得分: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

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

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:])