PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "Meinten Sie [...]" in Python?



Dailox
29.10.2016, 22:25
Nabend!

Kennt ihr irgend einen Service der falsch geschriebene Wörter/Sätze in korrekte Wörter/Sätze ergänzt? Am liebsten einen Webservice.

Hintergrund:
Ich möchte gerne einen Namen einer Android App, in Python, auf Korrektheit überprüfen.
Also z.B. "wahtsap" wird eingegeben und "whatsapp" wird erkannt.
Ein "Anagramm" sagt mir zwar etwas, aber einen Service der mir wirklich die korrekte Bedeutung/Schreibweise des Wortes ausgibt, habe ich bisher nicht gefunden. Google macht das ja auch ("Meinten sie: [...]"), nur wie mache ich das am besten? :)

Vielen Dank im Voraus :)

MfG

Daiox

Cystasy
29.10.2016, 22:56
Google macht das indem sie eine ENORME datensammelwut haben und die Suchanfragen ihrer User dazu "missbrauchen" um dann rauszufinden was user möglicherweise suchen möchten wenn sie ein Wort eingeben. Dadurch kann man autocorrect machen zu Worten die z.b nicht im Wörterbuch stehen. Android Tastaturen haben solch eine Funktion ebenfalls eingebaut - setzen aber wieder auf vorherige eingaben des Users. Heißt quasi das die Datenbank schon dein "Schreibverhalten" kennen muss, um Vorschläge zu liefern.

"eben mal so" wirst du diese Funktion aber nicht implementieren können schätze ich.
Wenn du näher beschreibst was du erreichen möchtest (also was für eine App / wofür die eingabe gebraucht wird), könnte man vllt Alternativen finden oder dir anderweitig weiterhelfen.

Du KÖNNTEST direkt im playstore nachschauen ob die app die jemand sucht & eingibt dort vorhanden ist und falls nicht eine andere vorschlagen.
Dazu müsstest du dann aber die requests selbst craften, auswerten usw.

Anders gesagt - das ganze ist nicht einfach mal so umzusetzen für ein Anfänger / Neuling^^

grüße

zzurc
30.10.2016, 00:17
warum nicht die von google benutzen? kann doch nicht so schwer sein da ein bisschen zu klauen x)

Cystasy
30.10.2016, 01:39
warum nicht die von google benutzen? kann doch nicht so schwer sein da ein bisschen zu klauen x)

1) Google sperrt IP's wenn man ein bisschen zuviele Anfragen sendet..und dann ist das komplette Google (ALLE google services..auch yt usw) gef*ckt von dieser einen IP für einige Zeit. Anfangs nur 10 Minuten ca. danach dann 1 Stunde, usw usf.. (gibt keyword research tools die auf der unoffiziellen API von google basieren, mit denen hab ich schon rumprobiert.. daher weiß ichs - und das springt relativ schnell an)

2) Es dürfte schwer sein auszufiltern was nun eine App ist, und was ein komplett anderes Wort ist.
Beispiel:

Ich tippe ein "Baumhaus".. woher weiß nun das Programm das es eine App ist?
Nur weil Google vllt "Boumhaus" zu "Baumhaus" korrigiert, machts das nicht zu einer App.
Wie soll man sowas filtern auf diesem Weg? Geht nicht :P
Da wäre es sinnvoller einfach die Playstore zu usen und dort dann Request bei der Such-API hinzuschicken und dann den 1. eintrag zu parsen.
IMHO die bessere Alternative^^

kont
30.10.2016, 10:44
lass doch regex über jede adresse vom playstore oder auch einem anderen anbieter

<div class="id-app-title" tabindex="0">Pokémon GO</div>

regex stern im script verschieben,oder mit anfangsbuchstaben beginnen und nur regex sternchen,so könnte deine datenbank ausspucken wenn z.b. ein "W" eingegeb wird und sämtliche apps anzeigen die mit W beginnen
buchstabe für buchstabe abgleichen mit datenbank

Starflow
30.10.2016, 14:37
http://alias-i.com/lingpipe/demos/tutorial/read-me.html

&&

https://apptweak.io

||

https://code.google.com/archive/p/android-market-api/

Barny
31.10.2016, 07:59
Einen schönen guten Morgen!

Ich finde das Thema sehr interessant, weil ich mich auch schonmal damit beschäftigt hab und gebe mal meinen Senf dazu :P
Aber erstmal:


Google macht das indem sie eine ENORME datensammelwut [...]
Nett geschrieben, aber beantwortet nicht wirklich die Frage.


"eben mal so" wirst du diese Funktion aber nicht implementieren können schätze ich.
Wenn du näher beschreibst was du erreichen möchtest (also was für eine App / wofür die eingabe gebraucht wird), könnte man vllt Alternativen finden oder dir anderweitig weiterhelfen.

Er will keine Datenbank aufsetzen und son Service selber schreiben. Er sucht nach einem Service der dies für ihn tut. Aus diesem Grund schreibt er hier und bittet genau um diese Alternativen von denen du sprichst. Und Hintergrund zum Problem hat er denke ich genug gegeben.


Du KÖNNTEST direkt im playstore nachschauen ob die app die jemand sucht & eingibt dort vorhanden ist und falls nicht eine andere vorschlagen.
Das ist ne halbe Antwort auf die Frage. Er sucht halt genau dafür eine API (so wie ich das verstanden habe), damit er sich halt nicht durch das HTML-Gewusel durchhangeln muss.


