2014年6月

IE678下链接图片点不中问题讨论

QQ截图20140626150002因为今天制作的房产项目中出现了图片链接无法点击问题,重新审视了一下块集元素和内联元素,不是混淆,而是重新想了一下新的东西,有时候在我们进行重构的时候,偶尔会为了实际需要而将内联元素强制显示为块集元素,在一般情况下,这个是不会出问题的,而且可以很轻松的通过标准,但是在某一些情况下,虽然验证工具可以放过我们,但是在ie678下面会出现解析不正确的问题,下面就简单跟大家分享一下这个问题。

有时候由于需要文字和图片同时获取到点击态,或者需要实现一些高难度的效果,就需要多标签来写结构,可能的结构会如下所示:

<div class="block">
<a href="http://www.hualongxiang.com"><span><img src="http://static.hualongxiang.com/logo/logo.jpg" alt="hlx" /></span></a>
</div>

在没有被赋予强大的CSS的时候,是可以正常点击的,但是当赋予需要的CSS的时候,在ie8一下就会出现图片区域点击不到的情况:

.block span{float:left;}

如果将span标签块集化:

.block span{float:left;dispaly:block;width:100px;height:100px;}

最终的结果依然不是不能点击到,但是图片区域以为的内容确可以正常点击。

而对于此,我的理解是这样的:

因为a标签本身就是一个内联元素标签,内联标签内正常情况只允许放置内联元素,放置块集元素本身语法就有问题,虽然表面上放置的span标签,但是我们又将其强制块集化,在某些浏览器下还是会解析错误,比如说ie6/7,所以这里针对链接的这种情况,出现的问题就是图片区域无法点击。

针对这种问题的解决方法:

保证在a标签中不要放置块集元素,或者强制块集元素,如果需要解决一些特殊效果,可以采取将这个强制元素跟a内置的img标签同级放置,这样也可以避免图片点击不到问题。

PHP中慎用双等于(==)

PHP比较运算符出现的频率实在是太高了,尤其是 ==
if(a == b){
// do something
}
但是,你真的掌握了 == 了吗?细节很重要!
来看下面的代码,说出你认为正确的答案
var_dump('  123fg456'==123);
var_dump('some string' == 0);
var_dump(123.0 == '123d456');
var_dump(0 == "a");
var_dump("1" == "01");
var_dump("1" == "1e0");
先想出你的答案,然后再运行一次看看。如果答案没有差错,那么恭喜你,基础知识很扎实。

解释:如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。此规则也适用于 switch 语句。
特别注意,字符串转换为整数时,是从左到右,直到遇到非数字字符为止。也就是说 '123abc456' 会被转换成 123,而不是 123456。另外字符串开始的空格会被忽略,比如 '   234abc' 转换为 234。
下面附上松散比较和严格比较的对照表

201306061156212

谷歌服务被“封” 网站加载变慢

1402017825583

从5月27号左右开始,谷歌(Google)在华的几乎所有的服务都处于无法使用的状态,谷歌官网域名Google.com、谷歌香港 Google.com.hk所有服务都打不开。ping出来的IP均显示为“美国”,也就是说谷歌香港的服务器,已经由香港转移至美国,所以链接实际会很 长,甚至断断续续出现请求超时的情况。

当时我的博客所在的SAE也有点小故障,所以那几天我的博客一直访问很慢,我以为是SAE的问题,结果后来终于发现博客的几个页面加载了google的字体资源,所以导致网站加载特别缓慢,现在终于解决了。

360网站卫士的解决方案:

修改方法如下:

打开wordpress代码中的文件wp-includes/script-loader.php文件,搜索:fonts.googleapis.com找到这行代码:

$open_sans_font_url = “//fonts.googleapis.com/css?family1=Open+Sans:300italic,400italic,600italic,300,400,600&subset=$subsets”;

把fonts.googleapis.com替换为fonts.useso.com

