Data structures 多语言词典的数据结构?
一行摘要:为主要代表印欧语系的多语种词典建议最佳(查找速度/紧凑性)数据结构(底部列表) 假设你想建立一些数据结构来实现一个多语言词典,比如说互联网上排名前N(N~40)的欧洲语言,对语言的选择进行排序(这个问题底部给出了语言的大致列表)。 目的是存储每种语言的工作词汇(即英语25000个单词等),排除专有名词。不确定我们是否存储复数、动词变位、前缀等,或者添加特定于语言的规则,说明它们是如何由名词单数或动词词干构成的。 此外,您还可以选择我们如何编码和处理重音、双元音和特定语言的特殊字符,例如,可能的话,我们可以使用其他语言(例如,德语ß作为“ss”,然后添加一个规则来转换)。显然,如果您选择使用40-100个字符和一个trie,那么分支太多,而且大多数都是空的 任务定义:无论使用何种数据结构,都必须执行以下两项操作:Data structures 多语言词典的数据结构?,data-structures,dictionary,multilingual,Data Structures,Dictionary,Multilingual,一行摘要:为主要代表印欧语系的多语种词典建议最佳(查找速度/紧凑性)数据结构(底部列表) 假设你想建立一些数据结构来实现一个多语言词典,比如说互联网上排名前N(N~40)的欧洲语言,对语言的选择进行排序(这个问题底部给出了语言的大致列表)。 目的是存储每种语言的工作词汇(即英语25000个单词等),排除专有名词。不确定我们是否存储复数、动词变位、前缀等,或者添加特定于语言的规则,说明它们是如何由名词单数或动词词干构成的。 此外,您还可以选择我们如何编码和处理重音、双元音和特定语言的特殊字符,例如
语言包括: 可能主要是为了简单:英语、法语、西班牙语、德语、意大利语、瑞典语+阿尔巴尼亚语、捷克语、丹麦语、荷兰语、爱沙尼亚语、芬兰语、匈牙利语、冰岛语、拉脱维亚语、立陶宛语、挪威语、波兰语、葡萄牙语、罗马尼亚语、俄语、塞尔维亚-克罗地亚语、斯洛伐克语、斯洛文尼亚语+布莱顿语、加泰罗尼亚语、科西嘉语、世界语、盖尔语、威尔士语
可能包括俄语、斯拉夫语、土耳其语,不包括阿拉伯语、希伯来语、伊朗语、印度人等。也可能包括马来族。告诉我什么是可以实现的。我不确定这是否能解决您的特定问题,但这里有一个想法需要考虑 通常用于快速、紧凑表示语言的数据结构是该语言的最小状态DFA。您可以通过为该语言创建一个trie(它本身就是一个用于识别该语言中字符串的自动机),然后使用规范算法为该语言构造一个最小状态DFA来构造这个函数。这可能需要大量的预处理时间,但一旦构建了自动机,就可以非常快速地查找单词。您只需从“开始”状态开始,然后按照每个字母的标记转换进行操作。每个州都可以为每种语言编码(也许)一个40位值编码,无论该州是否对应于该语言中的一个单词 因为不同的语言使用不同的字母表,所以最好按字母表分开每种语言,这样可以最小化自动机的转换表的大小。毕竟,如果有使用拉丁字母和西里尔字母的单词,那么表示希腊单词的状态转换可能都是拉丁字母上的死状态,而表示拉丁单词的希腊字符的状态转换也可能是死状态。因此,为这些字母表中的每一个设置多个自动机可以消除大量的空间浪费。简单 为您的数据构造一个永久的(所有字典的联合,离线构造散列)
利用静态已知关键帧这一事实。不在乎你的口音等等(如果你想的话,在散列之前将其标准化)。我不会在这里赢得分数,但会赢得一些东西 多语言词典是一项庞大而耗时的工作。你没有详细说明你的字典的确切用途:可能是统计的,不是翻译的,不是语法的。。。。不同的用法需要收集不同的数据,例如,将“go”分类为传递时态 首先,在一个文档中,用一个编程接口原型来制定您的第一个需求。对于复杂的业务逻辑,我经常在算法概念之前询问数据结构。这样一来,一开始就错了,冒着风险。或者过早的优化,比如罗马化,这可能没有任何好处,并且禁止双向性 也许你可以从一些活跃的项目开始,比如;它的XML可能
Map<String /*Word*/, List<DefinitionEntry>> wordDefinitions;
Map<String /*Language/Locale/""*/, List<Definition>> definitions;
class Definition {
String content;
}
class DefinitionEntry {
String language;
Ref<Definition> definition;
}
import gnu.trove.map.*;
/**
* Map of word to DefinitionEntry.
* Key: word.
* Value: offset in byte array wordDefinitionEntries,
* 0 serves as null, which implies a dummy byte (data version?)
* in the byte arrary at [0].
*/
TObjectIntMap<String> wordDefinitions = TObjectIntHashMap<String>();
byte[] wordDefinitionEntries = new byte[...]; // Actually read from file.
void walkEntries(String word) {
int value = wordDefinitions.get(word);
if (value == 0)
return;
DataInputStream in = new DataInputStream(
new ByteArrayInputStream(wordDefinitionEntries));
in.skipBytes(value);
int entriesCount = in.readShort();
for (int entryno = 0; entryno < entriesCount; ++entryno) {
int language = in.readByte();
walkDefinition(in, language); // Index to readUTF8 or gzipped bytes.
}
}
AtoI[x.A] = BtoI[x.B] = CtoI[x.C] = DtoI[x.D] = i
ItoA[i] = x.A;
ItoB[i] = x.B;
ItoC[i] = x.C;
ItoD[i] = x.D;