Dazu müsstest du dann aber die requests selbst craften, auswerten usw.

Anders gesagt - das ganze ist nicht einfach mal so umzusetzen für ein Anfänger / Neuling^^
Durch welchen Teil der Frage kommst du darauf, dass der Threadersteller ein "Anfänger" ist? Die Frage war doch lediglich nach einer API^^ In Python ist ein einfacher Webrequest glaube ich sogar nen 2-Zeiler. Und das einfache Parsen sollte in diesem Fall kein Problem mehr darstellen und dient ganz im Gegenteil noch gerade für Anfänger als Übung für den Umgang mit Strings, Schleifen und Bedingungen (zumindest wenn man sich keinen fertigen Parser schnappt und wirklich alles selber schreibt)


1) Google sperrt IP's wenn man ein bisschen zuviele Anfragen sendet..und dann ist das komplette Google (ALLE google services..auch yt usw) gef*ckt von dieser einen IP für einige Zeit. Anfangs nur 10 Minuten ca. danach dann 1 Stunde, usw usf.. (gibt keyword research tools die auf der unoffiziellen API von google basieren [...]
"gef*ckt von dieser IP" ist echt geil :D Gebe ich dir aber Recht, allerdings glaube ich nicht, dass der Threadersteller Massenanfragen an Google stellen möchte. Er schrieb ja bereits, dass er eine Benutzereingabe überprüfen möchte. Das kommt vom Anfragetempo einer normalen Eingabe auf Google sehr nahe und da wurde ich noch nie gesperrt. Oder vertue ich mich da irgendwo?