修改完保存,再次刷新,大家就可以发现,自己的网站速度已经比以前快了很多,几乎瞬间就可以拿到Google字体了。原因就是本来需要从美国服务器才能拿到的google字体,现在已经遍布360全国的机房了。

醒妹网的解决方案:

既然是关于Google字体,那解除字体问题就可以了。如果网页中设定的字体无法加载,那么网页会按照浏览器默认的字体显示。但浏览器并不知道Google字体服务被屏蔽了,还那么二的一直加载,直到加载失败。但这个过程会耗费十几秒的时间。

  WordPress网站解决Google字体的办法:

第一种方法:安装Disable Google Font插件,但经过测试之后,没有明显效果。

第二种方法:注释或删除掉style.css和function.php有关加载Google字体的代码fonts.googleapis.com即可。

当然以上两种方法可以同时使用。

如果在更改style.css或function.php文件之后,wordpress网站报错,无法打开,或者新建文章时上传图片失败。一定是将wordpress文件的编码保存为非ANSI编码,用记事本打开,保存时选择编码ANSI替换掉原来的文件即可。

团队开发中的代码编写规范

代码规范问题虽然不影响程序的运行,但是却很可以使代码在管理上变得很容易。

注释

注释是对于那些容易忘记作用的代码添加简短的介绍性内容。请使用 C 样式的注释“/* */”和标准 C++ 注释“//”。类、方法、函数请使用 phpdoc 格式的注释,在函数及方法的注释中至少要有 @param 和 @return 标签,如:

 /**
* 这里是函数说明
* 
* @param int $a 参数1
* @param int $b 参数2
* @return xxx 参数1与参数2乘积
*/
public function function_demo_1($a, $b)
{
	return intval($a) * intval($b);
}

对于 bug 修正时务必写上 bug 修改人、修改时间和修正 bug 的原因。

// add xxx by liuming@leju.sina.com.cn on 2009-09-01, test
// remove xxx by guoning@leju.sina.com.cn on 2009-09-02, test
// last modified by liuxin@leju.sina.com.cn on 2009-09-05, typo
// last modified by dengwei@leju.sina.com.cn on 2009-09-09, typo
// fixed memory leak
unset($something);

程序开发中难免留下一些临时代码和调试代码,此类代码必须添加注释,以免日后遗忘。所有临时性、调试性、试验性的代码,必须添加统一的注释标记“//@debug:”并后跟完整的注释信息,这样可以方便在程序发布和最终调试前批量检查程序中是否还存在有疑问的代码。例如:

$num = 1;
$flag = true; // @debug: 测试文件加载
if (!$flag)
{
	// debug statements
}

 

书写规则

缩进与换行:每个缩进的单位约定是一个TAB(4个空白字符宽度),需每个参与项目的开发人员在编辑器中进行强制设定,以防在编写代码时遗忘而造成格式上的不规范。并且所有换行采用 UNIX 格式,既只有 \n 换行。

本缩进规范适用于 HTML、PHP、JS、AS 中的函数、类、逻辑结构、循环等。

大括号 {}、if 和 switch:首括号与关键词同行,尾括号与关键字同列;

if 结构中,if 和 elseif 与前后两个圆括号同行,左右各一个空格,所有大括号都单独另起一行。另外,即便if后只有一行语句,仍然需要加入大括号,以保证结构清晰;

switch 结构中,通常当一个 case 块处理后,将跳过之后的 case 块处理,因此大多数情况下需要添加 break。break 的位置视程序逻辑,与 case 同在一行,或新起一行均可,但同一 switch 体中,break 的位置格式应当保持一致。

以下是符合上述规范的例子:

if ($condition)
{
	switch ($var)
	{
    	case 1: 
       		echo 'var is 1'; 
      		break;
      	case 2:
          	echo 'var is 2';
          	break;
        	default:
    	echo 'var is neither 1 or 2';
        	break;
	}
}
else
{
	switch ($str)
 	{
   		case 'abc':
     		$result = 'abc';
    		break;
     	default:
           	$result = ‘unknown’;
        	break;
	}
}

