将文件中的句子转换为列表中的单词标记

时间:2011-11-28 19:36:45

标签: python file list-comprehension

我正在使用python将文本文件中的句子中的单词转换为列表中的单个标记,以便计算单词频率。我无法将不同的句子转换成单个列表。这是我的所作所为:

f = open('music.txt', 'r')
sent = [word.lower().split() for word in f]

这给了我以下列表:

[['party', 'rock', 'is', 'in', 'the', 'house', 'tonight'],
 ['everybody', 'just', 'have', 'a', 'good', 'time'],...]

由于文件中的句子是分开的行,因此返回此列表列表,而defaultdict无法识别要计数的各个令牌。

尝试使用以下列表解析来隔离不同列表中的标记并将它们返回到单个列表,但它返回一个空列表:

sent2 = [[w for w in word] for word in sent]

有没有办法使用列表推导来做到这一点?或者也许是另一种更简单的方式?

3 个答案:

答案 0 :(得分:4)

只需在列表解析中使用嵌套循环:

sent = [word for line in f for word in line.lower().split()]

这种方法有一些替代方法,例如使用itertools.chain.from_iterable(),但我认为在这种情况下嵌套循环更容易。

答案 1 :(得分:1)

只需将整个文件读取到内存中,单个字符串,然后将一个字符串应用split。 在这种情况下,无需逐行读取文件。

因此,您的核心可以简短:

sent = open("music.txt").read().split()

(关闭文件,检查错误,当然把代码变大一些细节)

由于您想要计算单词频率,您可以使用collections.Counter类:

from collections import Counter
counter = Counter()
for word in open("music.txt").read().split():
    counter[word] += 1

答案 2 :(得分:0)

列表推导可以完成这项工作,但会将所有内容累积在内存中。对于大型投入,这可能是不可接受的成本。以下解决方案不会在内存中累积大量数据,即使对于大文件也是如此。最终产品是{token: occurrences}形式的字典。

import itertools

def distinct_tokens(filename):
  tokendict = {}
  f = open(filename, 'r')
  tokens = itertools.imap(lambda L: iter(L.lower.split()), f)
  for tok in itertools.chain.from_iterable(tokens):
    if tok in tokendict:
      tokendict[tok] += 1
    else:
      tokendict[tok] = 1
  f.close()
  return tokendict