Texterkennung mit Pytorch?

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
Kyu
User
Beiträge: 3
Registriert: Dienstag 26. Juni 2018, 12:50

Hallo liebe Forengemeinde,

ich habe folgendes Problem. Ich benötige ein Programm, das dazu in der Lage ist, in maschinengeschriebenem(!) Text
Muster zu erkennen. Dabei geht es mir nicht um irgendwelche Muster, sondern lediglich um 2-3 verschiedene Eigenschaften,
die ein Text entweder hat oder nicht hat. Das möchte ich dem Programm "beibringen", indem ich es mit hunderten dieser
von mir von Hand ausgesuchten Texte füttere und dem Programm nach jedem "Scan" dieser Texte anschließend mitteile,
ob und wenn ja welche dieser 2-3 Eigenschaften zutreffen.

Die Software soll also eine wie auch imme geartete Struktur in diesen Texten erkennen und dann zukünftig von selbst dazu
in der Lage sein, diese 2-3 Eigenschaften zuverlässig einem Text zuzordnen.

Ein Bsp.: Ich füttere das Programm mit 100 Texten. In 50 dieser Texte geht es um Politik, in den anderen 50 geht es um Chemie.
Nachdem ich das Programm mit diesen 100 Texten gefüttert habe, und ihm gesagt habe, um was es in den einzelnen Texten geht,
sollte es zukünftig dazu in der Lage sein, mir zu sagen, ob es sich bei einem Text um Politik oder Chemie handelt.

Ich habe erst vor wenigen Monaten damit begonnen, Python zu lernen und habe meinen Spaß daran gefunden. Seit ich die
Basics kenne und einige kleine Programme geschrieben habe, möchte ich mich diesem Projekt widmen. Umsetzen möchte ich
mein Projekt mit Pytorch, da es relativ "high level" ist und demnach einfacher zu erlenen als etwa Tenserflow.

Meine Frage an euch:
Wo fange ich an und mit was? Sollte ich mir ein neuronales Netz basteln oder eher in Richtung DataMining gehen?
Ich bin abseits von Internetguides auf diesem Bereich völlig ahnungslos und weiß nicht wo ich anfangen soll. Da ich beruflich
nichts mit dem Programmieren zu tun habe, kann ich mich auch nicht unendlich tief damit befassen.

Berücksichtigt bei euren Antworten bitte, dass meine Mathekenntnisse auf Abi-Niveau sind (oder waren) ;-)

Vielen Dank :-)
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mir ist dein Problem noch nicht klar. Du schreibst von "maschinengeschriebenem" Text. Heisst das, dass du Bilder bzw. Scans des eigentlichen Textes hast? Und was ist denn die "wie auch immer geartetet Struktur"? Maschine Learning funktioniert nicht mit solchen vagen Angaben. "Wie Gesichtserkennung, nur fuer Trollpostings" geht nicht. Um ein solches Problem zu loesen, muss man trotz deep learning zumindest klar machen, was die Features sind, auf denen man aufsetzen will. Sind das Pixel-Strukturen, Schlagworte (wie dann spaeter von dir als Beispiel gegeben), die also schon eine OCR vorraussetzen (das geht *nicht* einfach mit einem grossen NN fuer alles!), oder worauf beziehen sich diese wundersamen Strukturen?

Wenn du da Hilfe moechtest, musst du dein Problem umfassend und so konkret wie moeglich beschreiben. Sonst ist da nicht vie zu zu sagen.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Erste Frage ist wahrscheinlich on „Texterkennung“ eigentlich „Textklassifizierung“ heissen sollte und „maschinengeschrieben“ eigentlich „maschinenlesbar“. Und selbst falls nicht, ob das überhaupt das Hauptproblem ist, oder ob das nicht einfach nur ein OCR-Schritt vor dem eigentlichen Problem ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Kyu
User
Beiträge: 3
Registriert: Dienstag 26. Juni 2018, 12:50

