Ontologie-basierte String-Klassifizierung

8

Ich habe vor kurzem begonnen, mit Ontologien zu arbeiten, und ich benutze Protege, um eine Ontologie zu erstellen, die ich auch für die automatische Klassifizierung von Strings verwenden möchte. Im Folgenden wird eine sehr einfache Klassenhierarchie dargestellt:

%Vor%

Schließlich sollten Zeichenfolgen wie Spain als CountryName oder UE4564 als PrefixedNumericString klassifiziert werden.

Ich bin mir jedoch nicht sicher, wie ich dieses Wissen modellieren soll. Müsste ich zuerst definieren, ob ein Zeichen alphabetisch, numerisch usw. ist, und dann ein Wort aus den vorhandenen Zeichen konstruieren oder gibt es eine Möglichkeit, Regexes zu verwenden? Bis jetzt habe ich es nur geschafft, Strings basierend auf einer exakten Phrase wie String and hasString value "UE4565" zu klassifizieren.

Oder wäre es besser, eine Regex für jede Klasse in der Ontologie zu sichern und dann die Zeichenkette mit diesen Regexes in Java zu klassifizieren?

    
Pedro 06.03.2012, 12:40
quelle

4 Antworten

6

Ein Ansatz, der hier angebracht sein könnte, insbesondere wenn die Ontologie groß / kompliziert ist oder sich in der Zukunft ändern könnte und angenommen wird, dass einige Fehler akzeptabel sind, ist maschinelles Lernen .

Ein Überblick über einen Prozess, der diesen Ansatz verwendet, könnte sein:

  1. Definieren Sie einen Funktionssatz, den Sie aus jeder Zeichenkette extrahieren können, in Bezug auf Ihre Ontologie (einige Beispiele unten).
  2. Sammle einen "Zugsatz" von Strings und ihre zutreffenden übereinstimmenden Kategorien.
  3. Extrahiere Features aus jeder Zeichenfolge und trainiere einen maschinellen Lernalgorithmus für diese Daten.
  4. Verwenden Sie das trainierte Modell zum Klassifizieren neuer Zeichenfolgen.
  5. Richten Sie Ihr Modell nach Bedarf ein oder aktualisieren Sie es (z. B. wenn neue Kategorien hinzugefügt werden).

Um etwas konkreter zu werden, hier einige Vorschläge, die auf Ihrem Ontologie-Beispiel basieren.

Einige boolesche Funktionen, die möglicherweise anwendbar sind: stimmt die Zeichenfolge mit einer Regexp überein (z. B. die Qtax schlägt vor); Liegt die Zeichenfolge in einer vordefinierten bekannten Stadtnamenliste vor? Existiert es in einer bekannten Länderliste? Existenz von Großbuchstaben; Stringlänge (nicht boolesch) usw.

Wenn Sie zum Beispiel insgesamt 8 Features haben: passen Sie zu den 4 oben erwähnten regulären Ausdrücken; und die zusätzlichen 4 vorgeschlagen hier, dann würde "Spanien" als (1,1,0,0,1,0,1,5) dargestellt werden (passend zu den ersten 2 regulären Ausdrücken, aber nicht die letzten beiden, ist ein Stadtname aber kein Ländername, hat einen Großbuchstaben und die Länge ist 5).

Dieser Feature-Satz repräsentiert eine beliebige Zeichenfolge.

um einen maschinellen Lernalgorithmus zu trainieren und zu testen, können Sie WEKA verwenden. Ich würde von Regel- oder Baum-basierten Algorithmen ausgehen, z. PART, RIDOR, JRIP oder J48.

Dann können die trainierten Modelle über Weka entweder von Java aus oder als externe Befehlszeile verwendet werden.

Offensichtlich stimmen die von mir vorgeschlagenen Merkmale fast 1: 1 mit Ihrer Ontologie überein, aber unter der Annahme, dass Ihre Taxonomie größer und komplexer ist, wäre dieser Ansatz wahrscheinlich einer der besten in Bezug auf die Kosteneffektivität.

    
etov 13.03.2012 14:32
quelle
2

Ich weiß nichts über Protege, aber Sie können Regex verwenden, um die meisten dieser Fälle zu vergleichen. Das einzige Problem wäre, zwischen dem Namen des Landes und der Stadt zu unterscheiden. Ich sehe nicht, wie Sie das ohne eine vollständige Liste von beiden machen könnten.

Hier sind einige Ausdrücke, die Sie verwenden könnten:

  • AlphabetischString:

    ^[A-Za-z]+\z (ASCII) oder ^\p{Alpha}+\z (Unicode)

  • AlphaNumericString:

    ^[A-Za-z0-9]+\z (ASCII) oder ^\p{Alnum}+\z (Unicode)

  • PrefixedNumericString:

    ^[A-Za-z]+[0-9]+\z (ASCII) oder ^\p{Alpha}+\p{N}+\z (Unicode)

  • NumerischeString:

    ^[0-9]+\z (ASCII) oder ^\p{N}+\z (Unicode)

Qtax 12.03.2012 14:46
quelle
2

