我想用独特的字母用语言写一个简单的文本分类器,仅用于实验
例如,我对每种语言都有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)
函数?
答案 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}
这也会更快一些,因为你减去的集合几乎可以立即减少元素,从而进一步加快了差异操作。
现在,如果你对语言的相似性有一些先验知识,你可以用它来为每种语言预先排序alphabets
,这样它的独特集合几乎可以立即减少到最低限度。
答案 2 :(得分:-1)
您可以创建一个由所有语言组合的集合。
然后你可以得到这个大集和英语集之间的差异,以获得唯一的值。
当然,您需要某种迭代方法来创建大型集合。
编辑:这是假设您要排除的语言是英语。如果它是另一种语言,那么您需要获得大集和所述语言集之间的差异。如果你想要所有语言,那么你应该对每种语言都遵循这个过程并循环使用这些语言。