一个聊天机器人的程序
生活随笔
收集整理的這篇文章主要介紹了
一个聊天机器人的程序
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
???? 國(guó)外的聊天機(jī)器人如ALICE等機(jī)器人在人工智能領(lǐng)域取得了很高的效果,ALICE的成功是它有一種很成功的數(shù)據(jù)存儲(chǔ)形式AIML,介紹AIML的博文在CSDN可以找到,這里不再贅述。經(jīng)過(guò)本人實(shí)驗(yàn),AIML不支持中文,最多支持拼音。為此我借鑒了ALICE的語(yǔ)料庫(kù)結(jié)構(gòu),采用這樣的方式來(lái)儲(chǔ)存信息:
<?xml version="1.0" encoding="gb2312"?>
<aiml>
? <talk>
??? <question>自由</question>
??? <answer>自由是最重要的</answer>
? </talk>
? <talk>
??? <question>快樂(lè)</question>
??? <answer>快樂(lè)就是讓你的心自由</answer>
? </talk>
? <talk>
??? <question>你好</question>
??? <answer>你好</answer>
? </talk>
? <talk>
??? <question>你叫什么名字</question>
??? <answer>我是機(jī)器人莉莉</answer>
? </talk>
? <talk>
??? <question>你是誰(shuí)</question>
??? <answer>我是機(jī)器人莉莉</answer>
? </talk>
</aiml> 與此同時(shí),我寫出了以下簡(jiǎn)單的代碼,來(lái)實(shí)現(xiàn)我的聊天機(jī)器人功能,程序代碼如下: 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 '機(jī)器人名字
Dim myvoice As Object '創(chuàng)建語(yǔ)音選項(xiàng)
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 & "】" & "說(shuō):" & vbNewLine & q
Dim output As String = CSW(q) '分詞
a = Response(q, output)
'開(kāi)始匹配答案 核心部分
txtans.Text = txtans.Text & vbNewLine & vbNewLine & Mid(System.DateTime.Now.ToString(), 16, Len(System.DateTime.Now.ToString()) - 15) & Space(2) & "【" & robotname & "】" & "說(shuō):" & vbNewLine & a
txtans.SelectionStart = Len(txtans.Text & vbNewLine & vbNewLine) '選擇文本插入點(diǎn),給下面的文字空出空間
txtans.ScrollToCaret() '滾動(dòng)條滾動(dòng)開(kāi)始
myvoice.speak(a)
'清空輸入框,重新開(kāi)始
txtq.Text = ""
End Sub
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Randomize()
'載入中文語(yǔ)料庫(kù)
Dim xmldoc As New XmlDocument
xmldoc.Load(Application.StartupPath & "\aiml\aiml.xml")
Dim nodeList As XmlNodeList
Dim root As XmlElement = xmldoc.DocumentElement
'讀取問(wèn)題,裝進(jìn)Qlist
nodeList = root.SelectNodes("/aiml/talk/question")
Dim node As XmlNode
For Each node In nodeList
Qlist.Add(node.InnerText)
Next
'讀取答案,裝進(jìn)Alist
nodeList = root.SelectNodes("/aiml/talk/answer")
For Each node In nodeList
Alist.Add(node.InnerText)
Next
'讀取隨機(jī)答案,裝進(jìn)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
''讀取人機(jī)交互指令
'nodeList = root.SelectNodes("/aiml/cmd/content")
'For Each node In nodeList
' Clist.Add(node.InnerText)
'Next
myvoice = New SpeechLib.SpVoice '創(chuàng)建spvoice語(yǔ)音對(duì)象
username = "朋友"
robotname = "莉莉"
txtans.Text = txtans.Text & Mid(System.DateTime.Now.ToString(), 16, Len(System.DateTime.Now.ToString()) - 15) & Space(2) & "【" & robotname & "】" & "說(shuō):" & vbNewLine & username & ",你好,我是基于Alice的智能聊天機(jī)器人,我叫莉莉" txtans.Select(Len(txtans.Text), 0)
myvoice.speak(username & ",你好,我是基于Alice的智能聊天機(jī)器人,我叫莉莉,我可以為您做些什么呢?")
End Sub Public Function CSW(ByVal input As String) As String '分詞模塊,比較簡(jiǎn)單
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("欺騙的行為是可恥的的,您沒(méi)有教莉莉任何知識(shí)", "QRobot智能聊天機(jī)器人", 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("調(diào)教成功!莉莉已經(jīng)學(xué)會(huì)了你教給她的新知識(shí)!", "QRobot智能聊天機(jī)器人", 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 ? 語(yǔ)料庫(kù)采用了和ALICE類似的XML結(jié)構(gòu),可是目前只是實(shí)現(xiàn)了最簡(jiǎn)單的整句匹配,希望大家能幫我做出更大的改進(jìn)!
<aiml>
? <talk>
??? <question>自由</question>
??? <answer>自由是最重要的</answer>
? </talk>
? <talk>
??? <question>快樂(lè)</question>
??? <answer>快樂(lè)就是讓你的心自由</answer>
? </talk>
? <talk>
??? <question>你好</question>
??? <answer>你好</answer>
? </talk>
? <talk>
??? <question>你叫什么名字</question>
??? <answer>我是機(jī)器人莉莉</answer>
? </talk>
? <talk>
??? <question>你是誰(shuí)</question>
??? <answer>我是機(jī)器人莉莉</answer>
? </talk>
</aiml> 與此同時(shí),我寫出了以下簡(jiǎn)單的代碼,來(lái)實(shí)現(xiàn)我的聊天機(jī)器人功能,程序代碼如下: 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 '機(jī)器人名字
Dim myvoice As Object '創(chuàng)建語(yǔ)音選項(xiàng)
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 & "】" & "說(shuō):" & vbNewLine & q
Dim output As String = CSW(q) '分詞
a = Response(q, output)
'開(kāi)始匹配答案 核心部分
txtans.Text = txtans.Text & vbNewLine & vbNewLine & Mid(System.DateTime.Now.ToString(), 16, Len(System.DateTime.Now.ToString()) - 15) & Space(2) & "【" & robotname & "】" & "說(shuō):" & vbNewLine & a
txtans.SelectionStart = Len(txtans.Text & vbNewLine & vbNewLine) '選擇文本插入點(diǎn),給下面的文字空出空間
txtans.ScrollToCaret() '滾動(dòng)條滾動(dòng)開(kāi)始
myvoice.speak(a)
'清空輸入框,重新開(kāi)始
txtq.Text = ""
End Sub
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Randomize()
'載入中文語(yǔ)料庫(kù)
Dim xmldoc As New XmlDocument
xmldoc.Load(Application.StartupPath & "\aiml\aiml.xml")
Dim nodeList As XmlNodeList
Dim root As XmlElement = xmldoc.DocumentElement
'讀取問(wèn)題,裝進(jìn)Qlist
nodeList = root.SelectNodes("/aiml/talk/question")
Dim node As XmlNode
For Each node In nodeList
Qlist.Add(node.InnerText)
Next
'讀取答案,裝進(jìn)Alist
nodeList = root.SelectNodes("/aiml/talk/answer")
For Each node In nodeList
Alist.Add(node.InnerText)
Next
'讀取隨機(jī)答案,裝進(jìn)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
''讀取人機(jī)交互指令
'nodeList = root.SelectNodes("/aiml/cmd/content")
'For Each node In nodeList
' Clist.Add(node.InnerText)
'Next
myvoice = New SpeechLib.SpVoice '創(chuàng)建spvoice語(yǔ)音對(duì)象
username = "朋友"
robotname = "莉莉"
txtans.Text = txtans.Text & Mid(System.DateTime.Now.ToString(), 16, Len(System.DateTime.Now.ToString()) - 15) & Space(2) & "【" & robotname & "】" & "說(shuō):" & vbNewLine & username & ",你好,我是基于Alice的智能聊天機(jī)器人,我叫莉莉" txtans.Select(Len(txtans.Text), 0)
myvoice.speak(username & ",你好,我是基于Alice的智能聊天機(jī)器人,我叫莉莉,我可以為您做些什么呢?")
End Sub Public Function CSW(ByVal input As String) As String '分詞模塊,比較簡(jiǎn)單
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("欺騙的行為是可恥的的,您沒(méi)有教莉莉任何知識(shí)", "QRobot智能聊天機(jī)器人", 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("調(diào)教成功!莉莉已經(jīng)學(xué)會(huì)了你教給她的新知識(shí)!", "QRobot智能聊天機(jī)器人", 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 ? 語(yǔ)料庫(kù)采用了和ALICE類似的XML結(jié)構(gòu),可是目前只是實(shí)現(xiàn)了最簡(jiǎn)單的整句匹配,希望大家能幫我做出更大的改進(jìn)!
總結(jié)
以上是生活随笔為你收集整理的一个聊天机器人的程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux下校园网锐捷认证(以湖南农业大
- 下一篇: 醒一醒,讲到 ZooKeeper 的选举