我正在为学校制作一个像Cleverbot这样的自动聊天客户端。我有一切工作,但我需要一种方法来建立响应的知识库。我打算制作一个矩阵,其中包含我需要机器人的所有响应,但我认为每次我想要添加对机器人的响应时都很难编辑代码。这是我对知识库矩阵的代码:
`String[][] Database={
{"hi","hello","howdy","hey"},//possible user input
{"hi","hello","hey"},//response
{"how are you", "how r u", "how r you", "how are u"},
{"good","doing well"}`
如何从文本文件中制作这样的矩阵?有没有比从文本文件中读取更好的方法来解决这个问题?
答案 0 :(得分:7)
你可以......
属性文件可以很容易地读入(并存储,但你对此不感兴趣)Java。班级java.util.Properties可以让您更轻松,但fairly simple加载它,然后您像Map
一样访问它。
hello.input=hi,hello,howdy,hey
hello.output=hi,hello,hey
请注意那里的匹配格式。这有一系列问题和挑战可供使用,但它可以让您轻松地将内容放入和移出属性文件。
很多东西都使用JSON作为序列化格式。因此,您可以使用lots of libraries read and store from it。这将使一些事情变得更容易,并有一系列挑战。
{
"greeting":{
"input":["hi","hello","howdy","hey"],
"output":["hi","hello","hey"]
}
}
这样的事情。然后再次阅读并将其存储到数据结构中。您可以将JSON存储在许多位置,例如文档数据库(如couch),这样可以方便地进行更新,更改和访问......在您运行该数据库的情况下。
这将我们带到......
您可以在应用程序中使用许多数据库,并像数据库一样访问它。好的查询,对象之间的正确关系。当你真正想要一个数据库而不是将字符串放在一起并自己完成所有工作时,使用数据库有很多好处。
您可以创建一个类(而不是二维数组),然后将数据存储在一个类中(它可能是一个二维数组,但这是一个实现细节)。此时,您可以实现Serializable并编写writeObject
和readObject
方法,并将数据以某种方式存储在一个文件中,然后您可以直接将其读回到对象中。如果您具有添加新内容作为此应用程序的一部分(或使用相同类的其他内容)的管理功能,您可以放弃它的人类可读方面并使用管理工具(您编写)来更新对象。
这只是冰山一角。有很多方法可以解决这个问题。
请将变量的名称从Database
更改为小写的更好描述的内容,例如input2output
等。大写名称通常是为类名保留的(除非全部大写,在这种情况下它是最终的静态字段)
答案 1 :(得分:1)
一个常见的解决方案是将数据转储到属性文件中,然后使用标准Properties.load(...)
方法加载它。
一旦获得了这样的数据,就可以通过类似地图的界面访问数据。
您可以找到在文件中存储数据的不同方式,如:
userinput=hi,hello,howdy,hey
response=hi,hello,hey
...
然后,当您读取文件时,可以在逗号上分割值:
String[] expectHello = properties.getProperty("userinput").split(",");