__deets__ hat geschrieben: Dienstag 26. Juni 2018, 14:46 Mir ist dein Problem noch nicht klar. Du schreibst von "maschinengeschriebenem" Text. Heisst das, dass du Bilder bzw. Scans des eigentlichen Textes hast? Und was ist denn die "wie auch immer geartetet Struktur"? Maschine Learning funktioniert nicht mit solchen vagen Angaben. "Wie Gesichtserkennung, nur fuer Trollpostings" geht nicht. Um ein solches Problem zu loesen, muss man trotz deep learning zumindest klar machen, was die Features sind, auf denen man aufsetzen will. Sind das Pixel-Strukturen, Schlagworte (wie dann spaeter von dir als Beispiel gegeben), die also schon eine OCR vorraussetzen (das geht *nicht* einfach mit einem grossen NN fuer alles!), oder worauf beziehen sich diese wundersamen Strukturen?

Wenn du da Hilfe moechtest, musst du dein Problem umfassend und so konkret wie moeglich beschreiben. Sonst ist da nicht vie zu zu sagen.

Zunächst einmal vielen Dank für deine Antwort. Mit "maschinengeschrieben" wollte ich nur klarstellen, dass es sich um gewöhnliche, am PC erstellte Dokumente handelt. Erwähnt habe ich das nur, weil im Moment ja viel damit experimentiert wird, Handschriften zu erkennen. Genau darum geht es bei meinem Problem nicht. Es geht auch nicht um einen Scan von Text.

Da hab ich mich schlecht ausgedrückt. Am Ende soll das Programm per copy-paste einen Text bekommen. Dann soll das Programm diesen Text lesen. Anschließend sage ich dem Programm, ob es in dem Text um Politik oder um Chemie gegangen ist. Das Programm merkt sich die Antwort und bekommt noch weitere Texte. Solange bis es gelernt hat, zwischen Politik und Chemie zu unterscheiden.

Mit Schlagworten ein Programm zu füttern habe ich mir auch überlegt, aber das geht dann ja nicht mehr in Richtung Deep Learning, sondern ist dann eine einfache Abfrage von if-clauses. Das könnte in etwa so aussehen:

#Ausschnitt aus meinem alten Programm
print(entry.get())
def ausg1():
if "Goße Koalition" in entry.get():
slabel = Label(root, text="Politik")
slabel.place(x=1050,y=350)

elif "Wasserstoff" in entry.get() or "Sauerstoff" in entry.get() or "H2O" in entry.get():
slabel = Label(root, text="Chemie")
slabel.place(x=1050,y=350)

So die Bauernmethode. Genau auf diese Art könnte ich theoretisch auch vorgehen, aber das möchte ich nicht, da es viel zu umständlich ist. Einfacher scheint es mir, ein neuronales Netz z.B. auf solche Dinge hinzutrainieren. Wenn die Software in 10 Texten z.B. "Große Koalition" gelesen hat und daraufhin mitgeteilt bekommen hat, dass es sich hierbei um Politik handelte, sollte es der Software am Ende möglich sein, diese Pattern zu erkennen.


Vielen vielen Dank für deine Hilfe, die ich echt zu schätzen weiß.


__blackjack__ hat geschrieben: Dienstag 26. Juni 2018, 14:52 Erste Frage ist wahrscheinlich on „Texterkennung“ eigentlich „Textklassifizierung“ heissen sollte und „maschinengeschrieben“ eigentlich „maschinenlesbar“. Und selbst falls nicht, ob das überhaupt das Hauptproblem ist, oder ob das nicht einfach nur ein OCR-Schritt vor dem eigentlichen Problem ist.
Ja zu beidem.
Textklassifizierung und maschinenlesbar trifft es.

Vielen Dank auch dir für deine Hilfe :-)
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kyu: Das mit dem `Label` erstellen und dann noch absolut platzieren sieht aber gar nicht gut aus. Normalerweise erstellt man eine GUI (ohne `place()`) und ändert dann nur in einem bereits vorhandenen `Label` den Text. Und die recht komisch benannte Funktion greift auch magisch auf alles zu.

So wäre das besser:

Code: Alles auswählen

def on_auswertung(entry, result_label):
    result_label['text'] = ''
    text = entry.get()
    for topic, keywords in [
        ('Politik', ['Große Koalition']),
        ('Chemie', ['Wasserstoff', 'Sauerstoff', 'H2O']),
    ]:
        if any(keyword in text for keyword in keywords):
            result_label['text'] = topic
            break