Jetzt aber zum Thema:
Um den Beitrag von Starflow einmal zu ergänzen:
Der Anbieter "AppTweak" bietet eigentlich genau das an was gesucht worden ist und trifft damit den Nagel auf den Kopf. Allerdings ist der Service kostenpflichtig, wobei ich der Meinung bin, dass gute Sachen auch ihren Preis haben dürfen! ;) Du hast mit dieser API noch diverse andere Möglichkeiten (siehe Pricing (https://apptweak.io/pricing)), was aber glaube ich für dich ein Overkill wäre.
Interessant fand ich ebenfalls den Link zur "android-market-api" und wollt dazu auch nochmal eure persönliche Einschätzung hören. Jemand Erfahrungen? Die Doku ist ja nicht besonders groß^^ Ein Versuch wäre es aber auf jedenfall wert, allerdings müsste im Falle von Python das Programm dem Projekt mit beigelegt werden.

Ich bin damals auch auf der Suche gescheitert und habe dann direkte Requests an den PlayStore geschickt (wie mehrfach hier auch erwähnt) und alles selber geparst.

Viele Grüße,

Barny

Cystasy
31.10.2016, 17:40
In Python ist ein einfacher Webrequest glaube ich sogar nen 2-Zeiler. Und das einfache Parsen sollte in diesem Fall kein Problem mehr darstellen und dient ganz im Gegenteil noch gerade für Anfänger als Übung für den Umgang mit Strings, Schleifen und Bedingungen (zumindest wenn man sich keinen fertigen Parser schnappt und wirklich alles selber schreibt)


Es ging mir da eher drum, das es nicht ganz so Trival ist die Requests zu reversen wenn man sowas noch nie gemacht hat (wovon ich beim OP ausgehe, sonst hätte er es schon längst getan). Man muss da ja sogesehen die interne API von der Google Playstore Suche reversen, rausfinden wie man einen request formulieren muss, wie man dann die Antwort auswertet usw. Darum gings mir - nicht um das reine programmieren danach^^ Das ist ja nicht wirklich schwer dann wenn man mal weiß was man tun muss (imho).

Starflow
01.11.2016, 14:23
@Barny & Dailox:
Vergesst das mit der android-market-api am besten wieder, der letzte commit war vor ~4 Jahren, ist also sehr wahrscheinlich nicht mehr up2date.
Wollte nur auch eine gratis Variante zur AppTweak API bereitstellen; zu hastig.

Aber vielleicht kann es ja nütlzlich sein als Einstieg, wenn du dich entscheiden solltest die Google API selbst zu reversen.

Ansonsten schau dir vielleicht auch noch mal das NLTK (https://github.com/nltk/nltk) an; macht im Endeffekt das selbe wie LingPipe, ist aber in python geschrieben, nicht in Java.


Also entweder AppTweak oder selber reversen und dann das ganze ans NLTK "kleben", hübsche GUI basteln, Fertig.

Immer schön ans cachen denken, bei AppTweak kann das bares Geld sparen. ;)

/E:

Selber machen soll wohl nicht so der knaller sein, da es wohl keine richtige API gibt, sondern nur das WebInterface vom Store welches man parsen müsste.
Ausserdem ist die Suche für Bots verboten, wenn Google also mitbekommt dass du da rumbastelst, kassierste wahrscheinlich nen Ban.

Aber ich hab noch ne alternativen paid Service gefunden:

https://42matters.com/pricing

Preislich sieht das schon günstiger aus als AppTweak, fragt sich nur ob die Qualität der Daten vergleichbar ist.

Jut4h.tm
07.11.2016, 16:04
Ich habe sowas mal in SQL geschrieben. mithilfe von:
- https://de.wikipedia.org/wiki/Levenshtein-Distanz
- https://de.wikipedia.org/wiki/Soundex
und noch einer eigenen Methode. aus den 3 bilde ich ein Rating von 100 bis 0% und ordne die Ergebnisse danach.

wenn du möchtest kann ich den code mal posten (wenn du noch Hilfe brauchst)

Barny
18.11.2016, 08:19
wenn du möchtest kann ich den code mal posten (wenn du noch Hilfe brauchst)

Ich würde den Code gerne einmal sehen. Hab in diese Richtung bisher nämlich garnix gemacht. :)

Habe mich jetzt auch einmal dran gesetzt und nachfolgender Code ist dabei rausgekommen. Bitte seid gnädig mit mir, ich entwickle eigentlich nicht in Python und hab das nur in Python gemacht, weil das ja so gefordert war. Also ich habe bestimmt einige Stilfehler drin. :D

Zum Code:
Der Code fragt direkt bei GooglePlay die Package-Namen der Apps. Das Ergebnis ist selbstverständlich abhängig von dem Suchparameter. Diesen könnt ihr anpassen, in dem ihr den Inhalt der Variable "QUERY" (ganz oben) einmal anpasst. Im Moment steht "the+room" drin (im übrigen ein top Spiel :D ). Leerzeichen müssen durch ein "+" gekennzeichnet werden.

Ich habe mir Mühe gegeben den Code zu verständlich wie nur möglich zu kommentieren. Aber kurz zusammengefasst rufe ich GooglePlay mit genau den Suchparamtern auf und parse mir aus der Antwort alle Links heraus ("href="). Diese verweisen weiter auf die Detailseiten der Apps, und der Link enthält den Package-Namen. Schön ist hierbei auch, dass so durch kleine Anpassungen auch der Kiosk und die Filme druchsucht werden können. Derzeit wird aber nur nach Apps gesucht. Hier also der Code:


#-*- encoding: utf-8 -*-
import urllib2

#Must-Have Data
QUERY = "the+room"
GOOGLE_URL = "https://play.google.com/store/search?q="+QUERY+"&hl=de"

# Variable Suchparameter
SEARCH_TAG = "href=\""
SEARCH_APP_TAG = "/store/apps/details?id="

# Hole den ganzen HTML-Geschiss von GooglePlay
def getGoogleContent():
return urllib2.urlopen(GOOGLE_URL).read()

# Hole alle URL´s aus dem Quelltext heraus (alle mit Tag "<a href= [...]>") siehe Variable SEARCH_TAG
def parseURLs(content):
fixPoint = 0
toReturn = list()
while content.find(SEARCH_TAG) > 0:
fixPoint = content.find(SEARCH_TAG) + len(SEARCH_TAG)
content = content[fixPoint:]
i = 0
temp = ""
while content[i] != "\"":
if content[i] != "\"":
temp += content[i]
i += 1
toReturn.append(temp)
i = 0
fixPoint = 0
return toReturn

# Überprüfe ob sich das Element bereits in der Liste befindet
# Falls Ja -> Gib "Wahr" zurück
# Falls Nein -> Gib "Falsch" zurück
def isAlreadyInList(value,arr):
i = 0
while i < len(arr):
if arr[i] == value:
return True
i += 1
return False

# Holt aus den geparsten URL´s die Namen der Pakete heraus und befüllt eine weitere Liste mit Hilfe der
# Methode "isAlreadyInList", um Mehrfacheintragungen zu vermeiden
def parseAppNames(appList):
i = 0
toReturn = list()
while i < len(appList):
if appList[i].find(SEARCH_APP_TAG) > -1:
temp = appList[i]
temp = temp[len(SEARCH_APP_TAG):]
if not isAlreadyInList(temp,toReturn):
toReturn.append(temp)
i += 1
return toReturn

# Hole URL´s
liste = parseURLs(getGoogleContent())

# Parse aus den URL´s die Paketnamen
liste = parseAppNames(liste)

# Gib die ganze Liste aus
i = 0
while i < len(liste):
print liste[i]
i += 1

Viele Grüße,

Barny

Dailox
03.12.2016, 12:15
Danke für alle eure Antworten! Barnys Lösung hat mir sehr weitergeholfen.

sry, dass ich nicht sofort geantwortet hatte. Rl und so kam dazwischen ^^

sp1nny
06.12.2016, 10:16
Hey,

hab mich auch eben rangesetzt und den von Barny bereitgestellten Code (danke dafür :)) nochmals refactored.
Mit regulären Ausdrücken konnte man einiges an Zeilen sparen. 8)



# -*- encoding: utf-8 -*-
import urllib.request
import re
from functools import reduce

# Must-Have Data
QUERY = "the+room"
GOOGLE_URL = r"https://play.google.com/store/search?q=" + QUERY + r"&hl=de"


# Hole den ganzen HTML-Geschiss von GooglePlay
def get_google_content():
return str(urllib.request.urlopen(GOOGLE_URL).read())


# Hole alle URL´s aus dem Quelltext heraus
def parse_urls(content):
regex = re.compile(r"href=\"(.*?)\"")
return regex.findall(content)


# Holt aus den geparsten URL´s die Namen der Pakete heraus
def parse_app_names(app_list):
all_as_str = reduce(lambda x, y: x + " " + y, app_list)
regex = re.compile(r"/store/apps/details\?id=(.+?) ")
return list(set(regex.findall(all_as_str)))


