一个聊天机器人的程序
生活随笔
收集整理的這篇文章主要介紹了
一个聊天机器人的程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
???? 國外的聊天機器人如ALICE等機器人在人工智能領域取得了很高的效果,ALICE的成功是它有一種很成功的數據存儲形式AIML,介紹AIML的博文在CSDN可以找到,這里不再贅述。經過本人實驗,AIML不支持中文,最多支持拼音。為此我借鑒了ALICE的語料庫結構,采用這樣的方式來儲存信息:
<?xml version="1.0" encoding="gb2312"?>
<aiml>
? <talk>
??? <question>自由</question>
??? <answer>自由是最重要的</answer>
? </talk>
? <talk>
??? <question>快樂</question>
??? <answer>快樂就是讓你的心自由</answer>
? </talk>
? <talk>
??? <question>你好</question>
??? <answer>你好</answer>
? </talk>
? <talk>
??? <question>你叫什么名字</question>
??? <answer>我是機器人莉莉</answer>
? </talk>
? <talk>
??? <question>你是誰</question>
??? <answer>我是機器人莉莉</answer>
? </talk>
</aiml> 與此同時,我寫出了以下簡單的代碼,來實現我的聊天機器人功能,程序代碼如下: Imports SpeechLib
Imports System
Imports System.Xml
Imports Lucene.Net.Analysis
Imports System.IO
Imports System.Text
Public Class chat
Dim username As String '使用者名字
Dim robotname As String '機器人名字
Dim myvoice As Object '創建語音選項
Dim a As String
Dim q As String
Dim Qlist As New ArrayList
Dim Alist As New ArrayList
Dim Rlist As New ArrayList
Dim Clist As New ArrayList
Public WithEvents RecoContext As SpSharedRecoContext
Public grammar As ISpeechRecoGrammar Private Sub Cmdtalk_Click(sender As System.Object, e As System.EventArgs) Handles Cmdtalk.Click
q = txtq.Text
txtans.Text = txtans.Text & vbNewLine & vbNewLine & Mid(System.DateTime.Now.ToString(), 16, Len(System.DateTime.Now.ToString()) - 15) & Space(2) & "【" & robotname & "】" & "說:" & vbNewLine & q
Dim output As String = CSW(q) '分詞
a = Response(q, output)
'開始匹配答案 核心部分
txtans.Text = txtans.Text & vbNewLine & vbNewLine & Mid(System.DateTime.Now.ToString(), 16, Len(System.DateTime.Now.ToString()) - 15) & Space(2) & "【" & robotname & "】" & "說:" & vbNewLine & a
txtans.SelectionStart = Len(txtans.Text & vbNewLine & vbNewLine) '選擇文本插入點,給下面的文字空出空間
txtans.ScrollToCaret() '滾動條滾動開始
myvoice.speak(a)
'清空輸入框,重新開始
txtq.Text = ""
End Sub
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Randomize()
'載入中文語料庫
Dim xmldoc As New XmlDocument
xmldoc.Load(Application.StartupPath & "\aiml\aiml.xml")
Dim nodeList As XmlNodeList
Dim root As XmlElement = xmldoc.DocumentElement
'讀取問題,裝進Qlist
nodeList = root.SelectNodes("/aiml/talk/question")
Dim node As XmlNode
For Each node In nodeList
Qlist.Add(node.InnerText)
Next
'讀取答案,裝進Alist
nodeList = root.SelectNodes("/aiml/talk/answer")
For Each node In nodeList
Alist.Add(node.InnerText)
Next
'讀取隨機答案,裝進Rlist
Dim xmldoc2 As New XmlDocument xmldoc2.Load(Application.StartupPath & "\aiml\random.xml")
root = xmldoc2.DocumentElement
nodeList = root.SelectNodes("/aiml/random/content")
For Each node In nodeList
Rlist.Add(node.InnerText)
Next
''讀取人機交互指令
'nodeList = root.SelectNodes("/aiml/cmd/content")
'For Each node In nodeList
' Clist.Add(node.InnerText)
'Next
myvoice = New SpeechLib.SpVoice '創建spvoice語音對象
username = "朋友"
robotname = "莉莉"
txtans.Text = txtans.Text & Mid(System.DateTime.Now.ToString(), 16, Len(System.DateTime.Now.ToString()) - 15) & Space(2) & "【" & robotname & "】" & "說:" & vbNewLine & username & ",你好,我是基于Alice的智能聊天機器人,我叫莉莉" txtans.Select(Len(txtans.Text), 0)
myvoice.speak(username & ",你好,我是基于Alice的智能聊天機器人,我叫莉莉,我可以為您做些什么呢?")
End Sub Public Function CSW(ByVal input As String) As String '分詞模塊,比較簡單
Dim sb As New StringBuilder()
sb.Remove(0, sb.Length)
Dim t1 As String = ""
Dim i As Integer = 0
Dim analyzer = New Lucene.Net.Analysis.China.ChineseAnalyzer
Dim sr As New StringReader(input)
Dim stream As TokenStream
stream = analyzer.TokenStream("", sr)
Dim t As Token = stream.Next()
While t Is Nothing = False
t1 = t.ToString()
t1 = t1.Replace("(", "")
sb.Append(i & ":" & "(" & t1)
t = stream.Next()
i += 1
End While
CSW = sb.ToString()
End Function
Public Function Response(ByVal str As String, ByVal item As String) As String
Response = ""
For i As Integer = 0 To Qlist.Count - 1
If Qlist.Item(i) = str Then
Response = Alist.Item(i) : Exit For
ElseIf InStr(item, Qlist.Item(i)) > 0 Then
Response = Alist.Item(i) : Exit For
Else
Response = Rlist.Item(Int(Rnd(Rlist.Count - 1)))
End If
Next
End Function
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
If TextBox1.Text = "" Or TextBox2.Text = "" Then
MessageBox.Show("欺騙的行為是可恥的的,您沒有教莉莉任何知識", "QRobot智能聊天機器人", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
Dim xmldoc As New XmlDocument
xmldoc.Load(Application.StartupPath & "\aiml\aiml.xml")
Dim node As XmlNode = xmldoc.CreateNode(Xml.XmlNodeType.Element, "talk", "")
xmldoc.DocumentElement.AppendChild(node)
Dim node1 As XmlNode = xmldoc.CreateNode(Xml.XmlNodeType.Element, "question", "")
node1.InnerText = TextBox1.Text
node.AppendChild(node1)
Dim node2 As XmlNode = xmldoc.CreateNode(Xml.XmlNodeType.Element, "answer", "")
node2.InnerText = TextBox2.Text
node.AppendChild(node2)
xmldoc.Save(Application.StartupPath & "\aiml\aiml.xml")
MessageBox.Show("調教成功!莉莉已經學會了你教給她的新知識!", "QRobot智能聊天機器人", MessageBoxButtons.OK, MessageBoxIcon.Information)
TextBox1.Text = ""
TextBox2.Text = ""
End If
End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Try
PictureBox1.ImageLocation = Application.StartupPath & "\girls\" & Int(Rnd() * 27 - 2) & ".jpg"
Catch ex As Exception When PictureBox1.ImageLocation = ""
End Try
End Sub
End Class ? 語料庫采用了和ALICE類似的XML結構,可是目前只是實現了最簡單的整句匹配,希望大家能幫我做出更大的改進!
<aiml>
? <talk>
??? <question>自由</question>
??? <answer>自由是最重要的</answer>
? </talk>
? <talk>
??? <question>快樂</question>
??? <answer>快樂就是讓你的心自由</answer>
? </talk>
? <talk>
??? <question>你好</question>
??? <answer>你好</answer>
? </talk>
? <talk>
??? <question>你叫什么名字</question>
??? <answer>我是機器人莉莉</answer>
? </talk>
? <talk>
??? <question>你是誰</question>
??? <answer>我是機器人莉莉</answer>
? </talk>
</aiml> 與此同時,我寫出了以下簡單的代碼,來實現我的聊天機器人功能,程序代碼如下: Imports SpeechLib
Imports System
Imports System.Xml
Imports Lucene.Net.Analysis
Imports System.IO
Imports System.Text
Public Class chat
Dim username As String '使用者名字
Dim robotname As String '機器人名字
Dim myvoice As Object '創建語音選項
Dim a As String
Dim q As String
Dim Qlist As New ArrayList
Dim Alist As New ArrayList
Dim Rlist As New ArrayList
Dim Clist As New ArrayList
Public WithEvents RecoContext As SpSharedRecoContext
Public grammar As ISpeechRecoGrammar Private Sub Cmdtalk_Click(sender As System.Object, e As System.EventArgs) Handles Cmdtalk.Click
q = txtq.Text
txtans.Text = txtans.Text & vbNewLine & vbNewLine & Mid(System.DateTime.Now.ToString(), 16, Len(System.DateTime.Now.ToString()) - 15) & Space(2) & "【" & robotname & "】" & "說:" & vbNewLine & q
Dim output As String = CSW(q) '分詞
a = Response(q, output)
'開始匹配答案 核心部分
txtans.Text = txtans.Text & vbNewLine & vbNewLine & Mid(System.DateTime.Now.ToString(), 16, Len(System.DateTime.Now.ToString()) - 15) & Space(2) & "【" & robotname & "】" & "說:" & vbNewLine & a
txtans.SelectionStart = Len(txtans.Text & vbNewLine & vbNewLine) '選擇文本插入點,給下面的文字空出空間
txtans.ScrollToCaret() '滾動條滾動開始
myvoice.speak(a)
'清空輸入框,重新開始
txtq.Text = ""
End Sub
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Randomize()
'載入中文語料庫
Dim xmldoc As New XmlDocument
xmldoc.Load(Application.StartupPath & "\aiml\aiml.xml")
Dim nodeList As XmlNodeList
Dim root As XmlElement = xmldoc.DocumentElement
'讀取問題,裝進Qlist
nodeList = root.SelectNodes("/aiml/talk/question")
Dim node As XmlNode
For Each node In nodeList
Qlist.Add(node.InnerText)
Next
'讀取答案,裝進Alist
nodeList = root.SelectNodes("/aiml/talk/answer")
For Each node In nodeList
Alist.Add(node.InnerText)
Next
'讀取隨機答案,裝進Rlist
Dim xmldoc2 As New XmlDocument xmldoc2.Load(Application.StartupPath & "\aiml\random.xml")
root = xmldoc2.DocumentElement
nodeList = root.SelectNodes("/aiml/random/content")
For Each node In nodeList
Rlist.Add(node.InnerText)
Next
''讀取人機交互指令
'nodeList = root.SelectNodes("/aiml/cmd/content")
'For Each node In nodeList
' Clist.Add(node.InnerText)
'Next
myvoice = New SpeechLib.SpVoice '創建spvoice語音對象
username = "朋友"
robotname = "莉莉"
txtans.Text = txtans.Text & Mid(System.DateTime.Now.ToString(), 16, Len(System.DateTime.Now.ToString()) - 15) & Space(2) & "【" & robotname & "】" & "說:" & vbNewLine & username & ",你好,我是基于Alice的智能聊天機器人,我叫莉莉" txtans.Select(Len(txtans.Text), 0)
myvoice.speak(username & ",你好,我是基于Alice的智能聊天機器人,我叫莉莉,我可以為您做些什么呢?")
End Sub Public Function CSW(ByVal input As String) As String '分詞模塊,比較簡單
Dim sb As New StringBuilder()
sb.Remove(0, sb.Length)
Dim t1 As String = ""
Dim i As Integer = 0
Dim analyzer = New Lucene.Net.Analysis.China.ChineseAnalyzer
Dim sr As New StringReader(input)
Dim stream As TokenStream
stream = analyzer.TokenStream("", sr)
Dim t As Token = stream.Next()
While t Is Nothing = False
t1 = t.ToString()
t1 = t1.Replace("(", "")
sb.Append(i & ":" & "(" & t1)
t = stream.Next()
i += 1
End While
CSW = sb.ToString()
End Function
Public Function Response(ByVal str As String, ByVal item As String) As String
Response = ""
For i As Integer = 0 To Qlist.Count - 1
If Qlist.Item(i) = str Then
Response = Alist.Item(i) : Exit For
ElseIf InStr(item, Qlist.Item(i)) > 0 Then
Response = Alist.Item(i) : Exit For
Else
Response = Rlist.Item(Int(Rnd(Rlist.Count - 1)))
End If
Next
End Function
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
If TextBox1.Text = "" Or TextBox2.Text = "" Then
MessageBox.Show("欺騙的行為是可恥的的,您沒有教莉莉任何知識", "QRobot智能聊天機器人", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
Dim xmldoc As New XmlDocument
xmldoc.Load(Application.StartupPath & "\aiml\aiml.xml")
Dim node As XmlNode = xmldoc.CreateNode(Xml.XmlNodeType.Element, "talk", "")
xmldoc.DocumentElement.AppendChild(node)
Dim node1 As XmlNode = xmldoc.CreateNode(Xml.XmlNodeType.Element, "question", "")
node1.InnerText = TextBox1.Text
node.AppendChild(node1)
Dim node2 As XmlNode = xmldoc.CreateNode(Xml.XmlNodeType.Element, "answer", "")
node2.InnerText = TextBox2.Text
node.AppendChild(node2)
xmldoc.Save(Application.StartupPath & "\aiml\aiml.xml")
MessageBox.Show("調教成功!莉莉已經學會了你教給她的新知識!", "QRobot智能聊天機器人", MessageBoxButtons.OK, MessageBoxIcon.Information)
TextBox1.Text = ""
TextBox2.Text = ""
End If
End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Try
PictureBox1.ImageLocation = Application.StartupPath & "\girls\" & Int(Rnd() * 27 - 2) & ".jpg"
Catch ex As Exception When PictureBox1.ImageLocation = ""
End Try
End Sub
End Class ? 語料庫采用了和ALICE類似的XML結構,可是目前只是實現了最簡單的整句匹配,希望大家能幫我做出更大的改進!
總結
以上是生活随笔為你收集整理的一个聊天机器人的程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下校园网锐捷认证(以湖南农业大
- 下一篇: 醒一醒,讲到 ZooKeeper 的选举