例外的,数据库 SQL 语句中,除字符串外所有数据都不得加单引号,但是在进行 SQL 查询之前都必须经过 intval 等相关函数处理;所有字符串都必须加单引号,以避免可能的注入漏洞和SQL错误。正确的写法为:

$catid = intval($catid); // 当 $catid 只能为 int 时
$username = addslashes($username);
$username = "SELECT * FROM phpcms_member WHERE username = '{$username}' AND catid = {$catid}";

 

所有数据在插入数据库之前,均需要进行addslashes()处理,以免特殊字符未经转义在插入数据库的时候出现错误。如果使用基础类 baselib_request_arg 通过 GET、POST、FILE 取得的变量默认情况下已经使用了 addslashes() 进行了转义,不必重复进行。如果数据处理必要(例如用于直接显示),可以使用 stripslashes() 恢复,但数据在插入数据库之前必须再次进行转义。

缓存文件中,一般对缓存数据的值采用 addcslashes($string, '\'\\') 进行转义。

命名原则

命名是程序规划的核心,只要你给事物想到正确的名字,就会给你以及后来的人带来比代码更强的力量。总的来说,只有了解系统的程序员才能为系统取出最合适的名字。如果所有的命名都与其自然相适合,则关系清晰,含义可以推导得出,一般人的推想也能在意料之中。

就一般约定而言,类、函数和变量的名字应该总是能够描述让代码阅读者能够容易的知道这些代码的作用。形式越简单、越有规则,就越容易让人感知和理解。应该避免使用模棱两可,晦涩不标准的命名。

变量、对象、函数名

变量、对象、函数名一律为小写格式,单词之间一般使用下划线 “_” 进行分割;

以标准计算机英文为蓝本,杜绝一切拼音、或拼音英文混杂的命名方式;

变量命名只能使用项目中有据可查的英文缩写方式,例如可以使用$data而不可使用$data1、$data2这样容易产生混淆的形式,应当使用 $article_data、$user_data 这样一目了然容易理解的形式;

可以合理的对过长的命名进行缩写,例如 $bio($biography),$tpp($threadsPerPage),$uid($userid) 前提是英文中有这样既有的缩写形式,或字母符合英文缩写规范;

必须清楚所使用英文单词的词性,在权限相关的范围内,大多使用$enable***、$is*** 的形式,前者后面接动词,后者后面接形容词。

常量

常量应该总是全部使用大写字母命名,少数特别必要的情况下,可使用划线来分隔单词;

PHP 的内建值 TRUE、FALSE 和 NULL 必须全部采用大写字母书写。

变量的初始化与逻辑检查

任何变量在进行累加、直接显示或存储前必需进行初使化,例如:

 

$number = 0; //数值型初始化
$string = ''; //字符串初始化
$array = array(); //数组初始化

 

判断一个无法确定(不知道是否已被赋值)的变量时,可用 empty() 或 isset(),而不要直接使用 if($switch) 的形式,除非你确切的知道此变量一定已经被初始化并赋值。

判断一个变量是否为数组,请使用is_array(),这种判断尤其适用于对数组进行遍历的操作,例如foreach(),因为如果不事先判断,foreach()会对非数组类型的变量报错;

判断一个数组元素是否存在,可使用isset($array[‘key’]),也可使用empty(),两者异同见上。

兼容性

代码设计应当兼顾 PHP 高低版本的特性。当前应仍然以 PHP 5.2 作为最低通过平台(部分历史遗留项目例外),尽量不使用高版本 PHP 5.3 新增的函数、常数或者常量。如果使用只在高版本才具备的函数,必须对其进行二次封装,自动判断当前 PHP 版本,并自行编写低版本下的兼容代码;

