Tolerante Eingabe

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.
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

Tolerante Eingabe

Beitragvon Pythino » Montag 31. Mai 2004, 14:11

Ich versuche ein Programm zu schreiben, das bei Eingabe eines Wortes das sich in einer Textdatei auf der gegenüberliegenden Seite befindlichen Wort ausgibt. Die Textdatei sieht in etwa so aus:
Hallo=Servus
Hi=Hallo
EOF

Wenn ich nun Hallo eingebe, sollte Servus ausgespuckt werden, bei Hi, Hallo.
Nun ist aber mein Problem, dass das Wort exakt eingegeben werden muss, um ein Ergebnis zu erhalten. Ich suche nun eine Funktion, die bei einer 70 %igen (oder so) Übereinstimmung in etwa richtiger Reihenfolge dieses Wort aussuchen kann. Dabei können auch mehrere Ausgaben möglich sein. Wenn ich z.B. Hallo eingeben soll, vertippe mich aber und schreibe hllo, dann sollte dies kein Problem sein.
Ich hoffe das ist in etwa klar!?!?

Das Skript dazu sieht wie folgt aus:

Code: Alles auswählen

# -*- coding: cp1252 -*-
from Tkinter import*

root= Tk()
root.title('Übersetzung')

def eingabe():
    enti = Entry(font = 'arial 20')
    enti.pack()
    enti.insert(END, 'Bitte Wort eingeben!')
    enti.bind('<Return>', get1)

def get1(event):
    global a
    global zaehler
    wort=[]
    wort2=[]
    zaehler = 0
    datei = 'bla.txt'
    i = 0
    zz = 0
    anfang = i
    in_file = open(datei, 'r')
    zeile = in_file.readline()
    while (zeile != 'EOF'):
        zaehler = zaehler + 1
        c = 0
        text = ''
        while (zeile[c] != '='):
            text = text + zeile[c]
            c = c + 1
        c = c + 1
        wort.append(text)
        text = ''
        while (zeile[c] != '\n'):
            text = text + zeile[c]
            c = c + 1
        wort2.append(text)
        text = ''
        zeile = in_file.readline()

    while (zaehler > i):
        if (a == wort[i]):
            b = wort2[i]
            lab1 = Label(font = 'arial 18', text =  b)
            lab1.pack()
        i = i + 1

eingabe()


Musste leider geändert werden, daher ist es nur allzu wahrscheinlich, dass es nicht 100 % funktioniert. Die Orginalversion bei mir funktioniert allerdings, es soll einfach nur klar werden nach welchem Prinzip es ablaufen soll.

Bin für jede Hilfe dankbar!
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 31. Mai 2004, 15:18

Hi Pythino,

auf die schnelle hab ich das http://wwwwbs.cs.tu-berlin.de/user-taip ... che_3.html gefunden.


Gruß

Dookie
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

Beitragvon Pythino » Montag 31. Mai 2004, 16:06

Hi Dookie,
ich verstehe zwar das Prinzip, allerdings kann ich es nicht mit Python umsetzen. Gibt es dazu keinerlei Beispiele? :?
Benutzeravatar
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Beitragvon fs111 » Montag 31. Mai 2004, 16:49

Das solltest Du auch mit Hilfe der Levenshtein-Distanz lösen können, und dafür gibt es sogar eine fertige Bibliothek:

http://trific.ath.cx/resources/python/levenshtein/

HTH

fs111
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

Beitragvon Pythino » Montag 31. Mai 2004, 17:59

Danke, dazu habe ich auch folgendes gefunden:
http://www.sns1.de/partner/flamme/wflamme.nsf/Shortcut/Wortaehnlichkeit?OpenDocument&ExpandSection=1

Allerdings kann ich auch damit nichts anfangen... :?
Benutzeravatar
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Beitragvon fs111 » Montag 31. Mai 2004, 18:22