Wobei hier auch noch die Textanalyse mit der GUI vermischt ist — das trennt man auch besser, damit man die Analyse ohne GUI testen und wiederverwenden kann.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Fuer ein solches Problem solltest du dir mal anschauen, was SPAM-Filter machen, denn die versuchen ja das gleiche Problem zu loesen. Da geht zB schon sehr viel mit bayesischer Modellierung. Das sind eher "klassische" ML Verfahren, aber auch ein bisschen einfacher zu handhaben. In jedem Fall wichtig: bau einen Korpus von Beispielen fuer deine Klassen, zb getrennt in verschieden Verzeichnissen etc. Diesen Korpus kannst du dann mit verschiedenen Verfahren versuchen zu "knacken".
Kyu
User
Beiträge: 3
Registriert: Dienstag 26. Juni 2018, 12:50

__blackjack__ hat geschrieben: Dienstag 26. Juni 2018, 15:34 @Kyu: Das mit dem `Label` erstellen und dann noch absolut platzieren sieht aber gar nicht gut aus. Normalerweise erstellt man eine GUI (ohne `place()`) und ändert dann nur in einem bereits vorhandenen `Label` den Text. Und die recht komisch benannte Funktion greift auch magisch auf alles zu.

So wäre das besser:

Code: Alles auswählen

def on_auswertung(entry, result_label):
    result_label['text'] = ''
    text = entry.get()
    for topic, keywords in [
        ('Politik', ['Große Koalition']),
        ('Chemie', ['Wasserstoff', 'Sauerstoff', 'H2O']),
    ]:
        if any(keyword in text for keyword in keywords):
            result_label['text'] = topic
            break
Wobei hier auch noch die Textanalyse mit der GUI vermischt ist — das trennt man auch besser, damit man die Analyse ohne GUI testen und wiederverwenden kann.

Ich habe da keine Konventionen beim Programmieren gelernt, sondern mir das autodidaktisch beigebracht. Für das Chaos entschuldige ich mich. Ich kenne weder Tkinter noch Python vollständig, daher ist der code so barbarisch.


__deets__ hat geschrieben: Dienstag 26. Juni 2018, 15:43 Fuer ein solches Problem solltest du dir mal anschauen, was SPAM-Filter machen, denn die versuchen ja das gleiche Problem zu loesen. Da geht zB schon sehr viel mit bayesischer Modellierung. Das sind eher "klassische" ML Verfahren, aber auch ein bisschen einfacher zu handhaben. In jedem Fall wichtig: bau einen Korpus von Beispielen fuer deine Klassen, zb getrennt in verschieden Verzeichnissen etc. Diesen Korpus kannst du dann mit verschiedenen Verfahren versuchen zu "knacken".
Vielen Dank für den Tipp mit den Spamfiltern, das macht tatsächlich Sinn und ist eine sehr gute Idee. Hast du da einen Vorschlag hinsichtlich der Durchführung? Mit welchen Verfahren sollte man da beginnen? Neuronale Netze, Decision-Trees?

Aber vielen vielen Dank für eure Hilfe :-)


Hinweis: hier habe ich einen Link zu einem Video von einem Programm, das meiner Idee recht nahe kommt:
https://www.youtube.com/watch?v=SA8FxxVSVOk
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na, schau dir doch an, was populaere SPAM-Filter *machen*. Oder benutz sie einfach. Ich habe zB mal den hier erfolgreich fuer eine solche ja/nein Klassifikation benutzt: https://en.wikipedia.org/wiki/CRM114_(program)
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Eine andere, relativ einfach zu implementierende Variante zur Textklassifikation basiert auf dem Vergleich von N-Gram Profilen (das wird auch gerne zur Sprachidentifikation verwendet). Du erstellt dir Korpora, die einzelnen Zielkategorien entsprechen und erzeugst von diesen N-Gram Profile. Anschließend kannst du das Profil deines Eingabetexts mit den bekannten Profilen vergleichen und dann das mit der geringsten Abweichung auswählen. Das ist ein klassisches "vor-machine-learning" Verfahren, hat sich aber bewährt.
Antworten