如何找到两种不同语言中具有相同外观的所有单词?

时间:2010-10-27 11:46:55

标签: python algorithm

俄语字母包含许多英文字母相同的字母。以下是常用字母列表:L='acekopuxy'

现在,给出两个巨大的列表 R E ,每个列表以[word_A,word_B,...]的形式,其中每个word_N是一个小写字,I想创建一个列表 C ,它应该只包含 E R 中拼写相同的单词。例如,单词'cop'必须位于 C 中,因为它位于 R 列表中以及 E 中。

有多项方法吗?

PS:一个重要的注意事项:由于字符编码不同,有两个 L 列表,LE表示英文字母,LR表示俄语,但字母外观相同:

LE='acekopuxy'
LR='асекориху'

4 个答案:

答案 0 :(得分:2)

你可以使用套装:

english_set = set(E)
russian_set = set(R)
common_words = english_set.intersection(russian_set)

我不确定我是否正确编码部分,但是如果这意味着看起来相似的字母实际上是不同的字节,您可以例如通过在做交叉之前用英语对应部分替换这些字母来准备俄语列表

答案 1 :(得分:1)

您可以使用正则表达式:

^[acekopuxy]+$

将匹配仅包含这些字符的单词。

import re
regex = re.compile(r"^[acekopuxy]+$", re.I)
output = []
for word in mylist:
    if regex.match(word):
        output.append(word)

您需要使用正确的编码对两个列表执行此操作。这意味着对于俄语列表,您需要使用等效字符,例如^[\u0441\u1234...]$

然后,如果要查找“看起来相同”的单词,可以使用转换表将列表中的单词转换为另一个列表的格式,然后将列表转换为集合,检查他们的十字路口。

答案 2 :(得分:1)

Eset = set(E)
C = [w for w in R if w.replace(LR,LE) in Eset]

不确定我是否正确理解了问题,但假设有良好的散列,则会在O( n )中运行。

答案 3 :(得分:1)

您需要自己告诉程序,哪些字符相似。由于它们是不同的Unicode代码点,因此您必须具有如下映射:

var RE_map = (
  (u'c', u'\u0441'),
  # ...and so on
)

然后,将所有单词从R翻译为他们的E表示:

for ec, rc in RE_map:
    string = string.replace(rc, ec)

并最后检查,如果该字符串现在位于E

if string in E:
    print "The word exists of characters similar in Latin and Cyrillic."