对于个别函数,参数要求或者代码要求应当以较为严格的PHP版本为准;

除非必要,不要使用 PHP 扩展模块中的函数。使用时应当加入必要的判断,当服务器环境不支持此函数的时候,进行必要的处理。文档和程序中的功能说明中,也应加上兼容性说明。

包含调用

包含调用程序文件时,请全部使用 require_once,以避免可能的重复包含问题;

包含调用缓存文件,由于缓存文件无法保证 100% 正确打开,请使用 include_once。在必要时,可以使用 @include_once 的方式,以忽略错误提示;我们仍建议大家把缓存数据放到 LC (Local cache:xcache、eaccelerator、APC) 或 RC (remote cache:memcached、couchdb ...)。

包含和调用代码中,须以 APP_ROOT . '/'开头,应避免直接写程序文件名 (例如:require_once 'x.php') 的做法;

所有被包含和调用的程序文件,包括但不限于程序、缓存或模板,通常其不能被直接URL请求。通过在 ./config.php 中定义一个标记性常量 APPNAME ,来判断程序是否被合法调用。因此,在除了./config.php 以外的任何一个被包含和调用的程序文件中,需要包含以下内容,以使得访问者无法直接通过URL 请求该文件:

defined('APPNAME') or exit('Access Denied');

错误报告级别

在开发和调试阶段,请使用 error_reporting(E_ALL) 作为默认的错误报告级别,此级别最为严格,能够报告程序中所有的错误、警告和提示信息,以帮助大家检查和核对代码,避免大多数安全性问题和逻辑错误、拼写错误。error_reporting() 可以公共头文件进行设置,或某个指定的文件进行设置,但是请不要在各个文件中都加一个 error_reporting 。

代码部署时,请删除所有 error_reporting 和 ini_set('display_errors', xxx) 设置,php 采用服务器默认配置,此配置由服务器维护人员统一配置。

数据库设计

字段

表和字段命名:表和字段的命名以前面《命名原则》的约定为基本准则。所有数据表名称,只要其名称是可数名词,则必须以复数方式命名,例如:members(用户表);存储多项内容的字段,或代表数量的字段,也应当以复数方式命名,例如:hits(查看次数)、items(内容数量)。

当几个表间的字段有关连时,要注意表与表之间关联字段命名的统一,如 article_hash_01 表中的 articleid 与 article_data_hash_01 表中的 articleid。

代表id自增量的字段,通常用以下几种形式:

  • 一般情况下,使用全称的形式,例如 userid、articleid;
  • 没有功能性作用,只为管理和维护方便而设的id,可以使用全称的形式,也可只将其命名为id。

字段结构

允许 NULL 值的字段,数据库在进行比较操作时,会先判断其是否为 NULL,非 NULL 时才进行值的必对。因此基于效率的考虑,建议所有字段均不能为空,即全部 NOT NULL;

预计不会存储非负数的字段,例如各项 id、发帖数等,必须设置为 UNSIGNED 类型。

UNSIGNED 类型比非 UNSIGNED 类型所能存储的正整数范围大一倍,因此能获得更大的数值存储空间;

存储开关、选项数据的字段,通常使用 tinyint(1) 非 UNSIGNED 类型,少数情况也可能使用enum() 结果集的方式。tinyint 作为开关字段时,通常 1 为打开;0 为关闭;-1 为特殊数据,例如 N/A(不可用);高于 1 的为特殊结果或开关二进制数组合;

MEMORY/HEAP 类型的表中,要尤其注意规划节约使用存储空间,这将节约更多内存。例如cdb_sessions 表中,就将 IP 地址的存储拆分为4个 tinyint(3) UNSIGNED 类型的字段,而没有采用 char(15) 的方式;

任何类型的数据表,字段空间应当本着足够用,不浪费的原则。

SQL语句

