Bot type chaine de markov ( actor par exemple)

Description

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

Codes Sources

A voir également

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.