2016-04-16 8 views
0

Ich habe ein Problem mit dem Erstellen Zyklus mit dict. Ich habe ein Wörterbuch: Die Schlüssel sind eindeutige Zahlen, und die Werte sind Wörter. Ich muss eine Matrix erstellen: Zeilen sind Zahlen der Sätze, und Spalten sind die eindeutigen Zahlen für Wörter (aus dem Diktat). Das Element der Matrix zeigt die Anzahl jedes Wortes in jedem Satz an. Dies ist mein Code für das Erstellen des Diktats. (Am Anfang hatte ich eine rohe Textdatei mit Sätzen)Python Zyklus durch Diktat

with open ('sentences.txt', 'r') as file_obj: 
    lines=[] 
    for line in file_obj: 
     line_split=re.split('[^a-z]',line.lower().strip() 
     j=0 
     new_line=[] 
     while j<=len(line_split)-1: 
      if (line_split[j]): 
       new_line.append(line_split[j]) 
      j+=1    
     lines.append(new_line)  
    vocab = {} 
    k = 1 
    for i in range(len(lines)): 
     for j in range(len(lines[i])): 
      if lines[i][j] not in vocab.values(): 
       vocab[k]=lines[i][j] 
       k+=1 

import numpy as np //now I am trying to create a matrix 
matr = np.array(np.zeros((len(lines),len(vocab)))) 
m=0 
l=0 
while l<22: 
    for f in range (len(lines[l])): 
     if vocab[1]==lines[l][f]: //this works only for the 1 word in dict 
      matr[l][0]+=1 
    l+=1 
print(matr[3][0]) 

matr = np.array(np.zeros((len(lines),len(vocab)))) // this also works 
for values in range (len(vocab)): 
    for line in lines: 
     a=line.count(vocab[1]) 
     print(a) 

Aber wenn ich versuche, einen Zyklus zu machen durch die dict zu gehen, nichts funktioniert! Kannst du mir bitte sagen, wie ich die ganze Matrix füllen kann? Vielen Dank im Voraus!

+0

Es klingt sicher, als würden Sie Ihr Wörterbuch rückwärts entwerfen. Wenn Sie auf die Zahlen zugreifen müssen, indem Sie das Wort nachschlagen, sollten die Wörter die Schlüssel und die Zahlen die Werte sein. – Blckknght

+0

Können Sie uns ein Beispiel dafür geben, was Sie erreichen möchten? –

+0

Natürlich @Blckknght ist richtig, aber ich sehe viel mehr Redundanz beim Aufbau des Wörterbuchs. Warum teilen Sie jede Zeile auf und fügen Sie sie dann wieder hinzu (?), Um den gesamten Inhalt zu durchlaufen, wenn Sie die Wörter aus der Zeile 'split' sofort hinzufügen können? Ist "Vocab" nicht auch eine globale Variable? – usr2564301

Antwort

0

Einige unvorsichtige Fehler: Zeile 7 benötigt eine schließende Klammer, // ist keine Python-Syntax.

Mit Blick auf Ihren Code Ich habe keine Ahnung, was Ihr allgemeiner Algorithmus ist, um nur ein einfaches Wortzählwörterbuch zu erstellen. Also schlage ich vor, diese viele kürzeren Code:

import re 
import sys 

def get_vocabulary (filename): 
    vocab_dict = {} 

    with open (filename, 'r') as file_obj: 
    for line in file_obj: 
     for word in re.findall(r'[a-z]+',line.lower()): 
     if word in vocab_dict: # see below for an interesting alternative 
      vocab_dict[word] += 1 
     else: 
      vocab_dict[word] = 1 
    return vocab_dict 

if len(sys.argv) > 1: 
    vocab = get_vocabulary (sys.argv[1]) 
    for word in vocab: 
    print (word, '->', str(vocab[word])) 

Hinweis I ersetzt Ihre eigene

line_split=re.split('[^a-z]',line.lower().strip()) 

mit der Rückseite

re.findall(r'[a-z]+',line.lower()) 

weil Ihre leere Elemente zurückkehren kann, und meine nicht. Ursprünglich musste ich einen Test if word: hinzufügen, bevor ich es in das Wörterbuch einfügte, um zu verhindern, dass viel Leergut hinzugefügt wurde. Mit einer besseren Überprüfung auf "Wort" ist das nicht mehr nötig.

(Fun mit Python: Die Alternative für ein if..else sieht aus wie diese einzelne Zeile:

vocab_dict[word] = 1 if word not in vocab_dict else vocab_dict[word]+1 

Es ist etwas weniger effizient, weil vocab_dict[word] zweimal abgerufen werden muss - nicht .. + 1 auf seinem eigenen sagen kann. Dennoch ist es eine nette Zeile zu lesen.)

das Wörterbuch auf eine ‚Matrix‘ (eigentlich ein einfaches Array genügt) gemacht, mit einem bit of help werden kann konvertieren, mit

matrix = [[vocab[word], word] for word in sorted(vocab)] 
for row in matrix: 
    print (row) 
+0

Vielen Dank für Ihre Antwort! Die Informationen sind wirklich hilfreich. Ich könnte mein Problem lösen, aber nicht auf die beste Weise, ich habe gerade ein Array aus den Werten von meinem dict erstellt (val = list (vocab.Werte())) und ich habe die Matrix erhalten, die ich brauchte, indem ich +1 zum Matrixelement addierte (wenn val [p] == Zeilen [r] [h]: matr [r] [p] + = 1) –

Verwandte Themen