Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures 多语言词典的数据结构?_Data Structures_Dictionary_Multilingual - Fatal编程技术网

Data structures 多语言词典的数据结构?

Data structures 多语言词典的数据结构?,data-structures,dictionary,multilingual,Data Structures,Dictionary,Multilingual,一行摘要:为主要代表印欧语系的多语种词典建议最佳(查找速度/紧凑性)数据结构(底部列表) 假设你想建立一些数据结构来实现一个多语言词典,比如说互联网上排名前N(N~40)的欧洲语言,对语言的选择进行排序(这个问题底部给出了语言的大致列表)。 目的是存储每种语言的工作词汇(即英语25000个单词等),排除专有名词。不确定我们是否存储复数、动词变位、前缀等,或者添加特定于语言的规则,说明它们是如何由名词单数或动词词干构成的。 此外,您还可以选择我们如何编码和处理重音、双元音和特定语言的特殊字符,例如

一行摘要:为主要代表印欧语系的多语种词典建议最佳(查找速度/紧凑性)数据结构(底部列表)

假设你想建立一些数据结构来实现一个多语言词典,比如说互联网上排名前N(N~40)的欧洲语言,对语言的选择进行排序(这个问题底部给出了语言的大致列表)。 目的是存储每种语言的工作词汇(即英语25000个单词等),排除专有名词。不确定我们是否存储复数、动词变位、前缀等,或者添加特定于语言的规则,说明它们是如何由名词单数或动词词干构成的。 此外,您还可以选择我们如何编码和处理重音、双元音和特定语言的特殊字符,例如,可能的话,我们可以使用其他语言(例如,德语ß作为“ss”,然后添加一个规则来转换)。显然,如果您选择使用40-100个字符和一个trie,那么分支太多,而且大多数都是空的

任务定义:无论使用何种数据结构,都必须执行以下两项操作:

  • 查找中的主要操作是快速获得指示“是,这是语言a、B和F中的有效单词,但不是C、D或E”。因此,如果N=40种语言,您的结构将快速返回40个布尔值
  • 第二个操作是为每种语言返回该单词(及其所有变体)的指针/对象(如果无效,则返回null)。该指针/对象可以是用户定义的,例如词性和词典定义/同义词表明喻/其他语言的翻译列表/。。。它可以是特定于语言或独立于语言的(例如,比萨饼的共享定义)
  • 效率的主要衡量标准是a)紧凑性(跨所有N种语言)和b)查找速度的折衷。插入时间并不重要。紧凑性约束排除了浪费内存的方法,如“为每个单词保留一个单独的哈希”或“为每种语言保留一个单独的哈希,以及该语言中的每个单词”

    因此:

  • 可能的数据结构是什么,它们在 查找速度/紧凑度曲线
  • 您是否对所有N种语言有统一的结构,或将日耳曼语划分为一个子结构,斯拉夫语划分为 另一个等等?或者只是N个单独的结构(这将允许您 哈夫曼编码
  • 您对字符、重音和特定语言的特殊字符使用什么表示法
  • 理想情况下,提供算法或代码的链接,尤其是Python或C-
  • (我查过了,有相关的问题,但不是这个确切的问题。当然不是找SQL数据库。一篇2000年的论文可能有用:。还有一篇) 参考资料:两个在线多语言词典分别是和


    语言包括:

    可能主要是为了简单:英语、法语、西班牙语、德语、意大利语、瑞典语+阿尔巴尼亚语、捷克语、丹麦语、荷兰语、爱沙尼亚语、芬兰语、匈牙利语、冰岛语、拉脱维亚语、立陶宛语、挪威语、波兰语、葡萄牙语、罗马尼亚语、俄语、塞尔维亚-克罗地亚语、斯洛伐克语、斯洛文尼亚语+布莱顿语、加泰罗尼亚语、科西嘉语、世界语、盖尔语、威尔士语


    可能包括俄语、斯拉夫语、土耳其语,不包括阿拉伯语、希伯来语、伊朗语、印度人等。也可能包括马来族。告诉我什么是可以实现的。

    我不确定这是否能解决您的特定问题,但这里有一个想法需要考虑

    通常用于快速、紧凑表示语言的数据结构是该语言的最小状态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;