# Hole URL´s
urls = parse_urls(get_google_content())

# Parse aus den URL´s die Paketnamen
app_names = parse_app_names(urls)

# Gib die ganze Liste aus
for name in app_names:
print(name)

Gruss,
sp1nny

Jut4h.tm
06.12.2016, 13:38
Hier ist der SQL Code. Man nutzt die Funktion indem man heuristicScore([DIE SPALTE DIE ABGEFRAGT WERDEN SOLL],[DER STRING DEN MAN SUCHT]) mit in den query packt. Die Funktion haut eine zahl raus. Je höher die zahl ist desto wahrscheinlicher ist das Wort gemeint. man muss die liste dann nur noch nach der score sortieren.



DELIMITER $$

DROP FUNCTION IF EXISTS `flb`.`dm` $$
CREATE FUNCTION `dm`(st VARCHAR(55)) RETURNS varchar(128) CHARSET utf8
NO SQL
BEGIN
DECLARE length, first, last, pos, prevpos, is_slavo_germanic SMALLINT;
DECLARE pri, sec VARCHAR(45) DEFAULT '';
DECLARE ch CHAR(1);
SET first = 3;
SET length = CHAR_LENGTH(st);
SET last = first + length -1;
SET st = CONCAT(REPEAT('-', first -1), UCASE(st), REPEAT(' ', 5));
SET is_slavo_germanic = (st LIKE '%W%' OR st LIKE '%K%' OR st LIKE '%CZ%');
SET pos = first;
IF SUBSTRING(st, first, 2) IN ('GN', 'KN', 'PN', 'WR', 'PS') THEN
SET pos = pos + 1;
END IF;
IF SUBSTRING(st, first, 1) = 'X' THEN
SET pri = 'S', sec = 'S', pos = pos + 1;
END IF;
WHILE pos <= last DO
SET prevpos = pos;
SET ch = SUBSTRING(st, pos, 1);
CASE
WHEN ch IN ('A', 'E', 'I', 'O', 'U', 'Y') THEN
IF pos = first THEN
SET pri = CONCAT(pri, 'A'), sec = CONCAT(sec, 'A'), pos = pos + 1;
ELSE
SET pos = pos + 1;
END IF;
WHEN ch = 'B' THEN

IF SUBSTRING(st, pos+1, 1) = 'B' THEN
SET pri = CONCAT(pri, 'P'), sec = CONCAT(sec, 'P'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'P'), sec = CONCAT(sec, 'P'), pos = pos + 1;
END IF;
WHEN ch = 'C' THEN

IF (pos > (first + 1) AND SUBSTRING(st, pos-2, 1) NOT IN ('A', 'E', 'I', 'O', 'U', 'Y') AND SUBSTRING(st, pos-1, 3) = 'ACH' AND
(SUBSTRING(st, pos+2, 1) NOT IN ('I', 'E') OR SUBSTRING(st, pos-2, 6) IN ('BACHER', 'MACHER'))) THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;

ELSEIF pos = first AND SUBSTRING(st, first, 6) = 'CAESAR' THEN
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'S'), pos = pos + 2;
ELSEIF SUBSTRING(st, pos, 4) = 'CHIA' THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
ELSEIF SUBSTRING(st, pos, 2) = 'CH' THEN

IF pos > first AND SUBSTRING(st, pos, 4) = 'CHAE' THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'X'), pos = pos + 2;
ELSEIF pos = first AND (SUBSTRING(st, pos+1, 5) IN ('HARAC', 'HARIS') OR
SUBSTRING(st, pos+1, 3) IN ('HOR', 'HYM', 'HIA', 'HEM')) AND SUBSTRING(st, first, 5) != 'CHORE' THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;

ELSEIF SUBSTRING(st, first, 4) IN ('VAN ', 'VON ') OR SUBSTRING(st, first, 3) = 'SCH'
OR SUBSTRING(st, pos-2, 6) IN ('ORCHES', 'ARCHIT', 'ORCHID')
OR SUBSTRING(st, pos+2, 1) IN ('T', 'S')
OR ((SUBSTRING(st, pos-1, 1) IN ('A', 'O', 'U', 'E') OR pos = first)
AND SUBSTRING(st, pos+2, 1) IN ('L', 'R', 'N', 'M', 'B', 'H', 'F', 'V', 'W', ' ')) THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
ELSE
IF pos > first THEN
IF SUBSTRING(st, first, 2) = 'MC' THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'X'), sec = CONCAT(sec, 'K'), pos = pos + 2;
END IF;
ELSE
SET pri = CONCAT(pri, 'X'), sec = CONCAT(sec, 'X'), pos = pos + 2;
END IF;
END IF;

ELSEIF SUBSTRING(st, pos, 2) = 'CZ' AND SUBSTRING(st, pos-2, 4) != 'WICZ' THEN
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'X'), pos = pos + 2;

ELSEIF SUBSTRING(st, pos+1, 3) = 'CIA' THEN
SET pri = CONCAT(pri, 'X'), sec = CONCAT(sec, 'X'), pos = pos + 3;

ELSEIF SUBSTRING(st, pos, 2) = 'CC' AND NOT (pos = (first +1) AND SUBSTRING(st, first, 1) = 'M') THEN

IF SUBSTRING(st, pos+2, 1) IN ('I', 'E', 'H') AND SUBSTRING(st, pos+2, 2) != 'HU' THEN

