dicionário compartilhado entre objetos sem motivo?
O seguinte código deve criar uma nova versão (modificada) de uma distribuição de frequência (nltk.FreqDist). Ambas as variáveis devem ter o mesmo comprimento.
Ele funciona bem quando uma única instância do WebText é criada. Mas quando várias instâncias do WebText são criadas, a nova variável parece ser compartilhada por todos os objetos.
Por exemplo:
import nltk
from operator import itemgetter
class WebText:
freq_dist_weighted = {}
def __init__(self, text):
tokens = nltk.wordpunct_tokenize(text) #tokenize
word_count = len(tokens)
freq_dist = nltk.FreqDist(tokens)
for word,frequency in freq_dist.iteritems():
self.freq_dist_weighted[word] = frequency/word_count*frequency
print len(freq_dist), len(self.freq_dist_weighted)
text1 = WebText("this is a test")
text2 = WebText("this is another test")
text3 = WebText("a final sentence")
resulta em
4 4
4 5
3 7
Qual é incorreto Como estou apenas transpondo e modificando valores, deve haver os mesmos números em cada coluna. Se eu redefinir o freq_dist_weighted pouco antes do loop, ele funciona bem:
import nltk
from operator import itemgetter
class WebText:
freq_dist_weighted = {}
def __init__(self, text):
tokens = nltk.wordpunct_tokenize(text) #tokenize
word_count = len(tokens)
freq_dist = nltk.FreqDist(tokens)
self.freq_dist_weighted = {}
for word,frequency in freq_dist.iteritems():
self.freq_dist_weighted[word] = frequency/word_count*frequency
print len(freq_dist), len(self.freq_dist_weighted)
text1 = WebText("this is a test")
text2 = WebText("this is another test")
text3 = WebText("a final sentence")
resulta em (correto):
4 4
4 4
3 3
Isso não faz sentido para mim.
Eu não vejo porque eu teria que redefini-lo, já que está isolado dentro dos objetos. Estou fazendo algo errado?