Basic NLP in CoffeeScript oder JavaScript - Punkt tokenizaton, einfach trainierte Bayes-Modelle - wo fange ich an?

8

Mein aktuelles Web-App-Projekt verlangt nach etwas NLP:

  • Tokenisierung von Texten in Sätze, über Punkt und ähnliches;
  • Unterbrechen der längeren Sätze durch Nebensatz (oft ist es Komma, außer wenn es nicht ist)
  • Ein Bayes-Modell, das sich für Chunking-Absätze mit einem gleichmäßigen Feeling eignet, keine Waisen oder Witwen und minimale unbeholfene Splits (vielleicht)

... was ist das meiste eine kindisch leichte Aufgabe, wenn du NLTK hast - was ich tue, sozusagen: das App-Backend ist Django auf Tornado; Sie würden denken, diese Dinge zu tun wäre kein Thema.

Allerdings muss ich dem Benutzer Feedback geben, für das die Tokenizer erforderlich sind. Daher muss ich die Daten clientseitig tokenisieren.

Im Moment benutze ich am mit NLTK, über einen REST-API-Aufruf an einen Tornado-Prozess, der die NLTK-Funktion und wenig anderes umschließt. Im Moment sind Dinge wie Latenz und Nebenläufigkeit offensichtlich suboptimal zu diesem Ad-hoc-Dienst, um es höflich auszudrücken. Was ich tun sollte, denke ich, ist es, Kaffee / Java-Versionen dieser Funktion in die Hände zu bekommen, wenn ich sie nicht selbst neu implementiere.

Und dann aber, von dem, was ich gesehen habe, wurde JavaScript nicht lange genug als cool angesehen, um die nicht-nur-Web-spezifische, universelle Bibliothek Schmorgasbörd angesammelt zu haben, die man in C oder Python (oder sogar Erlang). NLTK ist natürlich ein herausragendes Projekt von Anyones Maßnahme, aber ich brauche nur ein paar Prozent von dem, was es verpackt.

Aber jetzt bin ich am Scheideweg - ich muss beides verdoppeln:

  • Die "lernende wissenschaftliche JavaScript-Technik, die für die Neuimplementierung von Algorithmen geeignet ist, mit denen ich bestenfalls Facebook befreundet bin", oder:
  • Die weniger interessante, aber deterministischere Möglichkeit, sich mit dem Tokenizing über den Draht zu begnügen, aber den Mangel an Geschwindigkeit und Programmierinteresse zu überkompensieren, stellt ein Beachball-freies UX sicher, indem er einen Funktionsaufruf zu einem leistungsfähigen Leistungserbringer macht Architektur, so dass Facebook wie eine Google+ Option aussieht.

Oder etwas ganz anderes. Was soll ich machen? Ich möchte Dinge anfangen. Das ist meine Frage. Ich bin offen für Lösungen mit einem atypischen Ansatz - solange Ihre Empfehlung nicht unangenehm ist (z. B. "Silverlight verwenden") und / oder ein Zeitstrudel (z. B. "Computerlinguistik-Doktortitel") Ich bin ein Spiel. Vielen Dank im Voraus.

    
fish2000 15.03.2012, 13:54
quelle

3 Antworten

3

Ich denke, dass, wie Sie im Kommentar geschrieben haben, die Menge an Daten, die für effiziente Algorithmen benötigt werden, Sie daran hindern werden, Dinge auf der Client-Seite zu tun. Selbst die grundlegende Verarbeitung benötigt viele Daten, zum Beispiel Bigram / Trigramm-Frequenzen usw. Andererseits benötigen symbolische Ansätze auch signifikante Daten (Grammatikregeln, Wörterbücher usw.). Aus meiner Erfahrung können Sie keinen guten NLP-Prozess ohne mindestens 3MB bis 5MB Daten ausführen, was meiner Meinung nach für die heutigen Kunden zu groß ist.

Also würde ich Dinge über den Draht machen. Dafür würde ich einen asynchronen / Push-Ansatz empfehlen, vielleicht Faye oder Socket.io? Ich bin sicher, dass Sie ein perfektes und flüssiges UX erreichen können, solange der Benutzer nicht festsitzt, während der Client darauf wartet, dass der Server den Text verarbeitet.

    
Blacksad 15.03.2012, 15:14
quelle
3

Es gibt eine ziemlich nette Verarbeitung natürlicher Sprache für node.js namens natürlich . Es ist derzeit nicht für die Ausführung im Browser gebaut, aber die Autoren haben angegeben , dass sie das beheben wollen. Das meiste könnte sogar schon funktionieren, wenn man etwas wie browserify oder Require.JS .

    
quelle
1

Ich denke, Sie sollten einen separaten Dienst bereitstellen, der vom Rest Ihrer App unabhängig ist, der die meiste Seite des Arbeitsservers erledigt, aber mehrere Optionen an den Client senden kann, je nachdem, was der Client als nächstes eingibt. Wenn ich über Ihre Anforderungen lese, denke ich an die Suchautovervollständigung von Websites wie Google, Quora und Yelp. Sie haben möglicherweise nur drei oder vier Zeichen in das Suchfeld eingegeben, aber diese Dienste hätten mehrere Suchanfragen gesendet, die auf dem basieren, was Sie als nächstes eingeben werden. Wenn Sie Text dynamisch mit einem Token versehen, können Sie eine Art von ngram-Modell (oder ein anderes komplexes Sprachmodell) erraten, wann der Satz endet, und dem Frontend mitteilen, was für die wahrscheinlichsten zukünftigen Ergebnisse zu tun ist. Im Grunde haben Sie einen Backend-Service, der viele Ergebnisse vorberechnen kann und ein semi-intelligentes Frontend hat, das prüfen kann, ob der aktuelle Status der Benutzereingaben mit den vorhergesagten Zuständen übereinstimmt, die das Backend einige 100 Millisekunden früher und scheinbar gesendet hat tun sofort das Richtige vor dem Client, ohne ihren Browser aufzuhängen, indem er versucht, einige speicher- / rechenintensive Aktionen direkt dort durchzuführen.

Die zwei Optionen, die Sie vorgestellt haben, sind
1) alles auf der Client-Seite tun, was schnell, aber sehr kompliziert sein kann, da keine Bibliotheken für nlp js vorhanden sind

2) alles serverseitig zu tun, was einfacher ist, aber Ihre Anwendung für den Benutzer zu verzögern scheint

Ich bitte Sie,

zu tun

3) alles serverseitig zu machen, aber ein paar Schritte voraus zu denken und mehrere Optionen an den Client zu senden, damit die Arbeit an einem Ort erledigt wird, an dem es einfacher für Sie ist, aber der Client fühlt sich sofort an .

    
Aditya Mukherji 16.03.2012 04:42
quelle