| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 20148 人关注过本帖, 4 人收藏
标题:来,你也可以用 C 语言写一个聊天机器人
只看楼主 加入收藏
AleTiff
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:157
注 册:2015-3-30
收藏(4)
 问题点数:0 回复次数:14 
来,你也可以用 C 语言写一个聊天机器人
你是不是一直在面对着枯燥的 C 语言特性、摸索着前人写过的各种算法,不是因为自己的兴趣,而是依靠自身的毅力,学得很苦吧。

好吧,我们找一个好玩一点的东西,一起来写个聊天机器人吧。我知道只是个简单的例子,看完也不一定真有人去写一个聊天机器人,但如果你真想去写的话,这里的内容,可以帮助你实现你的目标。

噢,可以直接去看原文:
http://www.

聊天机器人就是让你能够对他做出动作(姿势或语言),然后他会根据你的行为对你做出反应的程序。当你为它输入自然语言中的一些问题的话,他也可以给你一些看起来有意义的同一语言的回答。

下面是一个非常基本的聊天机器人的代码,很简单的几行:

//
// Program Name: chatterbot1
// Description: this is a very basic example of a chatterbot program
// 描述:这是一个聊天机器人程序一个非常基本的例子
// Author: Gonzales Cenelia
//

#include <iostream>
#include <string>
#include <ctime>

int main()
{
    std::string Response[] = {
        "我听到了!",
        "你是在和我说话。",
        "继续说,我在听。",
        "哈哈,真是非常有趣的谈话。",
        "后来呢?"
    };

    srand((unsigned) time(NULL));

    std::string sInput = "";
    std::string sResponse = "";

    while(1) {
        std::cout << ">";
        std::getline(std::cin, sInput);
        int nSelection = rand() % 5;
        sResponse = Response[nSelection];
        std::cout << sResponse << std::endl;
    }

    return 0;
}

很简单吧?但要做到适当的响应,它可能是很难写的一个程序。1951,图灵提出了一个测试,现在被称为图灵测试。在这项测试中,测试的双方,一方是计算机程序,另一方是一个真正的人类,法官用来判断谁是真正的人。

聊天机器人一般被认为属于弱人工智能领域,但这并不意味着聊天机器人就没有潜力。由于它相当的简单,正好方便大多数爱好者去尝试实现更智能的聊天机器人,所以说,它会是是一个伟大开始的地方。

现在,让我们回到我们以前的程序,前面那个代码存在哪些问题?

嗯,是的。我们可以清楚地看到,这个程序是不是真的想理解用户所说的,相反,他只是随机选择一个已经存在的句子,响应每次用户在键盘上的输入。我们还注意到,程序经常重复自己。这其中的一个原因是由于内含的句子数据库非常小(只有5句),另一个原因是我们还没有实现任何机制来控制这个不太受欢迎的行为。

那,我们该如何改进它?很简单,我们需要引入关键词匹配。

关键词只是一个句子(不一定是完整的)或一个字,程序可以从用户的输入里识别出来,然后让自己的回答对应它。让我们继续改进刚才那个聊天机器人,现在我们称其为 chatterbot2。

//
// Program Name: chatterbot2
// Description: this is an improved version
// of the previous chatterbot program "chatterbot1"
// this one will try a little bit more to understand what the user is trying to say
// 描述:这是一个改进版,相比于前面的聊天机器人程序,这次将尝试一点点更多地理解用户说什么
// Author: Gonzales Cenelia
//

#pragma warning(disable: 4786)

#include <iostream>
#include <string>
#include <vector>
#include <ctime>

const int MAX_RESP = 3;

typedef std::vector<std::string> vstring;

vstring find_match(std::string input);
void copy(char *array[], vstring &v);


typedef struct {
    char *input;
    char *responses[MAX_RESP];
}record;

record KnowledgeBase[] = {
    {"WHAT IS YOUR NAME",
    {"嗯,我的名字叫瞎聊。",
     "你可以叫我公主...,是啊,我是大小姐啊。",
     "为什么你想知道我的名字?下一步是要交换QQ号吗?"}
    },

    {"HI",
    {"哈哈,好啊!",
     "你是谁?",
     "噢,你好!"}
    },
   
    {"HOW ARE YOU",
    {"我干得不坏!",
    "你干得怎么样?",
    "为什么你会想知道我是怎么做到的?"}
    },

    {"WHO ARE YOU",
    {"我尼玛就是个程序啊。",
     "表说,我知道你知道我是谁。",
     "为什么还问?"}
    },

    {"ARE YOU INTELLIGENT",
    {"是的,当然是的。",
     "你是怎么想的?",
     "哈哈,事实上我确实很聪明。"}
    },

    {"ARE YOU REAL",
    {"这对你真的是个问题吗?",
     "啥意思啊?你?",
     "我尽量让我看起来像个真正的人类。"}
    }
};

size_t nKnowledgeBaseSize = sizeof(KnowledgeBase)/sizeof(KnowledgeBase[0]);