IF (pos = first +1 AND SUBSTRING(st, first) = 'A') OR
SUBSTRING(st, pos-1, 5) IN ('UCCEE', 'UCCES') THEN
SET pri = CONCAT(pri, 'KS'), sec = CONCAT(sec, 'KS'), pos = pos + 3;

ELSE
SET pri = CONCAT(pri, 'X'), sec = CONCAT(sec, 'X'), pos = pos + 3;
END IF;
ELSE
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
END IF;
ELSEIF SUBSTRING(st, pos, 2) IN ('CK', 'CG', 'CQ') THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
ELSEIF SUBSTRING(st, pos, 2) IN ('CI', 'CE', 'CY') THEN

IF SUBSTRING(st, pos, 3) IN ('CIO', 'CIE', 'CIA') THEN
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'X'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'S'), pos = pos + 2;
END IF;
ELSE

IF SUBSTRING(st, pos+1, 2) IN (' C', ' Q', ' G') THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 3;
ELSE
IF SUBSTRING(st, pos+1, 1) IN ('C', 'K', 'Q') AND SUBSTRING(st, pos+1, 2) NOT IN ('CE', 'CI') THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 1;
END IF;
END IF;
END IF;

WHEN ch = 'D' THEN
IF SUBSTRING(st, pos, 2) = 'DG' THEN
IF SUBSTRING(st, pos+2, 1) IN ('I', 'E', 'Y') THEN
SET pri = CONCAT(pri, 'J'), sec = CONCAT(sec, 'J'), pos = pos + 3;
ELSE
SET pri = CONCAT(pri, 'TK'), sec = CONCAT(sec, 'TK'), pos = pos + 2;
END IF;
ELSEIF SUBSTRING(st, pos, 2) IN ('DT', 'DD') THEN
SET pri = CONCAT(pri, 'T'), sec = CONCAT(sec, 'T'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'T'), sec = CONCAT(sec, 'T'), pos = pos + 1;
END IF;
WHEN ch = 'F' THEN
IF SUBSTRING(st, pos+1, 1) = 'F' THEN
SET pri = CONCAT(pri, 'F'), sec = CONCAT(sec, 'F'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'F'), sec = CONCAT(sec, 'F'), pos = pos + 1;
END IF;
WHEN ch = 'G' THEN
IF SUBSTRING(st, pos+1, 1) = 'H' THEN
IF (pos > first AND SUBSTRING(st, pos-1, 1) NOT IN ('A', 'E', 'I', 'O', 'U', 'Y'))
OR ( pos = first AND SUBSTRING(st, pos+2, 1) != 'I') THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
ELSEIF pos = first AND SUBSTRING(st, pos+2, 1) = 'I' THEN
SET pri = CONCAT(pri, 'J'), sec = CONCAT(sec, 'J'), pos = pos + 2;

ELSEIF (pos > (first + 1) AND SUBSTRING(st, pos-2, 1) IN ('B', 'H', 'D') )
OR (pos > (first + 2) AND SUBSTRING(st, pos-3, 1) IN ('B', 'H', 'D') )
OR (pos > (first + 3) AND SUBSTRING(st, pos-4, 1) IN ('B', 'H') ) THEN
SET pos = pos + 2;
ELSE

IF pos > (first + 2) AND SUBSTRING(st, pos-1, 1) = 'U'
AND SUBSTRING(st, pos-3, 1) IN ('C', 'G', 'L', 'R', 'T') THEN
SET pri = CONCAT(pri, 'F'), sec = CONCAT(sec, 'F'), pos = pos + 2;
ELSEIF pos > first AND SUBSTRING(st, pos-1, 1) != 'I' THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
ELSE
SET pos = pos + 1;
END IF;
END IF;
ELSEIF SUBSTRING(st, pos+1, 1) = 'N' THEN
IF pos = (first +1) AND SUBSTRING(st, first, 1) IN ('A', 'E', 'I', 'O', 'U', 'Y') AND NOT is_slavo_germanic THEN
SET pri = CONCAT(pri, 'KN'), sec = CONCAT(sec, 'N'), pos = pos + 2;
ELSE

IF SUBSTRING(st, pos+2, 2) != 'EY' AND SUBSTRING(st, pos+1, 1) != 'Y'
AND NOT is_slavo_germanic THEN
SET pri = CONCAT(pri, 'N'), sec = CONCAT(sec, 'KN'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'KN'), sec = CONCAT(sec, 'KN'), pos = pos + 2;
END IF;
END IF;

ELSEIF SUBSTRING(st, pos+1, 2) = 'LI' AND NOT is_slavo_germanic THEN
SET pri = CONCAT(pri, 'KL'), sec = CONCAT(sec, 'L'), pos = pos + 2;

ELSEIF pos = first AND (SUBSTRING(st, pos+1, 1) = 'Y'
OR SUBSTRING(st, pos+1, 2) IN ('ES', 'EP', 'EB', 'EL', 'EY', 'IB', 'IL', 'IN', 'IE', 'EI', 'ER')) THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'J'), pos = pos + 2;

ELSEIF (SUBSTRING(st, pos+1, 2) = 'ER' OR SUBSTRING(st, pos+1, 1) = 'Y')
AND SUBSTRING(st, first, 6) NOT IN ('DANGER', 'RANGER', 'MANGER')
AND SUBSTRING(st, pos-1, 1) not IN ('E', 'I') AND SUBSTRING(st, pos-1, 3) NOT IN ('RGY', 'OGY') THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'J'), pos = pos + 2;

