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

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!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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:

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

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:

Danke, dazu habe ich auch folgendes gefunden:
http://www.sns1.de/partner/flamme/wflam ... dSection=1

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

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

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:

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

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:

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'
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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:

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
:(
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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:

Da stimmt etwas mit meinem Computer nicht...
Ich versuche es auf einem anderen, melde mich wieder, falls es noch Problem gibt.
Danke
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

HALT

zeig lieber was Dein Computer da ausspuckt, warscheinlich hast Du irgendwo ein Modul Levenshtein das da dazwischenfunkt.


Gruß

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

Ok.

Code: Alles auswählen

>>> help("Levenshtein")
Help on module Levenshtein:

NAME
    Levenshtein

FILE
    c:\python23\N1\levenshtein.py

DATA
    __file__ = 'C:\\Python23\\N1\\Levenshtein.py'
    __name__ = 'Levenshtein'
    a = 'Hallo'
    b = 'Hllo'

Und da ist jetzt schon das Problem, das wohl an meinem Rechner liegen dürfte. Meine geschriebene Datei, mit der ich auch die Konsole geöffnet habe, geht leider nicht anders, heißt nicht Levenshtein.py, sondern Leven.py.
Ich muss es wie gesagt an einem anderen PC versuchen, an diesem scheint es sinnlos.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Pythino,

nö du musst nur c:\python23\N1\levenshtein.py löschen
und eventuell das Levenshtein neu installieren.


Gruß

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

Hi Dookie,
hilf leider gar nichts, meine GUI scheint fast nicht mehr zu funktionieren, bzw. nur in einem bestimmten Ordner, in dem sich zufällig eine py findet. Die lässt sich mit "edit with idle" noch öffnen, alles andere nicht!
Ist aber erst seit dem Levenshtein so!
Antworten