我有两个单词列表,例如:
list 1 list 2
foot fuut
barj kijo
foio fuau
fuim fuami
kwim kwami
lnun lnun
kizm kazm
我想找到
o → u # 1 and 3
i → a # 3 and 7
im → ami # 4 and 5
这应该按出现次数排序,所以我可以过滤掉 那些不经常出现的。
列表目前包含35k字,计算应该 在平均服务器上花费大约6小时。
答案 0 :(得分:10)
编辑距离算法和Levenshtein距离就像LCS方法一样有益。但是它们用于将一个单词更改为另一个单词,通过这些方法,您可以找到如何将一个单词更改为另一个单词,并且更改量最少。但是它们对于在两个词典中找到最小量的更改没有用处。
最长的常见子序列(LCS)问题是找到最长的 序列集中所有序列共有的子序列(通常只是 二)。请注意,子序列与子字符串不同,请参阅 子串与子序列。这是一个经典的计算机科学问题, 文件比较程序的基础,如diff,和has 在生物信息学中的应用。
通过使用LCS或任何其他方法,对于list1中的每个单词,找到该单词如何更改为列表2中的另一个单词。 例如,在脚和脚之间脚:LCS = FT,差= oo => ee。 你应该制作一个二分图,第一部分由差异词组成,第二部分由list1组成。第二部分中的每个节点在第一部分中连接到它自己的相关差异。
我认为长度和单词的总数是有限的。
我们可以用图表模拟这个问题。将每个更改分配给一个节点。例如 e→i (确定其中一个更改)是一个节点的标签。
例如,如果形式p→q的所有操作都设置为二分图中的一个部分,并且每对单词的总差异等于1,则定义Edge集合,即边uv
连接顶点{{1} } U
如果用于更改为正确单词的单词(u)(在第二部分中)需要V的更改。在第一部分中有一个最大25 * 26的节点(对于此示例)。
if在您的情况下 length> = 1 ,因此您需要设置限制。我假设每个单词的最大部分变化是相等的3.因此我们在第一部分中有3 * 35K的最大节点。现在您可以通过选择第二部分中可以覆盖最大单词的第一部分中的节点集来解决问题(您选择的应该发生单词更改为正确的单词)。
在此图中找到最小顶点切割,找到它们可以提供请求的节点集。并重复切割顶点算法,直到获得良好答案。
你可以使用某种界限来减小图形的大小,例如删除第一部分中具有V
度的所有节点,因为这个节点只连接到一个单词,所以它们似乎没用
此图形模拟可以解决您的问题。 使用当前的问题陈述,这种算法界限可以正常工作。
例如:
这是图中边界的示例(删除操作部分中有1个边的所有节点):
1 - 删除节点4,因为它只连接到(nod),然后删除 node(nod)2 - 删除节点2,因为它只连接到 (sghoul),然后删除节点(sghoul)3 - 现在删除节点3,因为它是 只连接到(goud)[sghoul被移除最后一步],然后删除 节点(goud)
现在你有一个操作oo => ee,你可以选择这个。
我会考虑更多,并尝试编辑此文字。
答案 1 :(得分:3)
您可以使用编辑距离算法,例如Levenshtein distance。可能需要对算法进行一些微小的更改以注册精确的修改。
答案 2 :(得分:2)
我的最终解决方案是使用mosesdecoder。我将这些词分成了 单个字符并将它们用作平行语料库并使用 提取模型。我比较了Sursilvan和Vallader。
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