2017-11-11 2 views
0

Ich erstelle einen invertierten Index von Textdateien, die lokal mit verschachtelten Wörterbüchern gespeichert sind. Eine abstrakte Struktur des invertierten Index ist darunter (die Werte sind ganze Zahlen). In jedem Wort ist der Wert von Schlüssel '0' der IDF und der Wert von Schlüssel '1' ist der Tf.TypeError: List-Indizes müssen Ganzzahlen oder Slices sein, nicht Str bei verschachtelten Wörterbüchern

inverted_index={'word1':{'0':idf_value, '1': 2 , 'filename1': frequency_value, 'filename2': frequency_value},'word2':{'0':idf_value, '1': 2, 'filename1': frequency_value, 'filename2': frequency_value}} 

Und das ist der Code:

import textract, math, os 
docs=[] 
#Read the files and store them in docs 
folder = os.listdir("./input/") 
for file in folder: 
    if file.endswith("txt"): 
     docs.append ([file,textract.process("./input/"+file)]) 

inverted_index={} 
for doc in docs: 
    words=doc[1].decode() 
    words=words.split(" ") 

    #loop through and build the inverted index 
    for word in words: 
     temp={} 
     #to remove initial white space 
     if (word == " ") or (word==""): 
      continue 
     if word not in inverted_index: 
      temp[doc[0]]=1 
      temp['0']=0 #idf 
      temp['1']=1 #tf 
      inverted_index[word]=temp 
     else: 
      if doc[0] not in inverted_index[word].keys(): 
       inverted_index[word][doc[0]]=1 
       inverted_index[word]['1']=inverted_index[word]['1']+1 
      else: 
       inverted_index[word][doc[0]]=inverted_index[word][doc[0]]+1 

# to sort and print values with calculating the the tf and idf on the fly 
for key, value in sorted(inverted_index.items()): # to sort words alphabitically 
    inverted_index[key]=sorted(inverted_index[key]) # to sort the filenames where the word occured. 
    inverted_index[key]['0']=math.log2(len(docs)/value['1']) # the error in this line 
    print(key, value) 

aber ich habe diesen Fehler in der vorletzten Zeile:


Traceback (most recent call last): 
    File "aaaa.py", line 34, in <module> 
    inverted_index[key]['0']=math.log2(len(docs)/value['1']) 
TypeError: list indices must be integers or slices, not str 

Können Sie mir bitte helfen beheben dieser Fehler. Danke

+0

Bitte schreiben Sie die volle 'Traceback' – ksai

+0

Sind die Werte der inverted_index Listen? Wenn ja, könnte inverted_index [key] ['1'] das Problem sein. Versuchen Sie, die Indizes in dieser Zeile von '1' nach 1 und '0' nach 0 zu ändern, ohne die Anführungszeichen. Im Wesentlichen besagt der Fehler, dass wenn Sie eine Liste 'a = [1, 2, 3]' haben, können Sie auf Elemente der Liste zugreifen, indem Sie 'a [0]' und nicht 'a ['0' ] '. Zeichenindizes sind nicht erlaubt. –

+0

Ich kenne den Inhalt von 'inverted_index' nicht, aber nach einem Fehler try Ändern von' value ['1'] 'in' value [1] 'in der letzten zweiten Zeile. – ksai

Antwort

0

Der Fehler kommen aus inverted_index[key]['0'] seit inverted_index[key] = sorted(inverted_index[key]) eine Liste Ihrer inneren dict Schlüssel erstellt, und Ihre

print(inverted_index[key]) 
# becomes ['0', '1', 'filename1', 'filename2'] 

Und so löst die Typeerror, da Sie nicht String-Indizierung auf eine Liste tun.

Damit Sie jedes Wort ändern [ '0'] Wert Ihrer inneren dict können Sie diesen Code versuchen:

for key, value in sorted(inverted_index.items()): 
    inverted_index[key] = sorted(inverted_index[key]) 
    current_word_key = inverted_index[key][0] 
    value['0'] = 'some_value' 
    inverted_index[key] = value 

print(inverted_index) 

DEMO

+0

Ihr Code zeigt nur die Liste der Schlüssel für jedes Wort zum Beispiel: 'Ärger': ['0', '1', 'y10.txt'] sollte es 'Ärger' sein: {'0': 0 , '1': 1, 'y10.txt': 1} – fsfr23

+0

alles, was ich getan habe, ist nur darauf hinweisen, was mit diesem Code falsch ist, alles was Sie brauchen, ist Wert wieder zu seinem dict wieder zuweisen suchen Sie nach meinem Update –

0

Dies funktioniert für mich

for key, value in sorted(inverted_index.items()): 
    inverted_index[key]=sorted(inverted_index[key]) 
    value['0']=math.log2(len(docs)/value['1']) # the error in this line 
    inverted_index[key]=value 
    print(key, value) 
+0

was ? Haha du hast meine Antwort einfach kopiert und selbst gepostet? –

+0

Nein, ich habe es nicht kopiert und Sie müssen es bereits aktualisiert haben. Wie auch immer, es ist keine große Sache, ich werde deine Antwort akzeptieren – fsfr23

Verwandte Themen