Ich habe Tausende von Listen mit Zeichenfolgen, und jede Liste enthält ungefähr 10 Zeichenfolgen. Die meisten Zeichenfolgen in einer bestimmten Liste sind sehr ähnlich, obwohl einige Zeichenfolgen (selten) völlig unabhängig von den anderen sind und einige Zeichenfolgen irrelevante Wörter enthalten. Sie können als verrauschte Variationen einer kanonischen Saite betrachtet werden. Ich suche einen Algorithmus oder eine Bibliothek, die jede Liste in diese kanonische Zeichenfolge konvertiert.
Hier ist eine solche Liste.
- Star Wars: Episode IV Eine neue Hoffnung | StarWars.com
- Star Wars Episode IV - Eine neue Hoffnung (1977)
- Star Wars: Episode IV - Eine neue Hoffnung - faule Tomaten
- Sieh dir Star Wars: Episode IV - Eine neue Hoffnung online kostenlos an
- Star Wars (1977) - Größte Filme
- [REC] 4 Poster verspricht Tod durch Außenbordmotor - SciFiNow
Für diese Liste wäre jede Zeichenfolge ^Star Wars:? Episode IV (- )?A New Hope$
akzeptabel, die mit dem regulären Ausdruck übereinstimmt .
Ich habe mir Andrew Ngs Kurs über maschinelles Lernen auf Coursera angesehen, aber ich konnte kein ähnliches Problem finden.
quelle
Antworten:
Als naive Lösung würde ich vorschlagen, zuerst die Zeichenfolgen auszuwählen, die die häufigsten Token in der Liste enthalten. Auf diese Weise können Sie irrelevante Zeichenfolgen entfernen.
Im zweiten Satz würde ich mit der Mehrheit abstimmen. Angenommen, die 3 Sätze:
Ich würde die Token einzeln durchgehen. Wir beginnen mit "Star". Es gewinnt, wenn alle Zeichenfolgen damit beginnen. "Wars" wird auch gewinnen. Der nächste ist ":". Es wird auch gewinnen.
Alle Token werden bis "Hope" mehrheitlich gewählt. Das nächste Zeichen nach "Hoffnung" ist entweder "|" oder "(" oder "-". Keiner von ihnen wird bei der Mehrheitswahl gewinnen, also werde ich hier aufhören!
Eine andere Lösung wäre wahrscheinlich die Verwendung der längsten gemeinsamen Teilsequenz .
Wie gesagt ich habe nicht viel darüber nachgedacht. Es könnte also viel bessere Lösungen für Ihr Problem geben :-)
quelle
Berechnen Sie zuerst den Bearbeitungsabstand zwischen allen Zeichenfolgenpaaren. Siehe http://en.wikipedia.org/wiki/Edit_distance und http://web.stanford.edu/class/cs124/lec/med.pdf . Schließen Sie dann alle Ausreißerzeichenfolgen aus, die auf einem bestimmten Abstandsschwellenwert basieren.
Mit den verbleibenden Zeichenfolgen können Sie die Abstandsmatrix verwenden, um die zentralste Zeichenfolge zu identifizieren. Abhängig von der verwendeten Methode erhalten Sie möglicherweise für einige Daten mehrdeutige Ergebnisse. Keine Methode ist perfekt für alle Möglichkeiten. Für Ihre Zwecke benötigen Sie lediglich einige heuristische Regeln, um Unklarheiten zu beseitigen - dh wählen Sie zwei oder mehr Kandidaten aus.
Vielleicht möchten Sie nicht "am zentralsten" aus Ihrer Liste der Zeichenfolgen auswählen, sondern stattdessen einen regulären Ausdruck generieren, der das Muster erfasst, das allen Nicht-Ausreißer-Zeichenfolgen gemeinsam ist. Eine Möglichkeit, dies zu tun, besteht darin, eine Zeichenfolge zu synthetisieren, die von allen Nicht-Ausreißer-Zeichenfolgen gleich weit entfernt ist. Sie können den erforderlichen Bearbeitungsabstand von der Matrix berechnen und dann zufällig regelmäßig generieren, indem Sie diese Abstände als Einschränkungen verwenden. Dann würden Sie reguläre Ausdrücke von Kandidaten testen und den ersten akzeptieren, der den Einschränkungen entspricht, und auch alle Zeichenfolgen in Ihrer Nicht-Ausreißer-Liste akzeptieren. (Erstellen Sie reguläre Ausdrücke aus den längsten allgemeinen Teilzeichenfolgenlisten, da dies keine Platzhalterzeichen sind.)
quelle