我正在尝试构建一个人工智能单元。我计划首先收集感官输入(“观察”)到一个短期工作记忆列表中,不断地从这个列表中形成模式(“想法”),并当这些想法达到一定规模时(例如七个连锁观察),将它们提交到长期存储记忆中。对于哲学爱好者来说,这类似于洛克的《人类理解论》,但这不会是《白板》。需要有一个编码的底层结构。
因此,我的疑问是:
是否有/在哪里可以找到一个好的算法,用于动态合并或“模式化”这个不断增长的观察字符串中最大的子字符串?例如:如果我迄今为止得到的是ABCDABCABC,我想要一个ABC想法,一个D,以及另外两个ABC想法;然后,如果在短期记忆中观察到并添加另一个D,我想要一个ABCD标记,一个ABC标记,以及另一个ABCD标记。我不想使用最短公共子字符串,因为我需要在任意数量的字符添加后重新运行它。我认为我更倾向于某种易于搜索/修改的树结构。
这看起来是一个足够好的解决方案吗? http://www.cs.ucsb.edu/~foschini/files/licenza_spec_thesis.pdf。如果没有其他选择,我认为其他数据挖掘者可能会喜欢这个。
回答:
第一步:分词器。定义你认为{A,B,C,D}是什么以及什么不是。
- 你需要至少一个额外的标记用于处理垃圾/杂项内容(好消息是,如果这个标记出现,后续的状态机将总是重置到其初始状态)
- 你可能需要保留空白(这将再次导致一个额外的标记,以及在DFA或NFA识别器中更多的额外状态)
- 也许你需要某种等价类:例如,将所有数字字符串包装成一种标记类型;折叠大小写;接受一定程度的拼写错误(这很难!)
- 你可能需要一些特殊的虚拟标记类型,用于行首/行尾等情况。
- 你必须在允许的误报和漏报数量上做出一些选择。
- 如果涉及文本,确保所有来源都使用相同的规范编码,或者预处理它们以使它们具有相同的编码。
构建分词器是调查你的语料库的绝佳方式:如果这是来自外部世界的真实数据,你会对你开始时不知道存在的奇怪情况感到惊讶!
第二步(识别器)在正确的分词下可能会容易得多。对于一个正常的确定性状态机(具有预定义的序列识别),你可以使用《龙书》或Crochemore中的标准算法。
对于模糊的自学习匹配器,我会从构建马尔可夫链或树开始。(也许是贝叶斯树,我不是这方面的专家)。我认为从一个标准状态机开始,并在节点和边上添加一些权重和计数不会很难。并动态地向图中添加边。或者删除它们。(我预计这将开始变得困难)
一个战略决策:你需要数据库吗?如果你的模型能装入内存,你就不需要,也不应该使用。(数据库不是为了获取一行并处理它,然后存储它,然后获取下一行,等等而设计的)如果你的数据无法装入内存,你将面临的不仅仅是数据建模问题。顺便说一下:我所知道的所有DNA组装器/匹配器,都是在内存中工作的,并且使用平面文件。(可能由数据库支持,以便于管理和检查)