字母表中的独特字母

时间:2018-02-28 15:31:03

标签: python

我想用独特的字母用语言写一个简单的文本分类器,仅用于实验 例如,我对每种语言都有alphabet作为集合的dict,其中包含以下键:['ru', 'uk', 'pl', 'en', 'de', 'be', ...]。 例如,独特的波兰语字母是“ę”和“ś”,英语没有独特的字母。 事实上,我应该找到所有不属于其他语言的字母。我是这样做的(简单例子):

alphabets = {'it': {'a', 'b', 'c', 'd', 'e', 'à', 'ì'},
             'en': {'a', 'b', 'c', 'd', 'e'},
             'pl': {'a', 'b', 'c', 'd', 'e', 'ę', 'ś'}}

def union_others(except_lang):
    res = set()
    for lang in alphabets:    
        if lang != except_lang:
            res = res | alphabets[lang]
   return res

unique = {lang: set() for lang in alphabets}
for lang in alphabets:
    unique[lang] = alphabets[lang] - union_others(lang)

print(unique['pl'])

我得到以下输出:{'ę', 'ś'}

有没有简单的方法(没有循环)来获得除当前语言之外的所有语言集合的联合而不是使用union_others(lang)函数?

3 个答案:

答案 0 :(得分:1)

列出理解。

alphabets = {'it': {'a', 'b', 'c', 'd', 'e', 'à', 'ì'},
             'en': {'a', 'b', 'c', 'd', 'e'},
             'pl': {'a', 'b', 'c', 'd', 'e', 'ę', 'ś'}}

def f(k, d):
    #return [x for x in d[k] if any(x not in v for k,v in d.items())]
    return {x for x in d[k] if any(x not in v for k,v in d.items())}


print(f('pl', alphabets))
print(f('en', alphabets))
print(f('it', alphabets))

答案 1 :(得分:1)

你可能无法完全摆脱循环,但你可以使用短路来提高效率。在大多数情况下,语言不会有任何真正独特的字符,因此您可以尽早摆脱循环,有效避免每次构建完整的其他语言:

def delta(lang):
    d = set(alphabets[lang]) # make a copy
    for key, alphabet in alphabets.items():
        if key == lang:
            continue
        d -= alphabet
        if not d:
            break
    return d

unique = {lang: delta(lang) for lang in alphabets}

IDEOne Link

这也会更快一些,因为你减去的集合几乎可以立即减少元素,从而进一步加快了差异操作。

现在,如果你对语言的相似性有一些先验知识,你可以用它来为每种语言预先排序alphabets,这样它的独特集合几乎可以立即减少到最低限度。

答案 2 :(得分:-1)

您可以创建一个由所有语言组合的集合。

然后你可以得到这个大集和英语集之间的差异,以获得唯一的值。

当然,您需要某种迭代方法来创建大型集合。

编辑:这是假设您要排除的语言是英语。如果它是另一种语言,那么您需要获得大集和所述语言集之间的差异。如果你想要所有语言,那么你应该对每种语言都遵循这个过程并循环使用这些语言。