2012-05-19 9 views
10

ich habe zwei Wortlisten zu finden, die ein Beispiel:Ein Algorithmus gemeinsame Bearbeitungen

list 1 list 2 

foot fuut 
barj kijo 
foio fuau 
fuim fuami 
kwim kwami 
lnun lnun 
kizm kazm 

Ich mag würde nach Menge des Vorkommens bestellt werden, finden sollte

o → u # 1 and 3 
i → a # 3 and 7 
im → ami # 4 and 5 

Diese so Ich kann die diejenigen filtern, die nicht oft erscheinen.

Die Listen bestehen derzeit aus 35k Wörtern, die Berechnung sollte etwa 6h auf einem durchschnittlichen Server dauern.

+0

Wollen Sie auch das i -> a in 4 und 5 finden? Mit anderen Worten, würdest du zählen, dass ich zu a 4 mal oben oder nur 2 vorkommt? – ex0du5

+0

Gute Frage. Ich denke, wenn die Veränderung als Teil einer anderen Veränderung auftritt, sollte sie nicht gezählt werden. Also, ich zähle nur 2. – Reactormonk

+0

hast du ein Limit für die Länge der Wörter? –

Antwort

2

Meine letzte Lösung ist die Verwendung des Mosesdecoders. Ich habe die Wörter in einzelne Zeichen aufgeteilt und sie als Parallelkorpus verwendet und das extrahierte Modell verwendet. Ich habe Sursilvan und Vallader verglichen.

export IRSTLM=$HOME/rumantsch/mosesdecoder/tools/irstlm 
export PATH=$PATH:$IRSTLM/bin 

rm -rf corpus giza.* model 
array=("sur" "val") 
for i in "${array[@]}"; do 
    cp "raw.$i" "splitted.$i" 
    sed -i 's/ /@/g' "splitted.$i" 
    sed -i 's/./& /g' "splitted.$i" 
    add-start-end.sh < "splitted.$i" > "compiled.$i" 
    build-lm.sh -i "compiled.$i" -t ./tmp -p -o "compiled.lm.$i" 
    compile-lm --text yes "compiled.lm.$i.gz" "compiled.arpa.$i" 
done 

../scripts/training/train-model.perl --first-step 1 --last-step 5 -root-dir . -corpus splitted -f sur -e val -lm 0:3:$PWD/compiled.arpa.sur -extract-options "--SentenceId" -external-bin-dir ../tools/bin/ 

$HOME/rumantsch/mosesdecoder/scripts/../bin/extract $HOME/rumantsch/mosesdecoder/rumantsch/splitted.val $HOME/rumantsch/mosesdecoder/rumantsch/splitted.sur $HOME/rumantsch/mosesdecoder/rumantsch/model/aligned.grow-diag-final $HOME/rumantsch/mosesdecoder/rumantsch/model/extract 7 --SentenceId --GZOutput 

zcat model/extract.sid.gz | awk -F '[ ][|][|][|][ ]' '$1!=$2{print $1, "|", $2}' | sort | uniq -c | sort -nr | head -n 10 > results 
+0

Was ist mosesdecoder? Stellen Sie einige Links für verschiedene Teile Ihrer Lösung bereit. –

+1

'Moses ist ein kostenloses Programm zur maschinellen Übersetzung von statistischen Maschinen, das automatisches Training von Übersetzungsmodellen für jedes Sprachpaar bei einer Sammlung von Quell- und Zieltextpaaren (Parallelkorpus) ermöglicht. Es ist unter der LGPL-Lizenz veröffentlicht und sowohl als Quellcode als auch als Binärdateien für Windows und Linux verfügbar – Reactormonk

3

Sie können Edit-Distanzalgorithmen verwenden, z. B. Levenshtein distance. Es kann notwendig sein, einige geringfügige Änderungen in Algorithmen vorzunehmen, um genaue Änderungen zu registrieren.

+0

Suchen Sie nach dynamischer Programmierung und bearbeiten Sie Distanzalgorithmen. Sehen Sie ein gutes Tutorial hier: http://people.cs.umass.edu/~mccallum/courses/cl2006/lect4-strit.pdf –

10