Eine bestimmte Zeichenfolge ist eine Instanz. Daher benötigen Sie Code, um die grundlegenden Assertionen für die bestimmte Instanz zu erstellen. Dieser Code selbst könnte die Verwendung von regulären Ausdrücken enthalten. Sobald Sie diese Behauptungen haben, können Sie Ihre Ontologie verwenden, um über sie nachzudenken.

Der schwierige Teil ist, dass Sie entscheiden müssen, auf welchem ​​Level Sie modellieren werden. Sprechen Sie zum Beispiel über einzelne Charaktere? Sie können, aber es ist nicht unbedingt sinnvoll. Sie haben auch die Herausforderung, die sich aus der Tatsache ergibt, dass negative Informationen peinlich sind (da das Basismodell solcher Modelle intuitiv ist, IIRC), was bedeutet (zum Beispiel), dass Sie wissen, dass a string enthält ein numerisches Zeichen, aber nicht, dass es rein numerisch ist. Ja, Sie würden wissen, dass Sie keine Behauptung haben, dass die Instanz ein alphabetisches Zeichen enthält, aber Sie würden nicht wissen, ob das so ist, weil die Zeichenfolge keine hat oder weil niemand es noch gesagt hat. Dieses Zeug ist hart!

Es ist viel einfacher, eine Ontologie zu schreiben, wenn Sie genau wissen, welche Probleme Sie damit lösen wollen, da Sie damit zumindest herausfinden können, welche Fakten und Zusammenhänge Sie überhaupt erst erstellen müssen. Schließlich gibt es eine ganze Welt möglicher Dinge, die gesagt werden können, die wahr, aber irrelevant sind ("Wenn die Sonne seinen Hut hat, wird er zum Spielen kommen").

    
Donal Fellows 12.03.2012 15:49
quelle
1

Wenn Sie direkt auf Ihre Frage antworten, prüfen Sie zunächst, ob ein gegebenes Token numerisch, alphanumerisch oder alphabetisch ist (hier können Sie regex verwenden) und klassifizieren Sie es dann als solches. Im Allgemeinen wird der Ansatz, den Sie suchen, Generalisierungshierarchie von Token oder hierarchische Feature-Auswahl (Google it) genannt. Die Grundidee ist, dass Sie jedes Token als separates Element behandeln könnten, aber das ist nicht der beste Ansatz, da Sie nicht alle davon abdecken können [*]. Stattdessen verwenden Sie gemeinsame Merkmale unter den Tokens (z. B. 2000 und 1981 sind unterschiedliche Token, aber sie teilen ein gemeinsames Merkmal, 4-stellige Zahlen und möglicherweise Jahre zu sein). Dann haben Sie eine Klasse für vierstellige Zahlen, eine andere für alphanumerische und so weiter. Dieser Prozess der Generalisierung hilft Ihnen, Ihren Klassifizierungsansatz zu vereinfachen.

Wenn Sie mit einer Token-Zeichenfolge beginnen, müssen Sie sie häufig vorverarbeiten (z. B. Interpunktion oder spezielle Symbole entfernen, nicht relevante Wörter entfernen, Stemming usw.). Aber vielleicht können Sie einige Symbole verwenden (zB Interpunktion zwischen Städten und Ländern - zB Melbourne, Australia ), also weisen Sie diese Menge nützlicher Interpunktionszeichen einem anderen Symbol zu ( # ) und verwenden Sie diese als Kontext (also beim nächsten Mal Wenn Sie ein unbekanntes Wort neben einem Komma neben einem bekannten Land finden, können Sie dieses Wissen verwenden, um davon auszugehen, dass das unbekannte Wort eine Stadt ist.

Wie auch immer, das ist die allgemeine Idee hinter der Klassifizierung mit einer Ontologie (basierend auf einer Taxonomie von Begriffen). Vielleicht möchten Sie auch Wort-zu-Wort-Tags lesen.

Wenn Sie übrigens nur 3 Kategorien haben möchten (numerisch, alphanumerisch, alphabetisch), wäre die Verwendung von eine praktikable Option Bearbeitungsentfernung (was ist wahrscheinlicher, dass UA4E30 zu der alphanumerischen oder numerischen Kategorie gehört, wenn man bedenkt, dass es nicht dem traditionellen Format der vorangestellten numerischen Zeichenfolgen entspricht?). Sie gehen also von Kosten für jede Operation aus (Einfügen, Löschen, Ersetzen), die Ihr unbekanntes Token in ein bekanntes Token verwandelt.

Schließlich, obwohl Sie sagten, dass Sie Protege verwenden (die ich nicht verwendet habe), um Ihre Ontologie zu erstellen, möchten Sie vielleicht WordNet .

[*] Es gibt probabilistische Ansätze, die Ihnen helfen, eine Wahrscheinlichkeit für ein unbekanntes Token zu bestimmen, also ist die Wahrscheinlichkeit eines solchen Ereignisses nicht Null. Normalerweise geschieht dies im Zusammenhang mit Hidden-Markov-Modellen. Eigentlich könnte dies nützlich sein, um den Vorschlag von etov zu verbessern.

    
Robert Smith 16.03.2012 18:53
quelle