For Schleifen mit Array.. Gibt es da noch ähnliche Möglichkeiten?

  • Für das festellen von fehlenden Wortanfängen und -Enden hab ich schon was aber das würde hiermit auch gehen.

    Der String der durchsucht wird ist ein Pfad ( meistens - ist nicht festgelegt, kann auch ein Array mit Wörtern sein ) und in diesem Pfad soll ein Wort gesucht weden welches man eingibt.

    Wenn man dieses Wort falsch eingibt und deshalb nicht gefunden wird laufen ein paar Funktionen drüber, welche ein Wort im Pfad suchen, welches am wahrscheinlichsten die Falscheingabe sein könnte.

    • Offizieller Beitrag

    Hi!

    Hatte ein wenig daran rumgespielt, aber so einfach ist es dann doch wieder nicht, weil ich einen definierten Anfang brauche für die Suche. Da scheint mir ein Regulärer Ausdruck evtl. doch besser, weil man den greedy oder non-greedy machen könnte.
    Hast du mal nach solche Algorithmen gesucht, das ist ja ein klassisches Problem, solche Tippfehler oder ausgelassene Buchstaben zu finden (Google)?

    Mein letzter Stand (funktioniert nicht, aber vielleicht die Idee interessant):

    [autoit]

    Func _findMisspelledWord($_longWord, $_searchWord, $_length_factor, $_similarity_factor, $_caseSens = 1)
    ; by peethebee (dont remove this!)

    [/autoit][autoit][/autoit][autoit]

    Local $_good = 0
    Local $_bad = 0
    Local $_firstPos = -1
    Local $_lastPos = -1

    [/autoit][autoit][/autoit][autoit]

    ; Wort1 durchlaufen
    For $_i = 1 To StringLen($_searchWord)
    ;~ ConsoleWrite(StringFormat("Testing letter %s", StringMid($_word1, $_i, 1)) & @CRLF)
    $_pos = StringInStr($_longWord, StringMid($_searchWord, $_i, 1), $_caseSens)
    If ($_pos = 0) Then
    ; nicht in Wort2
    ;~ ConsoleWrite(StringFormat("Not in Word2, like %i more so far.", $_bad) & @CRLF)
    $_bad = $_bad + 1
    Else
    ; schon in Wort2 -> Entfernen, damit Buchstabenanzahl korrekt beachtet wird
    ;~ ConsoleWrite(StringFormat("In Word2, like %i more so far.", $_good) & @CRLF)
    If ($_good = 0) Then
    $_firstPos = $_pos
    EndIf
    $_lastPos = $_pos

    [/autoit][autoit][/autoit][autoit]

    $_good = $_good + 1
    $_longWord = StringTrimLeft($_longWord, $_pos)
    EndIf
    Next

    [/autoit][autoit][/autoit][autoit]

    ; Tests
    If ($_good / ($_good + $_bad) < $_similarity_factor) Then Return $_searchWord
    Local $_length_factor_found
    Local $_foundLength = $_lastPos - $_firstPos
    If ($_foundLength < StringLen($_searchWord)) Then
    $_length_factor_found = $_foundLength / StringLen($_searchWord)
    Else
    $_length_factor_found = StringLen($_searchWord) / $_foundLength
    EndIf
    If $_length_factor_found < $_length_factor Then Return $_searchWord

    [/autoit][autoit][/autoit][autoit]

    Return StringMid($_longWord, $_firstPos, $_lastPos - $_firstPos)
    EndFunc ;==>_findMisspelledWord

    [/autoit][autoit][/autoit][autoit]

    $ret = _findMisspelledWord("BtrekAutoitzppoitro", "Auttoi", 0.4, 0.8, True)
    ConsoleWrite(StringFormat("Meinten Sie vielleicht %s?", $ret) & @CRLF)

    [/autoit]

    peethebee

  • Bei Google hatte ich nicht gesucht, weil eig wollte ich das ja halt mit meinem Ansatz machen.. fehlt halt nur iwie noch ne Schleife drum.

    Dein Prog werd ich mal durchforsten vll komm mir Ideen^^


    Auf jedenfall schon mal danke für die Bemühungen ;)