Vorlagen mit Parametern in Textfragmenten identifizieren

7

Ich habe einen Datensatz mit Textfragmenten mit einer festen Struktur, die Parameter enthalten kann. Beispiele sind:

 Temperature today is 20 centigrades
 Temperature today is 28 centigrades

oder

 Her eyes are blue and hair black.
 Her eyes are green and hair brown.

Das erste Beispiel zeigt eine Vorlage mit einem numerischen Parameter. Die zweite ist eine Vorlage mit zwei Faktorparametern.

Die Anzahl der Vorlagen und die Anzahl der Parameter ist nicht bekannt.

Das Problem besteht darin, die Vorlagen zu identifizieren und jedes Textfragment der entsprechenden Vorlage zuzuweisen.

Die naheliegende erste Idee ist die Verwendung von Clustering. Das Abstandsmaß ist als eine Anzahl nicht übereinstimmender Wörter definiert. Das heißt, die Datensätze in Beispiel 1 haben Abstand 1, in Beispiel 2 beträgt Abstand 2. Der Abstand zwischen dem Datensatz in Beispiel 1 und 2 beträgt 7. Dieser Ansatz funktioniert einwandfrei, vorausgesetzt, die Anzahl der Cluster ist bekannt, was nicht der Fall ist es ist nicht nützlich.

Ich kann mir einen programmatischen Ansatz vorstellen, bei dem die Entfernungsmatrix nach Datensätzen mit vielen Nachbarn in Entfernung 1 (oder 2,3, ..) durchsucht wird, aber ich bin gespannt, ob ich einen unbeaufsichtigten Algorithmus für maschinelles Lernen anwenden kann, um das Problem zu lösen. R ist bevorzugt, aber nicht erforderlich.

Marmite Bomber
quelle
1
Ich bin kein NLP-Experte. Warum sollten Sie nicht in Betracht ziehen, eine LSA für den gesamten Korpus durchzuführen und dann die entsprechenden Scores in einem Clustering-Algorithmus zu verwenden? Das würde leicht die Tatsache beseitigen, dass verschiedene Vorlagen unterschiedliche numerische Parameter haben. Das Ermitteln der Anzahl von Clustern würde dann einem methodischen Standardverfahren folgen (z. B. Mittel / AIC). kk
usεr11852
@ usεr11852 Ich freue mich über Ihren Vorschlag, aber interessanterweise erhalte ich mit der einfachen Entfernung auf TermDocumentMatrix (tm) ein besseres Ergebnis als mit LSA. Ich nehme an, dies liegt an der festen Struktur meiner Vorlagen, z. B. ist die Reihenfolge der Begriffe für die Entfernung relevant. Ich denke intuitiv, dass es eine einfache elementare Lösung für mein Problem geben muss, wahrscheinlich basierend auf der Distanzmatrix, aber Sie können Ihren Vorschlag gerne als Antwort formulieren, damit ich ihn honorieren kann.
Marmite Bomber
@ usεr11852 Die Schwierigkeiten mit LSA wurden verursacht durch: 1) Probleme beim Ignorieren kurzer Begriffe - der Parameter wordLengths 2) nicht transformierte IDF-Anwendung. Ich habe eine Antwort hinzugefügt, die sich beiden Problemen nähert.
Marmite Bomber

Antworten:

3

Das Grundprinzip des folgenden Vorschlags besteht darin, "Eigenvektoren" und "Vorlagen" zuzuordnen.

Insbesondere könnte man LSA für den gesamten Korpus verwenden, basierend auf einer Tüte mit Wörtern. Die resultierenden Eigenvektoren würden als Ersatzvorlagen dienen; Diese Eigenvektoren sollten nicht direkt von der Anzahl der Wörter in jeder Vorlage beeinflusst werden. Anschließend könnten die Bewertungen verwendet werden, um die Dokumente nach einem Standardverfahren (z. B. Mittel in Verbindung mit AIC) zusammenzufassen. Als Alternative zu LSA könnte man NNMF verwenden. Lassen Sie mich darauf hinweisen, dass die LSA (oder NNMF) wahrscheinlich eher mit der transformierten TF-IDF als mit der Rohwortzählmatrix durchgeführt werden müsste.k

usεr11852
quelle
Ich habe eine Antwort hinzugefügt, die auf transformierter IDF basiert, um zwischen den Parametern und den Vorlagenbegriffen zu unterscheiden. Da dies meine erste Verwendung von transformiertem IDF ist, würde ich es begrüßen, den Ansatz zu kommentieren.
Marmite Bomber
1
Ich bin froh, dass ich helfen konnte.
usεr11852
3

Sie können word2vec verwenden , um Phrasen im Korpus zu identifizieren . Das Vorhandensein einer Phrase (anstelle einzelner Token) weist wahrscheinlich auf eine "Vorlage" hin.

Von hier aus sind die Token, die Ihrer Vorlagenphrase am ähnlichsten sind, wahrscheinlich die Werte für Ihre Parameter.