所有 SQL 语句中,除了表名、字段名称以外,全部语句和函数均需大写,应当杜绝小写方式或大小写混杂的写法。例如 select * from members; 是不符合规范的写法。

很长的 SQL 语句应当有适当的断行,依据 JOIN、FROM、ORDER BY等关键字进行界定。

通常情况下,在对多表进行操作时,要根据不同表名称,对每个表指定一个 1 ~ 2 个字母的缩写,以利于语句简洁和可读性。

如下的语句范例,是符合规范的:

$result = $db->query("SELECT m.*, i.*
FROM " . TABLE_MEMBER . " AS m, " . TABLE_MEMBERINFO . " AS i
WHERE m.userid = i.userid AND m.userid = '$_userid');

 

原文地址:http://www.nowamagic.net/librarys/veda/detail/513

智能聊天机器人小黄鸡及其制作方法

   今天很荣幸担任主讲,与大家一起讨论智能聊天机器人小黄鸡~讲得不好请见谅,提问请轻虐~嘻嘻
       今天的讲座主要分为三个部分,分别是:1. 什么是小黄鸡 2.小黄鸡的基本原理 3.如何自制小黄鸡。
Part 1 什么是小黄鸡
      很多人认识小黄鸡是从人人网开始的,只要@小黄鸡,它就会跑出来跟你聊天。这就是一个典型的人工智能的聊天机器人。
      实际上,人人网小黄鸡是华科一位08级的同学,通过人人网接口,调用韩国聊天机器人SimSimi的API,自动回复提问者。
也就是下图:
1

  SimSimi最早风靡于移动平台。至于它的具体原理以及实现方法我们将在后两部分介绍。也就是说,人人网小黄鸡的原型,就是智能聊天机器人SimSimi。那么什么是聊天机器人呢?
       简单地说,就是基于人工智能原理(Artificial Intelligence,以下简称AI),通过对聊天文本进行分析后给出应答的一类程序。世界上最早的聊天机器人诞生于20世纪80年代,这款机器人名为“阿尔贝特”,用BASIC语言编写而成。而由于中文对“词”划分的模糊及歧义繁多等等原因,中文聊天机器人发展得相对较慢,目前有赢思的小i,爱博的小A,腾讯也有。

Part   2 小黄鸡的基本原理

       AI聊天机器人小黄鸡的工作可以被分成两个部分:训练+匹配。(其实很多AI的东西都可以被这么划分,比如人脸识别,语音识别等等)

2.1 训练

       Simsimi中的“教学”,就是训练的过程,目的在于构建或是丰富词库。
       流程描述如下:
S1:用户通过教学界面向系统提出一个话题与相应应答;
S2:系统对该话题进行分词,判断该话题在系统知识库中应存放的位置;
S3:在系统知识库中添加该话题及相应应答。
      可以看到,这里涉及到两个问题:给出一个话题,系统是如何分词的?词库要如何设计才能又快又准地应答?

2.1.1分词方法

       有人认为我教小黄鸡“埃菲尔铁塔上45度角仰望星空”回答是“呵呵”,那下次它再看到“埃菲尔铁塔上45度角仰望星空”整句话的时候才会有相应回答。但实际上,下次只要它看到“埃菲尔铁塔”就会“呵呵”了好嘛。
       这是因为聊天机器人的存储并不以句子为单位(那样太费时费空间),而是以词。于是,分词,几乎成为聊天机器人的核心。
      英文分词好说,人家用空格什么的就搞定了,但中文不一样,对于一句话,人们可以用自己的认识区分词语,而机器人要怎么做,就是中文分词算法的研究范畴了。
      中文分词技术俨然是一个重要的研究方向,隶属于自然语言处理。现有的分词算法可以分为三大类:基于字符串匹配的分词方法基于统计的分词方法基于理解的分词方法
      用户在聊天时的一个显著特点是所提出的话题一般都是比较短小的,而不是长篇大论,不具有段落篇章结构,绝大多数就是少数几句话。基于统计的分词方法适用于有段落、篇章结构以及上下文关系的文段。基于理解的分词方法目前并不成熟,且时间复杂度高,速度慢。于是,只有基于字符串匹配的分词是比较适合的。
      基于字符串匹配的分词方法,又叫做机械分词方法。按照扫描方向的不同,机械分词法可以分为正向匹配和逆向匹配。(e.g. 字符串“北京华烟云”,正向匹配为《北京,华烟云》,逆向匹配为《北,京华烟云》)逆向匹配的切分正确率要高于正向匹配法,为了便于发现歧义切分,有时候将两者结合起来形成双向匹配法。按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配,也就是长词优先和短词优先。按照匹配不成功时重新切取的策略,机械分词法可以分为增字法和减字法。
基于词典的“双向最大匹配”法是目前中文信息处理中最简单有效的方法,有这样的统计:汉语文本中90%左右的句子,其与双向最大匹配的结果相吻合,而且是正确的分词结果。
       当正、反向最大匹配算法得出来的切分结果不一样时,就必须对其进行歧义处理,在此不再赘述。

2.1.2词库设计

       由于中文词的特点:1.中文词是一个开放集,词数在增长;2.以不同字开头的词的数目变化很大,多的达到数百个,少的也有可能只有一个或者没有;3.词的长度变化也很大,有单字词,也有由六、七个字成词的。
这就要求在设计词典时,除了考虑访问效率外,还得充分考虑存储利用率。

请看这种数据结构,就能很好地平衡时间与空间。

2

      首字Hash表通过一次哈希运算就可以直接定位汉字在表中的位置。一个单元包括三项内容:C:存储首字;F标志位:存储以C为首字的最长词条的长度;P:指向词表索引表。
        解释一下哈希:散列表 Hash table,也叫哈希表,顾名思义就是把数据都打散了,再按一定规律存起来,加快访问速度。是根据关键码值Key而直接进行访问的数据结构。
       举个栗子:我想将[0,100)做成一个哈希表,选取“模10”作为散列函数,以数组作为存储单元,则得到A[10][10]的数组,A[0]里依次存着0,10,20…90;A[1]里存着1,11,21…91。依次类推。
现在举一个训练小黄鸡的例子:我教小黄鸡说“大白天的做什么美梦啊?”回答是“哦哈哈哈不用你管”。
S1:应用双向最大匹配算法分词:双向分词结果,正向《大白天,的,做什么,美梦,啊》;反向《大白天,的,做什么,美梦,啊》。正向反向都是一样的,所以不需要处理歧义问题。长词优先选择,“大白天”和“做什么”。
S2:以“大白天”举例,假设hash函数为f(),并设f(大白天)指向首字hash表项[大,11,P]。于是由该表项指向“3字索引”,再指向对应“词表”。
S3:将结构体<大白天,…>插入队尾。体中有一个Ans域,域中某一指针指向“哦哈哈哈不用你管”。
S4:完成训练。

2.2 匹配

       可以被描述成如下流程:S1:用户通过聊天界面向系统提出一个话题;S2:系统对该话题进行分词处理;S3:在系统知识库中寻找与该话题匹配的话语回复用户。

       基于词典的分词算法分为词典加载预处理最大匹配歧义消解几个阶段。

其具体流程如下:

S1:预处理阶段,按照特殊字符(英文字母、数字、标点符号等)将待分析文本进行断句,将待切分的文本切分为只有中文的短句子,这些句子是下一步分词处理的基本单位;
(举个栗子:输入“asdfadf东北师范大学哈哈哈dfadflakfl(*^__^*) 嘻嘻……”,simi只会对其中的中文“东北师范大学哈哈哈嘻嘻”做出响应;输入“(*^__^*)”时,输出“I have no response.”)
S2:对断句出来的句子进行双向最大匹配(双向匹配,长词优先)分词,分词后的结果作为S3的输入;
(举个栗子:输入“东京古巴比伦”,正向与反向切词结果均为《东京,古巴比伦》,长词优先,所以simi只对“古巴比伦”做出响应;输入“古巴比伦埃菲尔铁塔”,正向与反向切词结果均为《古巴比伦,埃菲尔铁塔》,此时Simi对“埃菲尔铁塔”做出响应)
S3:对上一步分词得到的结果进行比较,判断是否存在歧义,如果存在歧义,就进行一定的歧义消解
S4:重复S2、S3,直到处理完步骤一中断句所切分出的所有句子单元。
算法流程如图所示:
3
这里给出与小黄鸡对话的例子:我问小黄鸡:“埃菲尔铁塔上45度角仰望星空”。
S1:双向最大匹配分词:正向反向均为《埃菲尔铁塔上,45度角,仰望星空》,没有歧义。长词优先,系统选择了“埃菲尔铁塔上”作为关键词;
S2:系统在知识库中用刚才说的哈希函数f(埃菲尔铁塔上),找到比如[埃,11,P] 的表项,顺着指针找到6字词的索引,顺着索引找到6字词表,遍历词表,找到<埃菲尔铁塔上,…>结构体;
S3:系统随机选择该结构体Ans域中的一个回答(也有可能是根据频率高低来选择)。比如“两年之后等着你”。
S4:输出回答,匹配结束。

Part 3 如何自制小黄鸡

       根据第二部分所介绍的原理,个人想要真正完成整个小黄鸡的制作是有难度的。如果能做出一个智能较高的聊天机器人,那直接可以去申请专利开公司了~
       所以在这里我们介绍两种比较简单易行的方法,跳过对智能算法的研究,直接调用SimSimi的库。

3.1 通过获取Cookies方法

       首先我们来看人人网小黄鸡是怎么做的。
       原作者团队在github上给出了源代码,网址https://github.com/wong2/xiaohuangji,他们使用Python语言,获取Cookies,通过人人网的接口,将Simi的库连接到人人上。
       也就是说,人人网小黄鸡并没有真正研究第二部分讲到的 AI聊天机器人的算法,而是通过调用人家Simi的库!这就是人人网小黄鸡跟Simi的关系。
Cookies:指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。利用网页代码中的HTTP头信息进行传递。
(举个栗子,我们第一次登录保研论坛时输入用户名与密码,然后选择保存密码,就相当于保存Cookies,下次再打开eeban就不用再登录了~
       Cookies作为一个大有用处的存在,同时也极大地危害着网络信息安全。因为是可以通过例如JS脚本等方法窃取Cookies的。想想看,别人获取了你的Cookies,都不用知道你的用户名密码就能以你的身份查看邮件,浏览网页等等……当然这是题外话,有兴趣的我们以后讨论~所以希望大家能经常清理自己的Cookies,不给坏人可乘之机~~)
       回到我们的小黄鸡,下图是人人网小黄鸡源代码中关于获取Cookies的一段:
4
       我们要自制呢,就不用他们那么麻烦~咱们只要几行小代码就可以了~
        简单介绍一下核心算法:
S1:利用session对象获取本机在http://www.simsimi.com/talk.htm 上的Cookies
(session,在网络应用中被称为“会话”。简单地说,它就像在网站顶层的一个盒子,无论网页怎么跳转,都能够保存用户的信息。这里注意!Talk页是Simi免费的聊天页面,这一点很重要!)
S2:构造头信息,准备将Cookies添加在HTTP头部信息中
S3:从SimSimi API接口中获取本机的响应
(刚才说过,Cookies利用HTTP头信息进行传递,所以我们将刚才talk页上的Cookies添加在 API页上,相当于是talk页在调用API!!!这一点很重要。
举个栗子,我们拿着一把锁,去找talk页,talk给了我们一把钥匙,但是我们开锁手法我们不知道,于是我们将锁+钥匙一起送给API,然后它帮我们打开了盒子~~~bling~~bling~~)
来,我们看看原理图:
5
下面是我用这个方法做的小黄鸡1号:
6
确切的说是这是一只小黄鸡与一只小黄鸭的互掐。哈哈!
       想要做小黄鸡,这是一个省时省力的方法,但是。。。不得不说这是在盗用SimSimi的劳动成果。。。人家指望它的API库卖钱的呢。。。。额额额
       所以接下来我们来看正版的制作方法~~

