哪里错了?计算python中不包括页眉和页脚的总单词数量?

时间:2017-07-30 19:35:53

标签: python python-3.x data-processing

这是我尝试阅读的文件,并计算此文件中的总字数test.txt

我为它写了一段代码:

def create_wordlist(filename, is_Gutenberg=True):
    words = 0
    wordList = []
    data = False
    regex = re.compile('[%s]' % re.escape(string.punctuation))
    file1 = open("temp",'w+')
    with open(filename, 'r') as file:
        if is_Gutenberg:
            for line in file:
                if line.startswith("*** START "):
                    data = True
                    continue
                if line.startswith("End of the Project Gutenberg EBook"):
                    #data = False
                    break
                if data:
                    line = line.strip().replace("-"," ")
                    line = line.replace("_"," ")
                    line = regex.sub("",line)
                    for word in line.split():
                        wordList.append(word.lower()) 
                    #print(wordList)
                    #words = words + len(wordList)

    return len(wordList)          
    #return wordList
create_wordlist('test.txt', True)

以下几条规则应遵循:         剥去空白和标点符号         2.用空格替换连字符         3.skip文件页眉和页脚。标题以" *** START OF THIS"开头的行开头。和页脚以"项目结束"。

开头
  

我的回答:60513,但实际答案是60570.这个答案来自于问题本身。这可能是对还是错。我做错了。

2 个答案:

答案 0 :(得分:1)

您为实际答案提供了一个数字 - 您认为正确的答案,您希望输出代码。

你没告诉我们你是怎么得到这个号码的。

在我看来,这两个数字来自" word"的不同定义。

例如,您在示例文本中有几个表单中的数字: 140,000,000

那是一个还是三个字?

您正在用空格替换连字符,因此带连字符的单词将被计为两个。你要删除的其他标点符号。这将使上述数字(以及您的文本中有其他类似的例子)成为一个单词。这是你的意图吗?这是为了让你的'#14;正确"数?我怀疑这是你的全部或部分差异。

快速浏览一下,我在上面的表格中看到三个数字(计为3或9,差异为6) 我看到127个撇号(像妻子这样的单词,可以算作一个或两个单词),相差127个。

你的差异是57,所以答案并不那么简单,但对于特定的角落案例,我仍然强烈怀疑对于什么是单词的不同定义。

顺便说一下,我不确定你为什么要将所有单词收集到一个巨大的列表然后获得长度。你可以跳过append循环并只累加len(line.split())之和。这样可以消除复杂性,从而减少错误的可能性(并且可能使程序更快,如果在这种情况下更重要的话)

另外,你有一句话:

                if line.startswith("*** START " in"):

当我在我的python解释器中尝试时,我收到语法错误。你确定你在这里发布的代码是你正在运行的吗?我原以为:

                if line.startswith("*** START "):

答案 1 :(得分:0)

如果没有显示此行为的示例文本文件,则很难猜出出现了什么问题。但有一条线索:您的号码比您预期的要少。这似乎意味着你以某种方式将单独的单词粘在一起,并将它们统计为一个单词。这种行为的明显候选者是语句line = regex.sub("",line):这将用空字符串替换任何标点符号。因此,如果文字包含that's,您的计划会将其更改为thats

如果这不是原因,您确实需要提供一小部分文本样本,以显示您获得的行为。

修改:如果您打算将标点符号视为单词分隔符,则应使用空格替换标点符号,因此:line = regex.sub(" ",line)