ELSEIF SUBSTRING(st, pos+1, 1) IN ('E', 'I', 'Y') OR SUBSTRING(st, pos-1, 4) IN ('AGGI', 'OGGI') THEN

IF SUBSTRING(st, first, 4) IN ('VON ', 'VAN ') OR SUBSTRING(st, first, 3) = 'SCH'
OR SUBSTRING(st, pos+1, 2) = 'ET' THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
ELSE

IF SUBSTRING(st, pos+1, 4) = 'IER ' THEN
SET pri = CONCAT(pri, 'J'), sec = CONCAT(sec, 'J'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'J'), sec = CONCAT(sec, 'K'), pos = pos + 2;
END IF;
END IF;
ELSEIF SUBSTRING(st, pos+1, 1) = 'G' THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 1;
END IF;
WHEN ch = 'H' THEN

IF (pos = first OR SUBSTRING(st, pos-1, 1) IN ('A', 'E', 'I', 'O', 'U', 'Y'))
AND SUBSTRING(st, pos+1, 1) IN ('A', 'E', 'I', 'O', 'U', 'Y') THEN
SET pri = CONCAT(pri, 'H'), sec = CONCAT(sec, 'H'), pos = pos + 2;
ELSE
SET pos = pos + 1;
END IF;
WHEN ch = 'J' THEN

IF SUBSTRING(st, pos, 4) = 'JOSE' OR SUBSTRING(st, first, 4) = 'SAN ' THEN
IF (pos = first AND SUBSTRING(st, pos+4, 1) = ' ') OR SUBSTRING(st, first, 4) = 'SAN ' THEN
SET pri = CONCAT(pri, 'H'), sec = CONCAT(sec, 'H');
ELSE
SET pri = CONCAT(pri, 'J'), sec = CONCAT(sec, 'H');
END IF;
ELSEIF pos = first AND SUBSTRING(st, pos, 4) != 'JOSE' THEN
SET pri = CONCAT(pri, 'J'), sec = CONCAT(sec, 'A');
ELSE

IF SUBSTRING(st, pos-1, 1) IN ('A', 'E', 'I', 'O', 'U', 'Y') AND NOT is_slavo_germanic
AND SUBSTRING(st, pos+1, 1) IN ('A', 'O') THEN
SET pri = CONCAT(pri, 'J'), sec = CONCAT(sec, 'H');
ELSE
IF pos = last THEN
SET pri = CONCAT(pri, 'J');
ELSE
IF SUBSTRING(st, pos+1, 1) not IN ('L', 'T', 'K', 'S', 'N', 'M', 'B', 'Z')
AND SUBSTRING(st, pos-1, 1) not IN ('S', 'K', 'L') THEN
SET pri = CONCAT(pri, 'J'), sec = CONCAT(sec, 'J');
END IF;
END IF;
END IF;
END IF;
IF SUBSTRING(st, pos+1, 1) = 'J' THEN
SET pos = pos + 2;
ELSE
SET pos = pos + 1;
END IF;
WHEN ch = 'K' THEN
IF SUBSTRING(st, pos+1, 1) = 'K' THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 1;
END IF;
WHEN ch = 'L' THEN
IF SUBSTRING(st, pos+1, 1) = 'L' THEN

IF (pos = (last - 2) AND SUBSTRING(st, pos-1, 4) IN ('ILLO', 'ILLA', 'ALLE'))
OR ((SUBSTRING(st, last-1, 2) IN ('AS', 'OS') OR SUBSTRING(st, last) IN ('A', 'O'))
AND SUBSTRING(st, pos-1, 4) = 'ALLE') THEN
SET pri = CONCAT(pri, 'L'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'L'), sec = CONCAT(sec, 'L'), pos = pos + 2;
END IF;
ELSE
SET pri = CONCAT(pri, 'L'), sec = CONCAT(sec, 'L'), pos = pos + 1;
END IF;
WHEN ch = 'M' THEN
IF SUBSTRING(st, pos-1, 3) = 'UMB'
AND (pos + 1 = last OR SUBSTRING(st, pos+2, 2) = 'ER')
OR SUBSTRING(st, pos+1, 1) = 'M' THEN
SET pri = CONCAT(pri, 'M'), sec = CONCAT(sec, 'M'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'M'), sec = CONCAT(sec, 'M'), pos = pos + 1;
END IF;
WHEN ch = 'N' THEN
IF SUBSTRING(st, pos+1, 1) = 'N' THEN
SET pri = CONCAT(pri, 'N'), sec = CONCAT(sec, 'N'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'N'), sec = CONCAT(sec, 'N'), pos = pos + 1;
END IF;


WHEN ch = 'P' THEN
IF SUBSTRING(st, pos+1, 1) = 'H' THEN
SET pri = CONCAT(pri, 'F'), sec = CONCAT(sec, 'F'), pos = pos + 2;
ELSEIF SUBSTRING(st, pos+1, 1) IN ('P', 'B') THEN
SET pri = CONCAT(pri, 'P'), sec = CONCAT(sec, 'P'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'P'), sec = CONCAT(sec, 'P'), pos = pos + 1;
END IF;
WHEN ch = 'Q' THEN
IF SUBSTRING(st, pos+1, 1) = 'Q' THEN
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'K'), sec = CONCAT(sec, 'K'), pos = pos + 1;
END IF;
WHEN ch = 'R' THEN