jamesmf
quelle
danke für den Vorschlag. Dies funktioniert einwandfrei, wenn der Fixteil (Vorlage) führend ist, gefolgt von den Parametern. Ich werde "Temperatur heute ist" als Ausdruck erkennen, aber ich werde wahrscheinlich Probleme haben, zu unterscheiden, ob 20 und Celsius Parameter oder Teil der Vorlage in meinem Beispiel sind.
Marmite Bomber
Richtig - aber wenn Sie dann die Wörter auflisten, die "Temperatur heute" am ähnlichsten sind, würden Sie erwarten, dass "Celsius" im Wesentlichen genau gleich ist (und daher Teil der Vorlage ist), während "20" (oder andere Temps) wird ziemlich ähnlich sein, aber viel weniger.
Jamesmf
1

Das folgende Skript verwendet LSA mit transformierter IDF, um die Parameter von Vorlagen abzuschneiden. Die Idee ist, dass alle Terme mit einer höheren IDF als einem bestimmten Schwellenwert als Parameter betrachtet werden und ihre Frequenz auf Null zurückgesetzt wird. Der Schwellenwert kann mit dem durchschnittlichen Vorkommen der Schablone im Korpus angenähert werden. Wenn Sie die Parameter eliminieren, ist der Abstand der Datensätze mit derselben Vorlage Null.

 library(tm)
 library(lsa)
 df <- data.frame(TEMPLATE = c(rep("A",3),rep("B",3),rep("C",3)),
 TEXT = c(
 paste("Temperature today is",c(28,24,20),"centigrades"),
 paste("Temperature today is",c(82,75,68),"Fahrenheit"),
 paste("Her eyes are ",c("blue","black","green"), "and hair",c("grey","brown","white"))) , stringsAsFactors=FALSE)
> df     
   TEMPLATE                                TEXT
 1        A Temperature today is 28 centigrades
 2        A Temperature today is 24 centigrades
 3        A Temperature today is 20 centigrades
 4        B  Temperature today is 82 Fahrenheit
 5        B  Temperature today is 75 Fahrenheit
 6        B  Temperature today is 68 Fahrenheit
 7        C    Her eyes are  blue and hair grey
 8        C  Her eyes are  black and hair brown
 9        C  Her eyes are  green and hair white

 corpus <- Corpus(VectorSource(df$TEXT))
 td <- as.matrix(TermDocumentMatrix(corpus,control=list(wordLengths = c(1, Inf)) ))

 > td             Docs
 Terms         1 2 3 4 5 6 7 8 9
   20          0 0 1 0 0 0 0 0 0
   24          0 1 0 0 0 0 0 0 0
   28          1 0 0 0 0 0 0 0 0
   68          0 0 0 0 0 1 0 0 0
   75          0 0 0 0 1 0 0 0 0
   82          0 0 0 1 0 0 0 0 0
   and         0 0 0 0 0 0 1 1 1
   are         0 0 0 0 0 0 1 1 1
   black       0 0 0 0 0 0 0 1 0
   blue        0 0 0 0 0 0 1 0 0
   brown       0 0 0 0 0 0 0 1 0
   centigrades 1 1 1 0 0 0 0 0 0
   eyes        0 0 0 0 0 0 1 1 1
   fahrenheit  0 0 0 1 1 1 0 0 0
   green       0 0 0 0 0 0 0 0 1
   grey        0 0 0 0 0 0 1 0 0
   hair        0 0 0 0 0 0 1 1 1
   her         0 0 0 0 0 0 1 1 1
   is          1 1 1 1 1 1 0 0 0
   temperature 1 1 1 1 1 1 0 0 0
   today       1 1 1 1 1 1 0 0 0
   white       0 0 0 0 0 0 0 0 1

 ## supress terms with idf higher than template frequency
 ## those terms are considered as parameters
 template_freq <- 3
 tdw <- lw_bintf(td) * ifelse(gw_idf(td)> template_freq,0, gw_idf(td))
 dist <- dist(t(as.matrix(tdw)))

 > dist
          1        2        3        4        5        6        7        8
 2 0.000000                                                               
 3 0.000000 0.000000                                                      
 4 3.655689 3.655689 3.655689                                             
 5 3.655689 3.655689 3.655689 0.000000                                    
 6 3.655689 3.655689 3.655689 0.000000 0.000000                           
 7 6.901341 6.901341 6.901341 6.901341 6.901341 6.901341                  
 8 6.901341 6.901341 6.901341 6.901341 6.901341 6.901341 0.000000         
 9 6.901341 6.901341 6.901341 6.901341 6.901341 6.901341 0.000000 0.000000

Die Distanzmatrix zeigt deutlich, dass die Datensätze 1,2,3 aus derselben Vorlage stammen (Distanz = 0 mit den synthetischen Daten; in einem realen Fall sollte ein kleiner Schwellenwert verwendet werden). Gleiches gilt für die Datensätze 4,5,6 und 7,8,9.

Marmite Bomber
quelle