Преобразование предложений в файле в токены слов в списке - PullRequest
3 голосов
/ 28 ноября 2011

Я использую 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 ]

4 голосов
/ 28 ноября 2011

Просто используйте вложенный цикл внутри списка понимания:

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

Есть несколько альтернатив этому подходу, например, использование itertools.chain.from_iterable(), но я думаю, что вложенный цикл намного проще в этом случае.

1 голос
/ 28 ноября 2011

Просто прочитайте весь файл в память как одну строку и примените split один раз к строке.В таком случае нет необходимости читать файл построчно.

Поэтому ваше ядро ​​может быть коротким, как:

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

(Некоторые тонкости, такие как закрытие файла, проверкадля ошибок поверните код немного больше, конечно)

Поскольку вы хотите считать частоты слов, вы можете использовать для этого класс collection.Counter:

from collections import Counter
counter = Counter()
for word in open("music.txt").read().split():
    counter[word] += 1
0 голосов
/ 28 ноября 2011

Список пониманий может выполнять эту работу, но накапливает все в памяти.Для больших входов это может быть неприемлемой стоимостью.Приведенное ниже решение не будет накапливать большие объемы данных в памяти даже для больших файлов.Конечный продукт представляет собой словарь вида {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
...