Statistik erstellen (dictionaries)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Guten Abend allerseits

Ich möchte aus einem Korpus die Anzahl Wortformen herausfiltern, die mehr als eine Wortart haben.
Das Vorgehen scheint mir klar zu sein: Ich definiere zuerst ein Dictionary, laufe dann durch das ganze Korpus hindurch und prüfe für jedes Wort, ob der jeweilige Tag schon vorhanden ist bzw. neu erstellt werden muss (d.h. value wäre 1) oder ob es sich um einen neuen Tag handelt, womit sich dann auch der Wert erhöhen würde.
Am Schluss sind die gesuchten Wörter diejenigen, die einen Wert grösser als 1 haben.

Bei der codemässigen Umsetzung wurde ich daran erinnert, dass wenn bei dictionaries zweimal der gleiche Schlüssel vorkommt, der Wert dazu dann einfach überschrieben wird:

Code: Alles auswählen

import nltk
korpus = nltk.corpus.brown.tagged_words()

dicti = {}
for entries in korpus:
  dicti[entries[0]] = entries[1]
print dicti.get('it')
Meine Frage also: Wie lässt sich das Problem lösen, dass ich auch mehrere Werte haben kann? (weil irgendwie muss ich die ja speichern, sonst weiss python nicht, welchen Wert wir schon gezählt haben und welchen nicht...)

Ich danke bestens für die Hilfe! :)
BlackJack

@MarcelF6: Mir ist jetzt nicht ganz klar was Du willst. Erst beschreibst Du, dass Du zählen willst, also Schlüssel auf Anzahl abbilden, und dann, dass Du einem Schlüssel mehr als einen Wert zuordnen willst. Was soll es denn nun sein?

Wie man das Zählen von Hand machen kann, hast Du im Text doch eigentlich schon beschrieben. Das könnte man so auch in Quelltext umsetzen. Hier könnte man die `dict.get()`-Methode sinnvoll einsetzen um sich einen Test zu sparen. Andererseits gibt es zum Zählen ab Python 2.7 `collections.Counter`.

Mehrere Werte kann man nicht zuordnen, aber der *eine* Wert kann natürlich eine Liste sein. Und in die kann man dann mehrere Werte stecken. Das geht letztendlich genau wie Du das für's zählen beschrieben hast, nur dass der neue Wert keine 1 sondern eine Liste mit dem ersten Wert ist, und das addieren durch das Anhängen eines weiteren Wertes ersetzt werden muss. Statt `dict.get()` und einer Schlüsselzuweisung könnte man hier mit `dict.setdefault()` arbeiten. Noch besser wäre es gleich ein `collections.defaultdict` zu verwenden.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Besten Dank für deine Hinweise - das Problem konnte ich damit wunderbar lösen. :)
Zuletzt geändert von MarcelF6 am Samstag 22. Dezember 2012, 15:32, insgesamt 1-mal geändert.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@MarcelF6: Du solltest ab und an mal in die Dokumentation zur Standard-Lib schauen. Dann würdest du collections.Counter kennen (Python 2.7):

Code: Alles auswählen

from __future__ import division
from collections import Counter
import nltk

corpus = nltk.corpus.brown.tagged_words()
counts = Counter(word for word, tag in corpus)
counts.subtract(set(counts))
counts += Counter()
print len(counts), '/', len(corpus), '* 100 =',
print '{0:.3}%'.format(len(counts) / len(corpus) * 100)
Ergebnis:

Code: Alles auswählen

30498 / 1161192 * 100 = 2.63%
Außerdem ist deine Prozent-Formel falsch und ob die Tags im Brown-Korpus wirklich die richtigen für deine Fragestellung sind...?
Ahja: Falls du mit einer älteren Python-Version arbeitest, guckstu hier (ab Python 2.5).
In specifications, Murphy's Law supersedes Ohm's.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Besten Dank für den Vorschlag und die Anmerkungen!
Allerdings...kann der Code wirklich sein?
Ich möchte gerne den Anteil aller Token herausfinden, welche mehr als 1 Wortart haben können.
Da kann knapp 3% fast nicht möglich sein, weil es sehr viele Wörter gibt, die mehrere Wortarten haben können.
Antworten