如何使用Python(和islice)计算txt文件中每章的单词?

时间:2016-12-19 12:57:46

标签: python nlp itertools counting word-frequency

作为一个研究案例,我有一部文学小说,由三个主要人物组成,每个人物都有自己的小说章节。即:第一章是角色X(Aaron),第二章是角色Y(Sigerius),第三章是角色Z(Joni),第四章是角色X,第五章是角色Y,第六章是角色Z, ......等等......我想计算所有章节中用于字符X,字符Y和字符Z的单词数量。

这是我目前正在处理的关于一个特定角色(Aaron)章节的Python代码:

from itertools import islice

with open(textfile, 'rt', encoding='utf-8') as f:
    # Computes the total word count of the file
    text = f.read()
    words = text.split()
    wordCount = len(words)
    print ("The total word count is:", wordCount)


    # Aaron's chapters

    chapterAaron1 = islice(f, 0, 123)
    chapterAaron4 = islice(f, 223 ,326)
    chapterAaron6 = islice(f, 639, 772)
    chapterAaron10 = islice(f, 1125, 1249)
    chapterAaron12 = islice(f, 1370, 1455)
    chapterAaron15 = islice(f, 1657, 1717)
    chapterAaron19 = islice(f, 2088, 2138)
    chaptersAaron = (chapterAaron1, chapterAaron4, chapterAaron6,    chapterAaron10,  chapterAaron12, chapterAaron12, chapterAaron15, chapterAaron19)

    # Computes the total word count of Aaron's chapters (does not work)

    wordsAaron = chaptersAaron.split()
    wordCountAaron = len(wordsAaron)
    print ("The total word count of Aaron's chapters is:", wordCountAaron)

我已经手动决定了txt文件的哪些行,不同的章节(每个字符)开始和结束。我使用islice将txt文件拆分为特定的章节(包含在特定的行号之间),以便计算这些行号(即章节)之间包含的单词数量。但是,我似乎没有找到一种方法来以正确的方式为此目的操作islice。我得到了这个AttributeError:' tuple'对象没有属性' split'。我想要的是将一个特定字符的所有章节存储在一个变量中(例如chaptersAaron),这样我就可以用它做任何事情,例如计算单词总数并搜索其中特定单词的出现次数。

  • 有没有人对我的目的正确使用islice有任何建议?将文本分成章节的备选方案也非常受欢迎。

1 个答案:

答案 0 :(得分:1)

解决方案应该是:

chaptersAaron=[]
chapterAaron1 = [elem for elem in islice(f, 0, 123)]
chaptersAaron+=chapterAaron1
chapterAaron4 = [elem for elem in islice(f, 223 ,326)]
chaptersAaron+=chapterAaron4
chapterAaron6 = [elem for elem in islice(f, 639, 772)]
chaptersAaron+=chapterAaron6
chapterAaron10 = [elem for elem in islice(f, 1125, 1249)]
chaptersAaron+=chapterAaron10
chapterAaron12 = [elem for elem in islice(f, 1370, 1455)]
chaptersAaron+=chapterAaron12
chapterAaron15 = [elem for elem in islice(f, 1657, 1717)]
chaptersAaron+=chapterAaron15
chapterAaron19 = [elem for elem in islice(f, 2088, 2138)]
chaptersAaron+=chapterAaron19

你的代码示例的问题是,你混合了迭代器,列表和tupels。 islice(f, 1125, 1249)是一个迭代器 chaptersAaron =(chapterAaron1,...)是一个tupel 并且你想将它们用作列表

我的解决方案中的想法是从空列表chaptersAaron=[]开始。 按[elem for elem in islice(f, 0, 123)]将所有迭代器转换为列表,并使用chaptersAaron+=chapterAaron1

连接列表