在问我的问题之前,情况是这样的:
我对人工智能有一些非常基本的知识,我知道推理引擎,用LISP或Prolog编程,有点关于神经网络,但不是很多。这就是我所研究的。
我有一个项目,一个应用程序,必须纠正一些自定义句子。
这些句子是普通字符串,可以包含许多不同的字符。幸运的是,多亏了Flex(lexer),我定义了标记,现在分析起来更容易了。字符串的一个示例:
AZERTY AWESOME 333.222 AZERTY MAGIC P其中给出了令牌(示例):
VERB NOUN NUMBER VERB ADJECTIVE SPEC我还使用Bison来允许一些组合,并拒绝其他组合:
VERB NOUN NUMBER VERB ADJECTIVE SPEC is ok
VERB VERB NOUN NUMBER ADJECTIVE SPEC is not ok
etc...这些句子在进入我的应用程序时可能会有一些错误。这些错误可能来自不同的来源,让我们举一些例子:
AZERTY AWESOM E 333.222 AZERTY MAGIC POINT单词above中的附加空格使解析器能够识别动词和规范,而不是名词(如上所述)。因此,修正方法是删除额外的空格。
其他错误可能是缺少空格(制作两个单词),未知的标记,未知的组合(对于野牛),根本没有空格,等等……
因此,我开始用C++创建我的应用程序,首先采用确定性方法:我创建了一种字典,其中包含了我之前找到的所有错误模式,并对它们进行了更正。它工作得很好,我可以纠正很多错误,因为我发现了非常通用的模式。但我想通过添加机器学习功能来增强这一性能,以纠正其他问题。
我说我的“固定修正”有70%的修正是好的,我想让这%的修正伴随着机器学习的东西成长。它将从错误和更正的句子中学习,然后能够自动更正我无法更正的句子(最后30%)。
这是我的问题,我是机器学习的新手,即使我已经学习了一点AI,我也不知道从哪里开始。
我的第一个问题是:我知道神经网络,但它是用来猜测的,对吧?例如,我给它一个句子,它就能告诉我它是正确的还是错误的。但这不是我想要的,我希望应用程序纠正它,而不仅仅是告诉它是否正确。问题是,我真的看不出应用程序如何自己“移除/修改”。
你会建议我往哪个方向走?对于这类应用,您建议使用哪种机器学习原则/工具/技术?
我希望你能很好地理解我的问题,并能帮助我。
发布于 2014-04-09 22:13:05
好吧,由于没有其他的答案张贴,本杰凯斯勒没有总结他的链接,我决定发布我自己的答案,如果它能帮助到某人。
我决定使用N-gram策略,我认为这是解决问题的好方法。这只是理论,我开始编写代码,但它可能不起作用。但我喜欢这个想法,我认为它值得一试。
N-gram是一元语法(一个单词)、二元语法(一对单词)或三元语法(三个单词),依此类推...等等。
主要的想法是为我的应用程序提供大量的训练数据,以及格式良好的字符串。对于它们中的每一个,我将计算n-gram(从uni到tri)。
然后我会得到类似这样的东西(在给应用程序提供了数千个数据之后):
单字表(数字是假的和随机的)
word | occurrence | prob
________________________________________
I | 500 | 0.2
want | 645 | 0.2
a | 2434 | 0.5
cat | 20 | 0.1二元组表
first word | second word | occurrence | prob
___________________________________________________________
| I | want | 600 | 0.5
| want | a | 500 | 0.4
| a | cat | 100 | 0.1 trigram表也是如此。
因此,当我有了这些数据后,分析起来就更容易了,让我们举个例子:
I WANTA CAT在分析时,应用程序首先会看到WANTA不存在于表格中,所以它会拆分这个单词,直到它得到一个很有可能发生的“句子”。
因此,当拆分为"WANT“和"A”时,应用程序将看到"WANT“有很好的发生概率,"A”也是如此,然后他将检查二元语法的兼容性,这也是好的。甚至是带有"I“和"CAT”的三元组,以提高精确度。
我想这是一个很好的解决方案,不需要太多的时间,我希望这会是一种有效的解决方案。
我希望我说得很清楚,并帮助那些想知道同样问题的人。
https://stackoverflow.com/questions/22757454
复制相似问题