我创建了一个带语音界面(SR和TTS)的vb.net应用程序,基本上是我自己的Jarvis。
我决定创建一个基于插件的应用程序,其插件将为核心应用程序提供“功能”。
每个插件都有一个名为“描述”的属性,用于描述插件可以执行的操作,例如“可以告诉当前时间/日期”,另一个可以“管理日历/提醒”
我希望核心应用程序获取用户输入(转换为文本)并将其与每个插件的Description属性进行比较,并确定该插件是否可以“满足”用户输入。
我知道插件可以包含可以触发它们的关键字列表但是我遇到的问题是在用户输入中使用关键字并不是为了触发特定的插件,如: / p>
“当前时间是什么”,其中“时间”是用于告知时间的公认关键字,是用户的意图,但在:
“不是这个时间”,其中“time”是用于告知时间但不是用户意图的公认关键字。
我目前已将我的网站设置为使用OpenNLP,因为我可以轻松地将其集成到我的项目中,但我不确定我必须遵循哪些步骤来实现我的目标。
答案 0 :(得分:1)
欢迎使用SO ...似乎您可以使用OpenNLP doccat功能,您可以在其中创建插件描述的模型,然后根据该模型“分类”输入文本,这将返回概率分布你的插件。您可以随着时间的推移不断添加用户输入的样本,并构建一个非常好的模型。您甚至可以将其设置为动态,因此如果用户输入收到高于某个阈值的分数,您可以将该样本存储在标记有正确类标签的某处,并且每次都会重建该模型。
不确定OpenNLP的.net版本是否支持doccat,所以你也可以采用更基本的机器学习方法(使用矢量化和类似余弦相似性的东西),或者你可能只能索引描述和使用像Lucene或者solr或像MySQL / Postgres / MSSQL / Oracle这样的数据库来返回排名......
无论如何......使用OpenNLP的基本步骤是
1. Build a doccat model using samples of user input and/or the plugin descriptions themselves. See opennlp docs for the format, but in short it is `class_label<space> <bag of words>\n` where each sample has a class label and ends with a new line.
2. instantiate a DocumentClassifier with the model, and classify(inputsampletext). the models can be big, so lazily instantiate them.
3. The classify method will give you a set of class labels with a Double as the "fit" score for each category.
4. At this point I recommend capturing user input somewhere so you can continuously make the models better.
这四个步骤假设只是索引描述由于某种原因不够好。顺便说一下,我从未使用过OpenNLP的.net版本,但我已将OpenNLP java功能放在Web服务之后,并从.net中调用它们。
HTH