Dictionary 如何在一个小空间内将一本大词词典放在对准确性影响最小的地方?

Dictionary 如何在一个小空间内将一本大词词典放在对准确性影响最小的地方?,dictionary,machine-learning,lookup,trie,Dictionary,Machine Learning,Lookup,Trie,我试图实现一个文字游戏使用微控制器,它只允许30kb的数据。为此,我需要从一个特定的允许单词字典中查找单词,解压时该字典的大小几乎为4MB 我不需要每次都给出正确的答案,这样我就可以在准确性上妥协。是否有一种方法可以在30kb的空间中容纳4MB的词典,并且准确度损失最小 我已经尝试过使用建议的优化的“trie”数据结构,使用压缩的trie生成器,将大小从4mb降低到740kb,但我无法找到一种方法,在不丢弃大量单词的情况下使其变小 “trie”总是给我正确的答案。有没有一种方法可以通过精确的权衡

我试图实现一个文字游戏使用微控制器,它只允许30kb的数据。为此,我需要从一个特定的允许单词字典中查找单词,解压时该字典的大小几乎为4MB

我不需要每次都给出正确的答案,这样我就可以在准确性上妥协。是否有一种方法可以在30kb的空间中容纳4MB的词典,并且准确度损失最小

我已经尝试过使用建议的优化的“trie”数据结构,使用压缩的trie生成器,将大小从4mb降低到740kb,但我无法找到一种方法,在不丢弃大量单词的情况下使其变小

“trie”总是给我正确的答案。有没有一种方法可以通过精确的权衡来缩小规模,并制定出一个在大多数情况下都能给我正确答案的结构? 也许我可以使用机器学习模型或与之相关的东西

我知道这几乎是不可能的。但是游戏的设计使得你不需要准确的答案。即使精度在25%左右也是合理的

我可以把最长的单词删掉,直到这本字典适合那个尺寸为止。但在这种情况下,这可能不是最好的办法

在30kb的空间中安装4MB的字典,并将准确性损失降至最低

字典文件的格式可能是每行一个单词,对吗?这是一种非常有效的存储单词列表的方法

所以我想说,不,4MB的数据永远不会,永远不会放在30kb的空间里。没有压缩,没有有效存储,现在没有,永远没有


想想看:4MB实际上是30kb限制大小的100倍多。显然,您必须在磁盘上迭代字典,也许还要缓存结果。

不幸的是,我不得不同意这里出现的共识。我已经编写了一些类似的软件(一个拼字机器人),所以我参考了我的代码并进行了一些计算。我使用的是SOWPODS字典,它实际上比你描述的要小一些——267751个单词,未压缩的单词占2707014字节

使用trie数据结构对于实现玩类似拼字游戏的AI至关重要,这不仅因为它减少了内存中字典的大小,还因为基本结构大大降低了搜索功能的计算复杂性。当您尝试可能的排列时,您可以在碰到trie中的一片叶子时立即停止。我之所以提出这一点,是因为如果您试图使用Arduino来实现这一点,您将不可避免地需要确保代码在速度方面非常高效

但是为了使用trie来确保合理的性能,这也意味着您需要在节点之间建立链接,并且通过在32位体系结构上的简单实现,这些链接将每个占用4个字节。您可能可以实现更高级的逻辑,将节点减少为每个存储2字节的偏移量(2^15表示内存中的偏移量,额外的位表示该节点是否表示一个字)。但即便如此,这也意味着您需要trie具有15K个节点(实际上更少,因为您也需要一些代码)

我玩弄了一下限制单词的最大大小,看看有什么必要将节点的数量降到足够低的程度。。。坏消息是,您最多只能存储4个字符的单词!以下是每个最大大小的节点数:

15: 589315
14: 572754
13: 546969
12: 508959
11: 456252
10: 387321
9: 304186
8: 212237
7: 126700
6: 63605
5: 25776
4: 8208
所以,基本上,当你把字典的大小缩小到足够小的时候,使用更复杂的算法就不再有价值了。只是没有足够的内存让它工作

作为对使用机器学习模型的想法的回应,我的经验是,构建一个能够达到甚至合理精度的功能模型通常需要相当大的内存,而获得合理的性能需要中等功能的硬件,即使只执行预测。(培训费用非常昂贵,但你可以在离线状态下进行。)

根据所需的效率,即使是从磁盘读取数据库也可能不是一件容易的事。缓存只能让你做到这一点

老实说,我认为@TypeKatz的建议是最合理的。Arduino并不是为这种应用而设计的,所以最好的办法是将计算成本高、内存密集型的处理工作转移到外部设备上。您可以通过串行端口使用连接的设备,或者投资Wifi屏蔽并与附近的服务器通信


无论如何,祝你好运

“Arduino的代码大小限制为30kb”-具体是什么限制?你的字典不应该嵌入到你的Python代码中。我同意你应该根据特定的Arduino将字典保存在你的数据部分,他可能没有太多选择,字典将不得不在代码部分结束。对于他如何在Arduino上使用Python,我有点不知所措。这里唯一的选择可能是找到一本大大缩小的字典,这可能会使类似拼字游戏的游戏完全无法玩。诸如此类的工作工具诸如此类。我想通过串口与Arduino通话会容易得多。Arduino将管理拼字板上的所有“控件”,但处理每个单词将在一些PC或raspi上远程完成。python库“串行”使通过串行端口与另一个设备进行通信变得非常容易。通过Arduino上的串行端口发送/接收数据与
serial.print()
serial.read()
@user2357112一样简单,请原谅混淆。编辑我的问题以使其更清楚。:-)我完全同意。