【问题标题】:How to find all words that have the same appearence in two different languages?如何找到在两种不同语言中具有相同外观的所有单词?
【发布时间】:2010-10-27 11:46:54
【问题描述】:

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

现在,给定两个巨大的列表 RE,每个都采用 [word_A, word_B, ...] 的形式,其中每个 word_N 都是小写单词,我想要创建一个列表 C,它应该只包含那些在 ER 中具有相同拼写的单词。例如,单词 'cop' 必须在 C 中,因为它在列表 R 以及 E 中。

有没有多项式的方法呢?

P.S.:一个重要提示:由于字符编码不同,有两个L列表,LE代表英文字母,LR代表俄文,但它们的字母外观是一样的:

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

【问题讨论】:

  • 请注意,并非所有字体的所有“对”都具有相同的字形;一个例子是“u”和“и”(或者,可能是“ц”)。请记住这一点,尤其是当您打算将转换后的文本提供给其他人时。

标签: python algorithm


【解决方案1】:

您可以为此使用集合:

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

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

【讨论】:

  • 由于字符编码不同,所以有两个L列表,LE代表英文字母,LR代表俄文,但是它们的字母外观是一样的。
  • set() 和 set.intersection() 的时间复杂度是什么?
  • O(n),其中 n 是最短集合的长度。
  • Python wiki 刚刚更新说 O(n) 是平均情况,O(n*m) 是最坏情况。
  • O(n×m) 最坏情况下设置交集的时间?我不敢相信。它可以在 O(min(m,n)) 内完成。
【解决方案2】:

你需要自己告诉程序,哪些字符是相似的。由于它们都是不同的 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."

【讨论】:

    【解决方案3】:

    您可以为此使用正则表达式:

    ^[acekopuxy]+$
    

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

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

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

    然后,如果您想找到“看起来相同”的单词,您可以使用翻译表将其中一个列表中的单词转换为另一个列表的格式,然后将列表转换为集合,然后检查他们的交点。

    【讨论】:

    • 我认为这行不通。俄语“c”实际上是 U+0441,依此类推。
    • 由于字符编码不同,所以有两个L列表,LE代表英文字母,LR代表俄文,但是它们的字母外观是一样的。
    【解决方案4】:
    Eset = set(E)
    C = [w for w in R if w.replace(LR,LE) in Eset]
    

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

    【讨论】:

      猜你喜欢
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      相关资源
      最近更新 更多