int main() {
    srand((unsigned) time(NULL));

    std::string sInput = "";
    std::string sResponse = "";

    while(1) {
        std::cout << ">";
        std::getline(std::cin, sInput);
        vstring responses = find_match(sInput);
        if(sInput == "BYE") {
            std::cout << "和你聊天太愉快了,下次再来!" << std::endl;  
            break;
        }
        else if(responses.size() == 0)  {
            std::cout << "我,我,我不确定我是否能理解你说的是什么 ..." << std::endl;
        }
        else {
            int nSelection = rand()  % MAX_RESP;
            sResponse =   responses[nSelection]; std::cout << sResponse << std::endl;
        }
    }

    return 0;
}
   
// make a  search for the  user's input
// inside the database of the program
vstring find_match(std::string  input) {
    vstring result;
    for(int i = 0; i < nKnowledgeBaseSize;  ++i) {  
        if(std::string(KnowledgeBase[i].input) == input) {
            copy(KnowledgeBase[i].responses, result);
            return result;
        }
    }
    return result;
}

void copy(char  *array[], vstring &v) {
    for(int i = 0;  i < MAX_RESP; ++i) {
        v.push_back(array[i]);
    }
}

现在,程序有了点进步了,它可以尽可能地选择一些接近的句子来做出反应。你可以尝试输入:
WHAT IS YOUR NAME, HOW ARE YOU, ARE YOU INTELLIGENT ... 等语句来测试。
搜索更多相关主题的帖子: 机器人 
2015-04-15 14:24
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
吐槽:你这明显是C++
2015-04-16 12:10
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:0 
c++

你醒了?快起来敲代码!!
2015-04-16 22:39
鱼儿海
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:77
专家分:194
注 册:2013-8-14
收藏
得分:0 
自己写过程序解闷还是可以的,宅男们
2015-04-17 18:13
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 
显然这是c plus plus

既然还有不甘心
就还没到放弃的时候~
2015-04-18 10:28
AleTiff
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:157
注 册:2015-3-30
收藏
得分:0 
  各位大神,好专业啊,真是惭愧死我了。 得改,一定要改改,C 版绝不用带尾巴的代码。

允许我用代码框简单改写成 C 代码,当然,我努力要写得看起来比 C++ 更加简单,最起码也不能比原始 C++ 更复杂,C 是优秀语言嘛  
全部代码包括了上面的二个例子代码:
程序代码:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>


/*
    描述:这是一个聊天机器人程序一个非常基本的例子 chatterbot1
*/

void chatterbot1()
{
    char* Response[] = {
        "我听到了!",
        "你是在和我说话。",
        "继续说,我在听。",
        "哈哈,真是非常有趣的谈话。",
        "后来呢?"    
    };

    srand((unsigned) time(NULL));

    char sInput[5] = {0};
    char* sResponse = NULL;

    while(1) {
        printf(">");
        scanf("%4s", &sInput);
        fflush(stdin);
        if(sInput[0] == 0x71 || sInput[0] == 0x51 ){
            printf("和你聊天真的很愉快, 下次再见。\n");
            _sleep(1000);
            break;
        }
        int nSelection = rand() % 5;
        sResponse = Response[nSelection];
        printf("%s\n", sResponse);
    }
}

/*
    描述:这是一个改进版聊天机器人程序 chatterbot2
*/
const int MAX_RESP = 3;
typedef struct {
    char *input;
    char *responses[MAX_RESP];
}record;

record KnowledgeBase[] = {
    {"WHAT IS YOUR NAME", 
    {"嗯,我的名字叫瞎聊。",
     "你可以叫我公主...,是啊,我是大小姐啊。",
     "为什么你想知道我的名字?下一步是要交换QQ号吗?"}
    },

    {"HI", 
    {"哈哈,好啊!",
     "你是谁?",
     "噢,你好!"}
    },
    
    {"HOW ARE YOU",
    {"我干得不坏!",
    "你干得怎么样?",
    "为什么你会想知道我是怎么做到的?"}
    },

    {"WHO ARE YOU",
    {"我尼玛就是个程序啊。",
     "表说,我知道你知道我是谁。",
     "为什么还问?"}
    },

    {"ARE YOU INTELLIGENT",
    {"是的,当然是的。",
     "你是怎么想的?",
     "哈哈,事实上我确实很聪明。"}
    },

    {"ARE YOU REAL",
    {"这对你真的是个问题吗?",
     "啥意思啊?你?",
     "我尽量让我看起来像个真正的人类。"}
    }
};

size_t nKnowledgeBaseSize = sizeof(KnowledgeBase)/sizeof(KnowledgeBase[0]);

record* find_match(char*  input) { 
    for(int i = 0; i < nKnowledgeBaseSize;  ++i) {
        if( !stricmp( KnowledgeBase[i].input, input ) )
            return &KnowledgeBase[i];
    } 
    return NULL; 
}

void chatterbot2()
{
    srand((unsigned) time(NULL));

    char sInput[20] = {0};
    char* sResponse = NULL;

    while(1) {
        printf(">");
        scanf("%19[^\n]", &sInput);
        fflush(stdin);

        record* responses = find_match(sInput);
        if(sInput == "BYE") {
            printf("和你聊天太愉快了,下次再来!\n");
            _sleep(1000);
            break;
        } 
        else if( !responses )  {
            printf("我,我,我不确定我是否能理解你说的是什么 ...\n");
        }
        else {
            int nSelection = rand()  % MAX_RESP;
            sResponse = responses->responses[nSelection];
            printf("%s\n", sResponse); 
        } 
    }
}