3.2 通过key调用API接口

      下面这个网址给出了SimSimi的官方API文档:http://developer.simsimi.com/api
7
      文档已经写得非常清晰了,http://api.simsimi.com/request.p?key=your key&lc=en&ft=1.0&text=hi这一行代码就是在调用官方API接口!也就是说,只要你申请到了key,就能调用simi的API,是不是想想就很爽?~最开始我给大家的小黄鸡2号就是正版鸡有木有~现在来讲解一下怎么做。我选择J2EE平台,MVC模式,JSP+JAVA语言。
       最核心的思想是这样的:我们将从表单中获取的字符串,送去调用官方API接口,用request对象返回结果,再打到屏幕上~~是不是很简单?
下面介绍详细算法流程:
S1:talk.jsp——用户填写表单内容,将参数String text传递给chuil.jsp;
S2:chuli.jsp——request对象获取传递来的参数,调用API,用Content类中的getContent(urls)方法获取网页的内容,返回结果String ans,将ans传递给talk.jsp;
S3:talk.jsp——request对象获取传递来的参数ans,将ans打印到屏幕上。结束。
*其中Content类用于获取网页内容,直接上网找的,都不用自己写~hiahia
这是小黄鸡2号的效果图:
8
     正版的方法就是简单~但是因为是正版的,就得付出代价,key是要钱的。我现在用的是试用版,key的有效期限是90天,并且每天只有100次响应,也就是说你一天只能调戏它100次。。。是不是很桑感。

总结

       经过这么多的介绍,大家是不是对类似小黄鸡(SimSimi)的人工智能聊天机器人有了初步的认识。其实你可以做很多只“小黄鸡”,但它的核心都是Simsimi的库,是人家的东西。所以说偶们新时代的年轻人应该要有自己创新意识~让我们来开发自己的智能算法~做自己的小黄鸡、小黄鸭、小黄狗、小黄瓜吧!~~
reference:

  • [1]李鹏.中文分词在聊天机器人中的应用研究[D].中南大学.2009(05)
  • [2] 易顺明,胡振宇. 中文聊天机器人原型系统的设计[J]. 沙洲职业工学院学报. 2007(02)
  • [3]查询处理及分词技术.百度
  • [4]设计和构造一个自动应答聊天机器人都涉及到哪些技术.知乎

问答环节

训练的话玩家调戏它的数据会被录入作为以后回答别人的参考么?还是需要相应权限才能存入库里?
这个就是教学界面。会的。玩家教给它的话题,会在切词之后,打包它的回答,一起存入词库。别人触发相似的关键词,也有可能回答刚刚你教过的答案。
那一个问题有不同答案,如何选择呢?
一个关键词下链接了好几种不同的回答,系统会随机选择一个,比如输入“哈哈”,回答有可能是“呵呵”“笑什么笑”……
以前的这个词表里面对于每个可能出现的词已经有了确定的答案的意思吗?
对,构建词库的时候,还有训练的时候都已经写进去了
但是训练的时候不能随便的吧?万一教他的是错误的知识呢?
谁都可以~~但是一般会有过滤系统,要审核的,像simi就有做任务这个玩法,任务就是,给你别人的回答,让你判断是否可以给不满16岁的孩子看,也有存进去的时候设置敏感词什么的。
原文地址:http://www.cnblogs.com/huj690/archive/2013/01/24/2875114.html