Obiges Modul gibt Dir einfach die Distanz der beiden Wörter nach dem Levenshtein-Algorithmus zurück, berechnet also völlig ohne zutun die Ähnlichkeit. Google sollte Dir eine Reihe an Infos zu diesem Algo liefern, der ist wirklich nicht besonders schwierig zu verstehen.

fs111
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Montag 31. Mai 2004, 18:23

lade dir das *.tar.gz oder unter windows die entsprechende *.exe von dem Link von fs11 runter und installiers dir.
Dann kannst Du das Modul "Levenstein" importieren und daraus die Funktion distance verwenden, welche die Ähnlichkeit zweier Strings berechnet. Je ähnlicher umso kleiner der Wert. Siehe auch pydoc Levenstein

Code: Alles auswählen

In [2]: from Levenshtein import *
 
In [3]: a = "Hallo"
 
In [4]: b = "Hllo"
 
In [5]: distance(a,b)
Out[5]: 1
 
In [6]: distance(a,"Welt")
Out[6]: 4


Gruß

Dookie
Benutzeravatar
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Beitragvon fs111 » Dienstag 1. Juni 2004, 09:20

Normalerweise setzt man den Rückgabewert der "distance"-Funktion noch in Relation zur Wortlänge, sprich man teilt diese durch die Länge des längeren Wortes aus dem Vergleich der beiden.

Bei einem Vergleich von "Hallo" und "Hllo" würde man also durch fünf teilen. Hierdurch werden die Werte Aussagekräftiger, und man kann genauere Schwellenwerte für die Ähnlichkeit definieren.

Grüße fs111
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

Beitragvon Pythino » Mittwoch 2. Juni 2004, 12:51

Vielen Dank, doch "distance" scheint nicht definiert zu sein, obwohl ich es import habe...?
Benutzeravatar
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Beitragvon fs111 » Mittwoch 2. Juni 2004, 13:03

Wie hast Du es denn importiert?

Wenn Du

Code: Alles auswählen

import Levenshtein


machst, dann musst Du die Funktion natürlich mit

Code: Alles auswählen

Levenshtein.distance("foo", "bar")


aurfrufen, und nicht so wie Dookie es oben gemacht hat.

fs111
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

Beitragvon Pythino » Mittwoch 2. Juni 2004, 14:44

Code: Alles auswählen

from Levenshtein import *


So hätte ich es importiert!

Wenn ich es so wie du beschrieben hast mache erhalte ich folgendes:

Code: Alles auswählen

>>> Levenshtein.distance(a,b)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in ?
    Levenshtein.distance(a,b)
AttributeError: 'module' object has no attribute 'distance'
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 2. Juni 2004, 15:36

wenn du es mit from Levenshtein import * reicht distance(a,b) wenn du import Levenshtein verwendest musst Du die Funktion mit Levenshtein.distance(a,b) verwenden. Ich hoffe Du nennst dein Script nicht Levenshtein!


Gruß

Dookie
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

Beitragvon Pythino » Mittwoch 2. Juni 2004, 15:45

Ja das hab ich schon versucht, aber es funktioniert immernoch nicht:

Code: Alles auswählen

>>> from Levenshtein import *
>>> a = 'hallo'
>>> b = 'hllo'
>>> distance(a,b)
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in ?
    distance(a,b)
NameError: name 'distance' is not defined


:(
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 2. Juni 2004, 15:47

mach mal ein help("Levenshtein") in der Pythonconsole.
sollte dann sowas rauskommen

Code: Alles auswählen

Help on module Levenshtein:
 
NAME
    Levenshtein
 
FILE
    /usr/lib/python2.3/site-packages/Levenshtein.so
 
DESCRIPTION
    A C extension module for fast computation of:
...


Gruß

Dookie
Pythino
User
Beiträge: 41
Registriert: Montag 12. April 2004, 10:39
Kontaktdaten:

Beitragvon Pythino » Mittwoch 2. Juni 2004, 16:03

Da stimmt etwas mit meinem Computer nicht...
Ich versuche es auf einem anderen, melde mich wieder, falls es noch Problem gibt.
Danke

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]