Надеюсь, вы не возражаете, я позволил себе изменить ваш код до того, что я, скорее всего, напишу.
from itertools import izip
def filetxt():
# keeps track of word count for each word.
word_freq = {}
# list of words which we've found
word_list = []
# mapping from word -> index in word_list
word_map = {}
lvl1 = []
lvl2 = []
total_t = 0
users = 0
text = []
####### You should replace this with a glob (see: glob module)
for l in range(0,500):
# Open File
try:
with open("C:/Twitter/json/user_" + str(l) + ".json", "r") as f:
text_f = json.load(f)
users = users + 1
# in this file there are multiple tweets so add the text
# for each one.
for t in text_f.itervalues():
text.append(t) ## CHECK THIS
except IOError:
pass
total_t = len(text)
# Filter
occ = 0
import string
for s in text:
a = re.findall(r'(RT)',s)
b = re.findall(r'(@)',s)
occ += len(a) + len(b)
s = s.encode('utf-8')
out = s.translate(string.maketrans("",""), string.punctuation)
# make a list of words that are in the text s
words = s.lower().split(None)
for word in word_list:
# try/except is quicker when we expect not to miss
# and it will be rare for us not to have
# a word in our list already.
try:
word_freq[word] += 1
except KeyError:
# we've never seen this word before so add it to our list
word_freq[word] = 1
word_map[word] = len(word_list)
word_list.append(word)
# little trick to get each word and the word that follows
for curword, nextword in zip(words, words[1:]):
lvl1.append(word_map[curword])
lvl2.append(word_map[nextword])
Что собирается сделать, это дать вам следующее. lvl1 выдаст вам список чисел, соответствующих словам в word_list
. поэтому word_list[lvl1[0]]
будет первым словом в первом твите, который вы обработали. lvl2[0]
будет индексом слова, следующего за lvl1[0]
, так что вы можете сказать, world_list[lvl2[0]]
- это слово, которое follows word_list[lvl1[0]]
. Этот код в основном поддерживает word_map
, word_list
и word_freq
при его создании.
Обратите внимание, что способ, которым вы делали это раньше, в частности способ, которым вы создавали W2N
, будет , а не , работать должным образом. Словари не поддерживают порядок. Заказанные словари появятся в 3.1, но пока забудем об этом. В основном, когда вы делали word_freq.keys()
, оно менялось каждый раз, когда вы добавляли новое слово, поэтому не было последовательности. Посмотрите этот пример,
>>> x = dict()
>>> x[5] = 2
>>> x
{5: 2}
>>> x[1] = 24
>>> x
{1: 24, 5: 2}
>>> x[10] = 14
>>> x
{1: 24, 10: 14, 5: 2}
>>>
Итак, 5 раньше было вторым, а теперь третьим.
Я также обновил его, чтобы использовать индекс 0 вместо 1 индекса. Я не знаю, почему вы использовали range(1, len(...)+1)
, а не просто range(len(...))
.
В любом случае, вам не следует думать о циклах for
в традиционном смысле C / C ++ / Java, где вы делаете циклы над числами. Вам следует учитывать, что если вам не нужен индексный номер, он вам не нужен.
Полезное правило: если вам нужен индекс, вам, вероятно, нужен элемент с этим индексом, и вы все равно должны использовать enumerate
. LINK
Надеюсь, это поможет ...