// 太久不写代码了,我不确信 main 是否是这样声明的...
int main()
{
    chatterbot1();
    chatterbot2();
    return 0;
}
2015-04-21 13:15
xxh000
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-4-24
收藏
得分:0 
楼上改的很好
2015-04-24 22:36
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
怎么样能嵌入到QQ群,QQ的聊天界面中去呢?

我恰巧最近在做这么个功能的东西


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2015-04-25 22:01
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
以下是引用AleTiff在2015-4-21 13:15:36的发言:

  各位大神,好专业啊,真是惭愧死我了。 得改,一定要改改,C 版绝不用带尾巴的代码。
 
允许我用代码框简单改写成 C 代码,当然,我努力要写得看起来比 C++ 更加简单,最起码也不能比原始 C++ 更复杂,C 是优秀语言嘛  
全部代码包括了上面的二个例子代码:
 
#include  
#include  
#include  
#include  
 
 
/*
    描述:这是一个聊天机器人程序一个非常基本的例子 chatterbot1
*/
 
void chatterbot1()
{
    char* Response[] = {
        "我听到了!",
        "你是在和我说话。",
        "继续说,我在听。",
        "哈哈,真是非常有趣的谈话。",
        "后来呢?"     
    };
 
    srand((unsigned) time(NULL));
 
    char sInput[5] = {0};
    char* sResponse = NULL;
 
    while(1) {
        printf(">");
        scanf("%4s", &sInput);
        fflush(stdin);
        if(sInput[0] == 0x71 || sInput[0] == 0x51 ){
            printf("和你聊天真的很愉快, 下次再见。\n");
            _sleep(1000);
            break;
        }
        int nSelection = rand() % 5;
        sResponse = Response[nSelection];
        printf("%s\n", sResponse);
    }
}
 
/*
    描述:这是一个改进版聊天机器人程序 chatterbot2
*/
const int MAX_RESP = 3;
typedef struct {
    char *input;
    char *responses[MAX_RESP];
}record;
 
record KnowledgeBase[] = {
    {"WHAT IS YOUR NAME",  
    {"嗯,我的名字叫瞎聊。",
     "你可以叫我公主...,是啊,我是大小姐啊。",
     "为什么你想知道我的名字?下一步是要交换QQ号吗?"}
    },
 
    {"HI",  
    {"哈哈,好啊!",
     "你是谁?",
     "噢,你好!"}
    },
     
    {"HOW ARE YOU",
    {"我干得不坏!",
    "你干得怎么样?",
    "为什么你会想知道我是怎么做到的?"}
    },
 
    {"WHO ARE YOU",
    {"我尼玛就是个程序啊。",
     "表说,我知道你知道我是谁。",
     "为什么还问?"}
    },
 
    {"ARE YOU INTELLIGENT",
    {"是的,当然是的。",
     "你是怎么想的?",
     "哈哈,事实上我确实很聪明。"}
    },
 
    {"ARE YOU REAL",
    {"这对你真的是个问题吗?",
     "啥意思啊?你?",
     "我尽量让我看起来像个真正的人类。"}
    }
};
 
size_t nKnowledgeBaseSize = sizeof(KnowledgeBase)/sizeof(KnowledgeBase[0]);
 
record* find_match(char*  input) {  
    for(int i = 0; i < nKnowledgeBaseSize;  ++i) {
        if( !stricmp( KnowledgeBase.input, input ) )
            return &KnowledgeBase;
    }  
    return NULL;  
}
 
void chatterbot2()
{
    srand((unsigned) time(NULL));
 
    char sInput[20] = {0};
    char* sResponse = NULL;
 
    while(1) {
        printf(">");
        scanf("%19[^\n]", &sInput);
        fflush(stdin);
 
        record* responses = find_match(sInput);
        if(sInput == "BYE") {
            printf("和你聊天太愉快了,下次再来!\n");
            _sleep(1000);
            break;
        }  
        else if( !responses )  {
            printf("我,我,我不确定我是否能理解你说的是什么 ...\n");
        }
        else {
            int nSelection = rand()  % MAX_RESP;
            sResponse = responses->responses[nSelection];
            printf("%s\n", sResponse);  
        }  
    }
}
 
// 太久不写代码了,我不确信 main 是否是这样声明的...
int main()
{
    chatterbot1();
    chatterbot2();
    return 0;
}
来学习的 谢谢
2015-04-25 22:04
keensmile
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-4-30
收藏
得分:0 
回复 楼主 AleTiff
LZ我想学习,目前C语言是最有效(编程简单,实现效果比较多)的编写机器人聊天软件的工具吗?  好像还有易语言也可以编写,那个效果如何?
2015-04-30 21:35
快速回复:来,你也可以用 C 语言写一个聊天机器人
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034085 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved