Hilfe bei Lexikon-Einbindung

Code-Stücke können hier veröffentlicht werden.
Antworten
Sonja
User
Beiträge: 5
Registriert: Sonntag 10. April 2016, 14:08

Hallo,
ich möchte gerne im Bereich der Sentiment Analyse auf ein selbst erstelltes Lexikon zugreifen. Bisher sieht der Inhalt davon so aus:

good, 1
bad, -2
boring, -1

Mein Code-Teil, um das Lexikon einzulesen ist der:

Code: Alles auswählen

sentiment_dic = {}
for line in open('Lexikon.txt'):
    word, score = line.split('\t')
    sentiment_dic[word] = int(score)
Leider bekomme ich aber immer diesen Fehler:

Traceback (most recent call last):
word, score = line.split('\t')
ValueError: need more than 1 value to unpack

Habt ihr eine Idee was ich falsch mache? Ich bin Python-Anfänger und wäre euch sehr dankbar für eure Hilfe :-)
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sonja: Schau doch mal an wie Dein Dein 'Lexikon.txt' aussieht. Die Spalten sind offensichtlich nicht Tab-getrennt.
Sonja
User
Beiträge: 5
Registriert: Sonntag 10. April 2016, 14:08

Vielen Dank, daran lag es :-)

Leider hat sich mittlerweile ein neuer Fehler ergeben..
ich möchte gerne, dass mir die positive und negativen Zahlen im Lexikon für jeden Satz zusammengerechnet werden und dann ausgegeben werden. Dafür habe ich folgenden Code-Teil:

Code: Alles auswählen

result = []
for satz in sent_tokenize(text):
    pos = 0
    neg = 0
    for word in word_tokenize(satz):
        score = Lexikon.get(word, 0)
        if score > 0:
            pos += score
            if score < 0:
                neg += score
                result.append([pos, neg])
for s in result: print(s)

print(result)
Ich hätte eigentlich solch ein Ergebnis erwartet: [3, -2] bekomme aber immer nur ein leeres Ergebnis: []. Die Wörter im Lexikon sind aber richtig beziffert.

Hat jemand eine Idee, was ich an diesem Code-Teil ändern könnte/müsste?

Vielen Dank für eure Hilfe :)
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sonja: überleg Dir mal, wann result.append aufgerufen wird, wann also die äußere if-Bedingung erfüllt ist und wann die innere.
Sonja
User
Beiträge: 5
Registriert: Sonntag 10. April 2016, 14:08

Danke für deinen Tipp, ich habe den Code jetzt ein paar mal umgestellt aber das Ergebnis bleibt leer.. ich habe versucht die beiden for-Schleifen miteinander zu verbinden, sodass append auf beide angewendet wird, aber das klappt nicht. Sorry, ich bin wirklich noch nicht lange dabei, könntest du mir sagen, was genau ich falsch mache?
Vielen Dank für deine Hilfe!
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Sonja: Du hast einen Logikfehler in Deinem Programmablauf. Alles im Block unter score > 0 wird niemals mit einem negativen score ausgeführt. Also gibt der Vergleich score < 0 in diesem Block stets False als Ergebnis und die append-Methode Deiner result-Liste wird daher auch niemals aufgerufen.
BlackJack

@Sonja: Du musst verstehen wie Schleifen und Bedingte Ausführung funktionieren. Das sind Grundlagen die Du selber lernen musst, sonst kannst Du keine Programme selber schreiben. Dein Quelltext weiter oben zeigt ziemlich deutlich das Du wirklich sehr grundlegende Dinge nicht verstanden hast, Du also auch Code den Dir jetzt jemand anderes schreibt nicht verstehen wirst. Das ist doch sicher nicht der Sinn der Übung, dass Du Dir den Code den Du selber entwickeln sollst um etwas zu lernen, von anderen schreiben lässt‽

Warum hättest Du bei dem Quelltext als Ergebnis [3, -2] erwartet? Welche Bedingungen müssten erfüllt sein, das in dem Code *jemals* etwas an `result` angehängt wird? Welche Bedeutung hat in Python Einrückung für den Code? Welches Grundlagentutorial hast Du durchgearbeitet was das *so* (falsch oder gar nicht) vermittelt hat?
Sonja
User
Beiträge: 5
Registriert: Sonntag 10. April 2016, 14:08

Ich habe mir jetzt nochmal genauer das Kapitel zu den Schleifen angeschaut. Ich habe meinen Code jetzt umgebaut:

Code: Alles auswählen

result = []
for satz in sent_tokenize(text):
    pos = 0
    neg = 0
    for word in word_tokenize(satz):
        score = Lexikon.get(word, 0)
        if score > 0:
            pos += score
        if score < 0:
            neg += score
    result.append([pos, neg])

for s in result: print(s)
Soweit ich das verstanden habe, müsste es ja jetzt einen Output geben. Ich bekomme aber immer noch einen leeren Output. Ich glaube ich stehe gerade auf dem Schlauch.. die Einrückungen müssten das Problem doch eigentlich gelöst haben, oder?
Benutzeravatar
/me
User
Beiträge: 3552
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Sonja hat geschrieben:Soweit ich das verstanden habe, müsste es ja jetzt einen Output geben. Ich bekomme aber immer noch einen leeren Output.
Das kann nur passieren, wenn `sent_tokenize` schon kein Ergebnis liefert.

Streu doch einfach mal strategisch ein paar Ausgaben mit print ins Programm ein (Arme-Leute-Debugger) und lass dir Zwischenergebnisse ausgeben.
Antworten