Dictionary

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

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
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

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?
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.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

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 "&#10" angefügt. Wie kann man diese zwei Probleme noch beheben?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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:

Code: Alles auswählen

"häuser" -> "haus"
"bäume" -> "baum"
usw.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

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?
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

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
Benutzeravatar
pillmuncher
User
Beiträge: 1532
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@MarcelF6. Ich glaube, was du tatsächlich suchst sind keine Informationen zu Dictionaries, sondern welche zu Stemming.
In specifications, Murphy's Law supersedes Ohm's.
Antworten