Bearbeiten Abstand Algorithmen und Levenshtein Abstand wie LCS Methode sind vorteilhaft. Sie werden jedoch verwendet, um ein Wort in ein anderes zu ändern. Auf diese Weise können Sie herausfinden, wie Sie ein Wort mit möglichst wenigen Änderungen in ein anderes Wort ändern können. Aber sie sind nicht nützlich, um minimale Änderungen in zwei Wörterbüchern zu finden.

Das längste gemeinsame Teilfolge (LCS) Problem ist die längste Teilfolge gemeinsam für alle Sequenzen in einer Reihe von Sequenzen (oft nur zwei) zu finden. Beachten Sie, dass sich subsequence von einem Teilstring unterscheidet, siehe Teilstring vs. Teilsequenz. Es ist ein klassisches Informatikproblem, die Grundlage von Dateivergleichsprogrammen wie diff, und hat Anwendungen in der Bioinformatik.

von LCS oder anderen Methoden, für jedes Wort in list1, feststellen, dass, wie die Wort Änderungen auf einen anderen in Liste 2. zum Beispiel zwischen Fuß & Füßen: LCS = FT, Differenz = oo = > ee. Sie sollten einen zweiteiligen Graph erstellen, den der erste Teil aus Differenzwörtern erstellt, und den zweiten Teil aus list1. Jeder Knoten in dem zweiten Teil ist mit einer eigenen verwandten Differenz in dem ersten Teil verbunden.

Ich nehme an, Länge und Gesamtteil der Wörter sind begrenzt.

Wir können dieses Problem mit Graphen modellieren. Weisen Sie jede Änderung einem Knoten zu. z. B. e → i (die eine der Änderungen bestimmt) ist die Bezeichnung für einen Knoten. Zum Beispiel, wenn die gesamte Operation des Formulars p → q auf einen Teil im bipartiten Graphen gesetzt ist und die Gesamtdifferenz für jedes Wortpaar eins ist und Edge collection's definiert Edge uv verbindet Vertex U mit V wenn word (u) (im zweiten Teil), um zum korrekten Wort zu wechseln, braucht V's Änderungen. Sie haben einen maximalen 25 * 26 Knoten im ersten Teil (für dieses Beispiel). Wenn in Ihrem Fall Länge> = 1, so müssen Sie ein Limit festlegen. Ich nehme an, dass der größte Teil der Änderung für jedes Wort gleich 3 ist. Und so haben wir 3 * 35K maximalen Knoten im ersten Teil. Jetzt können Sie Problem lösen, indem Sie Satz des Knotens im ersten Teil wählen, der maximales Wort im zweiten Teil bedeckt werden kann (Ihre wählte sollte Wortänderung zum korrekten Wort vorkommen).

Suchen Sie in diesem Diagramm den minimalen Vertexschnitt, um den Knoten zu finden, den sie für Ihre Anfrage verwenden können. Wiederholen Sie den Schnittscheitelalgorithmus, bis Sie eine gute Antwort erhalten.

Sie können eine Art von Grenzen verwenden, um die Größe des Diagramms zu reduzieren, z. B. alle Knoten im ersten Teil mit dem Grad 1 zu entfernen, da diese Knoten mit genau einem Wort verbunden sind, also scheinen sie nutzlos zu sein.

Diese Graphensimulation kann Ihr Problem lösen. Mit der aktuellen Problembeschreibung funktioniert diese Algorithmusgrenze ordnungsgemäß.

zum Beispiel: enter image description here

Es ist beispielsweise für die Grenzen in diesem Graphen (entfernen alle Knoten im Betriebsteil, dass sie 1 Flanke haben):

1-entfernen Knoten 4, weil es nur angeschlossen ist (nicken), dann entfernen node (nicken) 2-entfernen node 2, weil es nur mit (sghoul) verbunden ist, dann entfernen Knoten (sghoul) 3-jetzt entfernen node 3, weil es nur verbunden ist (goud) [sghoul wird im letzten Schritt entfernt], entfernen Sie dann node (goud)

und jetzt haben Sie eine Operation oo => ee und Sie können dies wählen.

Ich werde mehr denken und versuchen, diesen Text zu bearbeiten.

Verwandte Themen