IF pos = last AND not is_slavo_germanic
AND SUBSTRING(st, pos-2, 2) = 'IE' AND SUBSTRING(st, pos-4, 2) NOT IN ('ME', 'MA') THEN
SET sec = CONCAT(sec, 'R');
ELSE
SET pri = CONCAT(pri, 'R'), sec = CONCAT(sec, 'R');
END IF;
IF SUBSTRING(st, pos+1, 1) = 'R' THEN
SET pos = pos + 2;
ELSE
SET pos = pos + 1;
END IF;
WHEN ch = 'S' THEN

IF SUBSTRING(st, pos-1, 3) IN ('ISL', 'YSL') THEN
SET pos = pos + 1;

ELSEIF pos = first AND SUBSTRING(st, first, 5) = 'SUGAR' THEN
SET pri = CONCAT(pri, 'X'), sec = CONCAT(sec, 'S'), pos = pos + 1;
ELSEIF SUBSTRING(st, pos, 2) = 'SH' THEN

IF SUBSTRING(st, pos+1, 4) IN ('HEIM', 'HOEK', 'HOLM', 'HOLZ') THEN
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'S'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'X'), sec = CONCAT(sec, 'X'), pos = pos + 2;
END IF;

ELSEIF SUBSTRING(st, pos, 3) IN ('SIO', 'SIA') OR SUBSTRING(st, pos, 4) = 'SIAN' THEN
IF NOT is_slavo_germanic THEN
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'X'), pos = pos + 3;
ELSE
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'S'), pos = pos + 3;
END IF;


ELSEIF (pos = first AND SUBSTRING(st, pos+1, 1) IN ('M', 'N', 'L', 'W')) OR SUBSTRING(st, pos+1, 1) = 'Z' THEN
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'X');
IF SUBSTRING(st, pos+1, 1) = 'Z' THEN
SET pos = pos + 2;
ELSE
SET pos = pos + 1;
END IF;
ELSEIF SUBSTRING(st, pos, 2) = 'SC' THEN

IF SUBSTRING(st, pos+2, 1) = 'H' THEN

IF SUBSTRING(st, pos+3, 2) IN ('OO', 'ER', 'EN', 'UY', 'ED', 'EM') THEN

IF SUBSTRING(st, pos+3, 2) IN ('ER', 'EN') THEN
SET pri = CONCAT(pri, 'X'), sec = CONCAT(sec, 'SK'), pos = pos + 3;
ELSE
SET pri = CONCAT(pri, 'SK'), sec = CONCAT(sec, 'SK'), pos = pos + 3;
END IF;
ELSE
IF pos = first AND SUBSTRING(st, first+3, 1) not IN ('A', 'E', 'I', 'O', 'U', 'Y') AND SUBSTRING(st, first+3, 1) != 'W' THEN
SET pri = CONCAT(pri, 'X'), sec = CONCAT(sec, 'S'), pos = pos + 3;
ELSE
SET pri = CONCAT(pri, 'X'), sec = CONCAT(sec, 'X'), pos = pos + 3;
END IF;
END IF;
ELSEIF SUBSTRING(st, pos+2, 1) IN ('I', 'E', 'Y') THEN
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'S'), pos = pos + 3;
ELSE
SET pri = CONCAT(pri, 'SK'), sec = CONCAT(sec, 'SK'), pos = pos + 3;
END IF;

ELSEIF pos = last AND SUBSTRING(st, pos-2, 2) IN ('AI', 'OI') THEN
SET sec = CONCAT(sec, 'S'), pos = pos + 1;
ELSE
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'S');
IF SUBSTRING(st, pos+1, 1) IN ('S', 'Z') THEN
SET pos = pos + 2;
ELSE
SET pos = pos + 1;
END IF;
END IF;
WHEN ch = 'T' THEN
IF SUBSTRING(st, pos, 4) = 'TION' THEN
SET pri = CONCAT(pri, 'X'), sec = CONCAT(sec, 'X'), pos = pos + 3;
ELSEIF SUBSTRING(st, pos, 3) IN ('TIA', 'TCH') THEN
SET pri = CONCAT(pri, 'X'), sec = CONCAT(sec, 'X'), pos = pos + 3;
ELSEIF SUBSTRING(st, pos, 2) = 'TH' OR SUBSTRING(st, pos, 3) = 'TTH' THEN

IF SUBSTRING(st, pos+2, 2) IN ('OM', 'AM') OR SUBSTRING(st, first, 4) IN ('VON ', 'VAN ')
OR SUBSTRING(st, first, 3) = 'SCH' THEN
SET pri = CONCAT(pri, 'T'), sec = CONCAT(sec, 'T'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, '0'), sec = CONCAT(sec, 'T'), pos = pos + 2;
END IF;
ELSEIF SUBSTRING(st, pos+1, 1) IN ('T', 'D') THEN
SET pri = CONCAT(pri, 'T'), sec = CONCAT(sec, 'T'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'T'), sec = CONCAT(sec, 'T'), pos = pos + 1;
END IF;
WHEN ch = 'V' THEN
IF SUBSTRING(st, pos+1, 1) = 'V' THEN
SET pri = CONCAT(pri, 'F'), sec = CONCAT(sec, 'F'), pos = pos + 2;
ELSE
SET pri = CONCAT(pri, 'F'), sec = CONCAT(sec, 'F'), pos = pos + 1;
END IF;
WHEN ch = 'W' THEN

