Ce post est constitue d'un moteur de Bot comparable a pyborg , et d'une interface de test, pour voir l'application et la telecharger allez sur mon site
http://ianbot.comule.com
le bot Complet ici ,
http://ianbot.comule.com
Le principe :
De la même manière que Megahal[2] et PyBorg, c'est un bot qui "apprend" la langue au fur et à mesure que l'on lui parle. Il n'est pas programmé pour répondre selon une langue particulière, mais peut répondre dans toutes les langues, si sa base de donnée le lui permet. A chaque fois que l'on lui présente une phrase, il enregistre le contenu de la phrase, ainsi que les relations entre les mots. Au moment de générer une réponse, il va se servir de ces informations pour contruire la réponse, mot par mot.
Par exemple, les mots "ça" et "va" sont la plupart du temps suivi par le mot "bien", "pas" mais jamais du mot "maison". Lorsque le programme aura choisi de répondre en commençant sa réponse par le mot "ça", il y a de forte chance pour qu'il continue avec les mots "va" et "bien".
Pour amorcer la réponse, le programme choisi un mot dans la phrase qu'il reçoit en entrée.
L'idéal serait d'identifier le prédicat de la phrase, mais devant la difficulté de gérer les variantes des verbes conjugués ( et cela serait propre à chaque langue et contraire à l'esprit du programme ), le programme choisi le mot qu'il connaît le moins bien, ce qui permet de mettre de côté tout les mots grammaticaux, ainsi que les mots qui n'apportent aucun sens à la phrase. (par exemple 'le' 'la' 'un' 'de' ...)Ensuite, il génère la phrase à reculons pour tout ce qui précède le mot choisi, puis, il génère la réponse à partir du mot retenu.
Exemple, en demandant "Es tu un robot, oui ou non ?", le programme retient le mot "robot" puis génère sa réponse :
"robot" est précédé de "un" et "un robot" est souvent précédé de "t".
Puis, "un robot" est suivi de "," "c" puis "," "c" est suivi de "est" et enfin "c est" sera suivi de "ça" Réponse: "T un robot, c'est ça"
Cela permet de générer des réponses, qui, si l'interlocuteur ne sait pas avec qui il parle, permettent de mener une conversation ( il n'est d'ailleur pas rare de voir les gens s'acharner à lui parler si le bot a un pseudo 'féminin' ...)
Il ne s'agit donc pas d'intelligence, mais de calcul statistique qui permet de formuler les réponses ( avec une bonne base de donnée, cela permet de générer des phrases "correctes" )
la qualite des conversations et des textes importer compte beaucoup
le zip est trop gros pour ici , je mets que l'essentiel ici , rdv sur mon site pour le reste merci
Source / Exemple :
Imports System.Collections.Specialized
Public Class ClassBot2
Shared flgdeb As Boolean
Shared Function chatbot2(ByVal txt As String) As String
Try
Dim reponse As String
formate_texte(txt)
If si_anglais(txt) Then
pays = 4
Else
pays = 33
End If
Dim word As String = found_words(txt)
reponse = reply(word)
AnalyseSentence(txt, pays)
Return reponse
Catch ex As Exception
End Try
End Function
Shared Function AnalyseSentence(ByVal txt As String, ByVal pays As Integer) As StringCollection
Try
Dim c As String
Dim total, idx As Long
flgdeb = False
tmpg = tokenize(txt)
idx = -1
totword = tmpg.Count - 1
main.Label3.Text = totword
If totword = 0 Then Return Nothing
total = totword
begin:
idx = idx + 1
enmemoire("", tmpg(idx), tmpg(idx + 1), idx, "deb", pays)
idx = idx + 1
c = tmpg(idx)
Do While wendy(c, ".") And wendy(c, "?") And wendy(c, "!") And c <> vbCrLf And idx < MAXCHARS And idx < total
enmemoire(tmpg(idx - 1), c, tmpg(idx + 1), idx, "mots", pays)
idx = idx + 1
c = tmpg(idx)
Loop
If c = vbCr Or c = vbLf Then
idx = idx + 1
Else
enmemoire(tmpg(idx - 1), c, "", idx, "fin", pays)
End If
nx: If idx < total Then GoTo begin
Return tmpg
Catch ex As Exception
affiche(ex.Message & " analyse")
End Try
End Function
Shared Function tokenize(ByRef txt As String) As StringCollection
Try
Dim tmp2() As String = Split(txt.Trim.ToLower, " ")
Dim tmp As New StringCollection
Dim c As Integer
For Each ele As String In tmp2
If ele <> "" And ele <> " " Then
If ele.Contains("??") Then ele = "?"
If ele.Contains("..") Then ele = "."
If ele.Contains("!!") Then ele = "?"
tmp.Add(ele.Trim)
End If
Next
Return tmp
Catch ex As Exception
affiche(ex.Message & " tokenise")
End Try
End Function
Shared Sub traitement(ByVal txt As String, ByVal pays As Integer)
AnalyseSentence(txt, pays)
End Sub
Shared Function enmemoire(ByRef prec As String, ByRef txt As String, ByRef suiv As String, ByRef idx As Long, ByVal tag As String, ByVal pays As Integer) As Boolean
Dim tmpmots As Smots
Try
With tmpmots
.mots = txt
.prec = prec
.suiv = suiv
.pays = pays
End With
Select Case tag
Case "mots"
affiche_control(tmpmots.prec & " <<<<<<<" & tmpmots.mots & " >>>>>>>>>>>>" & tmpmots.suiv)
tmpmots.flag = 2
database.Add(tmpmots)
Case "deb"
tmpmots.flag = 1
affiche_controld(tmpmots.mots & " <<<<<<<" & tmpmots.suiv)
database.Add(tmpmots)
Case "fin"
affiche_controlf(tmpmots.prec & ">>>>>>>>>>>" & "- " & tmpmots.mots)
tmpmots.flag = 3
database.Add(tmpmots)
End Select
Return True
Catch ex As Exception
affiche(ex.Message & " enmemoire")
End Try
End Function
Shared Function found_words(ByVal txt As String) As String
Try
tmpg.Clear()
tmpg = tokenize(txt)
Dim word As String = enleve_ns(tmpg)
affiche_controlf(word)
Return word
Catch ex As Exception
affiche(ex.Message & " foundword")
End Try
End Function
Shared Function enleve_ns(ByVal tmp As StringCollection) As String
Dim tmp2 As New StringCollection
Dim word As String = Nothing
Try
For Each elem As String In tmp
If Not contient(elem, "tu|ta|ton|tes|le|la|les|du|de|des|est|sont|?|,|.|!|`|&|(|)|:|;|<|>|the|of|a|was|is|do|does|don't") And Len(elem) > 2 Then tmp2.Add(elem)
Next
If tmp2.Count > 1 Then
nx: Dim d As Integer = hazard(tmp2.Count)
word = tmp2(d)
End If
If tmp2.Count = 1 Then word = tmp2(0)
If tmp2.Count = 0 Then Return "noop"
Return word
Catch ex As Exception
affiche(ex.Message & " trouvemots")
End Try
End Function
Shared Function reply(ByVal txt As String, Optional ByVal flag As Boolean = True) As String
Dim words, word As Smots
Dim phrase As String
Dim flgmf As Boolean
Try
'trouver le mots de depart
words = trouve_mots(txt, pays, 1)
'si non envoie sur alice
If words.IsEmpty Then Return "noop"
word = words
phrase = words.mots
If words.flag = 1 Then GoTo suiv
If words.flag = 3 Then flgmf = True
'on commence par le debut
Dim wordc As String = word.prec
words = trouve_mots(wordc, pays, 0)
phrase = wordc & " " & phrase
Do While words.flag <> 1 And Not phrase.Contains(".")
If words.IsEmpty Then
Return words.prec & " " & phrase
End If
phrase = words.prec & " " & phrase
wordc = words.prec
words = trouve_mots(wordc, pays, 0)
Loop
'maintenant on va sur la fin
If flgmf Then Return phrase
suiv: wordc = words.mots
Do While words.flag <> 3
If words.IsEmpty Then Return phrase & " " & words.suiv
phrase = phrase & " " & words.suiv
wordc = words.suiv
words = trouve_mots(wordc, pays, 0)
Loop
If phrase.Contains(".") And flag Then
Dim tmp() As String = Split(phrase, ".")
phrase = tmp(0) & "."
Return phrase
End If
Return phrase & "."
Catch ex As Exception
affiche(ex.Message & " reply")
End Try
End Function
Shared Function trouve_mots(ByVal txt As String, ByVal pays As Integer, ByVal flag As Integer) As Smots
Try
Dim wordsfd As New MotsCollection
main.control.Clear()
For Each elem As Smots In database
If pays = elem.pays Then
If elem.mots = txt And elem.mots <> "." Then
wordsfd.Add(elem)
End If
End If
Next
If wordsfd.count > 0 Then
Return wordsfd(hazard(wordsfd.count))
Else
Return Nothing
End If
Catch ex As Exception
affiche(ex.Message & " trouvemots")
End Try
End Function
End Class
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.