这是我第一次在Stack Overflow上发帖,请告诉我以后在提问时是否需要更加详细。
目前我正在使用Java开发一个Android的虚拟助手应用,虽然进展顺利,但我不知道如何对用户输入进行分类。到目前为止,我已经在程序中实现了Stanford NLP Parser,这样可以对原始文本应用从句、短语和词汇标签。这让我能够让程序识别直接提问并从中提取主题,只需搜索某些标签的出现即可。
(ROOT (SBARQ <--- 表示该句子是一个问题 (WHNP (WP Who)) (SQ (VBD were) (NP (DT the) (FW samurai))) <--- 问题的对象 (. ?)))
虽然这感觉是一个进步,但我希望最终能够让助手能够对不同类型的问题进行分类(如与天气相关的问题、与时间/日期相关的问题等),同时也能够识别那些不那么直接但询问相同信息的问题(例如,“你能告诉我关于武士的事吗?”与“武士是谁?”)。仅仅使用Stanford NLP Parser并寻找某些标签来完成这项任务似乎非常困难。有人对我可以采取的其他方法有建议吗?
谢谢!
回答:
关于虚拟助手或聊天机器人,这通常被称为意图分类。有很多方法可以做到这一点,但通常你会提供标记的例子并训练一个模型来区分它们。以下是来自一篇博客文章的主题示例数据:
# 3类训练数据training_data = []training_data.append({"class":"greeting", "sentence":"how are you?"})training_data.append({"class":"greeting", "sentence":"how is your day?"})training_data.append({"class":"greeting", "sentence":"good day"})training_data.append({"class":"greeting", "sentence":"how is it going today?"})training_data.append({"class":"goodbye", "sentence":"have a nice day"})training_data.append({"class":"goodbye", "sentence":"see you later"})training_data.append({"class":"goodbye", "sentence":"have a nice day"})training_data.append({"class":"goodbye", "sentence":"talk to you soon"})training_data.append({"class":"sandwich", "sentence":"make me a sandwich"})training_data.append({"class":"sandwich", "sentence":"can you make a sandwich?"})training_data.append({"class":"sandwich", "sentence":"having a sandwich today?"})training_data.append({"class":"sandwich", "sentence":"what's for lunch?"})
虽然你的训练数据是特定于你的应用的,但原则上它与自动分类电子邮件或新闻文章没有不同。
一种易于使用的文本分类基线算法是朴素贝叶斯。较新的方法包括使用词移动距离或神经网络。
你提取主题的部分也被称为槽检测,助手的“意图和槽”架构很常见。即使你想从头开始构建一些东西,查看像rasa这样的聊天机器人平台的配置屏幕可能会有帮助,以了解如何使用训练数据。