IF SUBSTRING(st, pos, 2) = 'WR' THEN
SET pri = CONCAT(pri, 'R'), sec = CONCAT(sec, 'R'), pos = pos + 2;
ELSEIF pos = first AND (SUBSTRING(st, pos+1, 1) IN ('A', 'E', 'I', 'O', 'U', 'Y')
OR SUBSTRING(st, pos, 2) = 'WH') THEN

IF SUBSTRING(st, pos+1, 1) IN ('A', 'E', 'I', 'O', 'U', 'Y') THEN
SET pri = CONCAT(pri, 'A'), sec = CONCAT(sec, 'F'), pos = pos + 1;
ELSE
SET pri = CONCAT(pri, 'A'), sec = CONCAT(sec, 'A'), pos = pos + 1;
END IF;

ELSEIF (pos = last AND SUBSTRING(st, pos-1, 1) IN ('A', 'E', 'I', 'O', 'U', 'Y'))
OR SUBSTRING(st, pos-1, 5) IN ('EWSKI', 'EWSKY', 'OWSKI', 'OWSKY')
OR SUBSTRING(st, first, 3) = 'SCH' THEN
SET sec = CONCAT(sec, 'F'), pos = pos + 1;


ELSEIF SUBSTRING(st, pos, 4) IN ('WICZ', 'WITZ') THEN
SET pri = CONCAT(pri, 'TS'), sec = CONCAT(sec, 'FX'), pos = pos + 4;
ELSE
SET pos = pos + 1;
END IF;
WHEN ch = 'X' THEN

IF not(pos = last AND (SUBSTRING(st, pos-3, 3) IN ('IAU', 'EAU')
OR SUBSTRING(st, pos-2, 2) IN ('AU', 'OU'))) THEN
SET pri = CONCAT(pri, 'KS'), sec = CONCAT(sec, 'KS');
END IF;
IF SUBSTRING(st, pos+1, 1) IN ('C', 'X') THEN
SET pos = pos + 2;
ELSE
SET pos = pos + 1;
END IF;
WHEN ch = 'Z' THEN

IF SUBSTRING(st, pos+1, 1) = 'H' THEN
SET pri = CONCAT(pri, 'J'), sec = CONCAT(sec, 'J'), pos = pos + 1;
ELSEIF SUBSTRING(st, pos+1, 3) IN ('ZO', 'ZI', 'ZA')
OR (is_slavo_germanic AND pos > first AND SUBSTRING(st, pos-1, 1) != 'T') THEN
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'TS');
ELSE
SET pri = CONCAT(pri, 'S'), sec = CONCAT(sec, 'S');
END IF;
IF SUBSTRING(st, pos+1, 1) = 'Z' THEN
SET pos = pos + 2;
ELSE
SET pos = pos + 1;
END IF;
ELSE
SET pos = pos + 1;
END CASE;
IF pos = prevpos THEN
SET pos = pos +1;
SET pri = CONCAT(pri,'<didnt incr>');
END IF;
END WHILE;
IF pri != sec THEN
SET pri = CONCAT(pri, ';', sec);
END IF;
RETURN (pri);
END $$

DELIMITER //
CREATE FUNCTION LEVENSHTEIN (s1 VARCHAR(255), s2 VARCHAR(255))
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
DECLARE s1_char CHAR;
DECLARE cv0, cv1 VARBINARY(256);
SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = '\0', j = 1, i = 1, c = 0;
IF s1 = s2 THEN
RETURN 0;
ELSEIF s1_len = 0 THEN
RETURN s2_len;
ELSEIF s2_len = 0 THEN
RETURN s1_len;
ELSE
WHILE j <= s2_len DO
SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
END WHILE;
WHILE i <= s1_len DO
SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
WHILE j <= s2_len DO
SET c = c + 1;
IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
IF c > c_temp THEN SET c = c_temp; END IF;
SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
IF c > c_temp THEN SET c = c_temp; END IF;
SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
END WHILE;
SET cv1 = cv0, i = i + 1;
END WHILE;
END IF;
RETURN c;
END//

DELIMITER //
CREATE FUNCTION heuristicScore(tblString VARCHAR(255),searchString VARCHAR(255))
RETURNS INT
BEGIN
DECLARE score1,score2, score3 INT;
DECLARE meta1, meta2 VARCHAR(256);
SET score3 = 100;
SET tblString = LOWER(tblString);
SET searchString = LOWER(searchString);


IF STRCMP(tblString,searchString) != 0 THEN

SET meta1 = dm(tblString);
SET meta2 = dm(searchString);
SET score1 = LEVENSHTEIN(tblString,searchString);
SET score2 = LEVENSHTEIN(meta1,meta2);
SET score3 = score3 - (score1*2);
SET score3 = score3 - (score2*4);

SET meta2 = CONCAT('%',meta2);
SET meta2 = CONCAT(meta2,'%');
IF meta1 NOT LIKE meta2 THEN
SET score3 = score3 -10;
END IF;

END IF;

RETURN score3;
END//


DELIMITER ;

Dailox
07.12.2016, 19:58
uff, danke euch :)

Der SQL Code sieht auch sehr interessant aus @Jut4h
Danke nochmals ^^