Seite 1 von 1
Dictionary
Verfasst: Freitag 19. April 2013, 15:39
von MarcelF6
Hallo miteinander
Ich wollte kurz fragen, wie man am besten ein Dictionary durchsucht, wobei man nur einen Teil des Wortes hat. Beispiel:
Wir haben ein Dictionary mit Worten und ihren Lemmata:
"Restbestände":"Rest-bestand", "Kaufhäuser":"Kauf-haus", "Luxusuhr":"Luxus-uhr"
Wenn ich nun ein anderes Wort habe, zB Lagerbestände, wie kann ich dann am besten das dazu passende Lemma finden? (die Suffixe sind immer mit "-" gekennzeichnet)
Danke und Gruss
Marcel
Re: Dictionary
Verfasst: Freitag 19. April 2013, 16:16
von MarcelF6
Ich hab sowas hier probiert:
Code: Alles auswählen
for limit in range(0, len(Wort)):
for k, v in dicti:
if Wort[limit:].lower() in k or Wort[limit:].title() in k:
if '-' in v:
temp = line.rfind('-')
[...]
Aber der Interpreter sagt mir hier schon, dass es zu viele values gebe, die ausgewertet werden müssen.
Daher die Frage: Geht es auch anders?
Re: Dictionary
Verfasst: Freitag 19. April 2013, 16:25
von BlackJack
@MarcelF6: Du solltest vielleicht die Fehlermeldung noch mal lesen und verstehen. Ich gehe mal davon aus, dass `dicti` ein Wörterbuch ist. Dann sind *zwei* Namen an dieser Stelle natürlich zu viel weil das Wörterbuch nur den Schlüssel liefert und nicht Schlüssel *und* Wert. Dafür gibt es die Methode `iteritems()`.
Vielleicht erklärst Du noch mal das Problem. Nicht jeder weiss mit den Fachbegriffen aus der Linguistik (?) etwas anzufangen.
Re: Dictionary
Verfasst: Freitag 19. April 2013, 16:52
von MarcelF6
Besten Dank - du hast mir eigentlich schon viel geholfen.
Also, was ich gerne möchte: Im dicti habe ich diverse Worte mit ihren Grundformen gespeichert (zb Lagerhäuser \t Lager-haus). Bei einem x-beliebiger Zufallstext möchte ich für alle Worte die jeweilige Grundform erhalten. Da ich aber kaum alle Wörter im dicti gespeichert habe, aber evtl. die Endung (in der Grundform) vorhanden ist, möchte ich, dass wenigstens sie erkannt wird, und der vordere Teil des Wortes einfach vorne angefügt wird. Beipsiel: "Einfamilienhäuser" sollte dann zu "Einfamilien-haus" werden.
Ich habe momentan das:
Code: Alles auswählen
for limit in range(1, len(Wort)):
for k, v in dicti.iteritems():
if Wort[limit:].lower() in k or Wort[limit:].title() in k:
if '-' in v:
tmp = v.find('-')
end = v[temp:]
end = re.sub(ur'[-]',"", end)
Wort = Wort[:limit] + '-' + end
Das Problem ist nun einfach, dass die Wortanfange jeweils stimmen, aber bei den Endungen zum Teil eine falsche genommen wird. Zudem wird so immer "
" angefügt. Wie kann man diese zwei Probleme noch beheben?
Re: Dictionary
Verfasst: Samstag 20. April 2013, 09:51
von Hyperion
Ich habe das immer noch nicht verstanden:
Beipsiel: "Einfamilienhäuser" sollte dann zu "Einfamilien-haus" werden.
Wie sollte das gehen? Du bräuchtest doch erst einmal eine Relation, die "häuser" auf "haus" abbildet. Die sehe ich aber nicht.
Oder ist Deine Idee, dass Du *alle* Keys des Wörterbuchs durchsuchst, diese Schlüssel von hinten mit dem unbekannten Wort ebenfalls von hinten abgleichst und damit dann die passende Grundform-Endung erhältst? Das ist ehrlich gesagt ziemlich umständlich, da Du ja alle Schlüssel durchlaufen und dann noch die größt mögliche Überlappung finden musst.
Für einen effizienten Algorithmus fehlt da einfach noch eine andere Abbildung, nämlich ein Dictionary mit Endungen, welches auf die Grundform-Endung abgbildet:
Re: Dictionary
Verfasst: Samstag 20. April 2013, 12:30
von MarcelF6
So ein dictionary existiert. Nur: Es bildet eben nur jene Wörter auf die Grundform ab, die es auch kennt.
Also wenn ich dein dictionary etwas erweitere:
Code: Alles auswählen
"bäume" -> "baum"
"Lagerbestände" -> "Lager-bestand"
"Kaufhaus" -> "Kauf-haus"
usw.
Die Frage ist nun, wie ich an die Grundform komme. Wenn ich beispielsweise das Wort "Einfamilienhäuser" habe. Dann (von der Idee her) würde ich gerne via get-Methode (also dicti.get("irgendetwas"+"häuser")) die Grundform finden. Die Endung kann ich extrahieren, indem ich einfach nach der grösstmöglichen Zeichenfolge suche, die vom Wort "Einfamilienhäuser" im dicti sind. --> Endung = 'häuser'. Und nun möchte ich dicti eben so durchsuchen, dass die Endung 'häuser' gefunden wird und somit auch ihre Grundform. (Annahme: Die explizite Grundform "häuser"->"haus" steht so nicht im dicti.)
Wie kann man dieses Problem am besten lösen?
Re: Dictionary
Verfasst: Samstag 20. April 2013, 13:03
von xeike
MarcelF6 hat geschrieben:Und nun möchte ich dicti eben so durchsuchen, dass die Endung 'häuser' gefunden wird und somit auch ihre Grundform. (Annahme: Die explizite Grundform "häuser"->"haus" steht so nicht im dicti.)
Wie kann man dieses Problem am besten lösen?
Da die Pluralbildung nicht so leicht über Regeln funktioniert oder vielmehr die Regeln so vielzahlig sind, würde ich die Pluralworte mit aufnehmen. Da die Pluralworte eh unmittelbar auf auf die Lemmata verweisen, ist das ja auch sinnvoll.
Also eine Abbildung, die die so etwas ermöglicht: Einfamilienhäuser -> Häuser -> Lemma: Haus.
Vielleicht hilft dir bei dem Problem auch der
Suffixbaum:
http://de.wikipedia.org/wiki/Suffixbaum
Xe
Re: Dictionary
Verfasst: Samstag 20. April 2013, 13:58
von pillmuncher
@MarcelF6. Ich glaube, was du tatsächlich suchst sind keine Informationen zu Dictionaries, sondern welche zu
Stemming.