原创作者:一粒马豆&冰豆小李
首先让我们来看看这样一种语言现象:
研表究明,汉字序顺并不定一影阅响读。
Aoccdrnig to a rscheearch at an Elingsh uinervtisy, it deosn't mttaer in waht oredr the ltteers in a wrod are, the olny iprmoetnt tihng is taht the frist and lsat ltteer is at the rghit pclae. The rset can be a toatl mses and you can sitll raed it wouthit porbelm. Tihs is bcuseae we do not raed ervey lteter by it slef but the wrod as a wlohe.
以上着两段话虽然字序被打乱,但是你依然能够很好的理解它们的意思,对不对?这就是大脑并行运算识别的一种智能模式,如果通过程序来模拟这种大脑认知的机制是实现智能机器人的关键之一。还好我们有正则表达式,而正则表达式发明的初衷也是为了模拟神经网络和智能结构。
要以最简易的方式实现一个智能聊天机器人需要哪些关键技术?
关键技术和原理:
1. 中文分词
2. 正则表达式
对输入的一句话应用中文分词解析出关键词,然后应用正则表达式用解析出的关键词并行检索问答库里的问题,计算出匹配程度,问答库中匹配程度最高的一个问题的答案就可以用来应答这句输入的话语。
效果图:
上代码:
<SCRIPT TYPE="TEXT/JAVASCRIPT">
function found(keyword){
if(W[keyword]==1){
return true;
}else{
return false;
}
}
//关闭数据库连接
//dataBaseConnectionObject.Close();
//
function parseChinese(inputSentence){
//正向关键词最长匹配法
//删除待处理字符串头部的空格
inputSentence=inputSentence.replace(/(^\s+)/,"");
var inputSentenceLength=inputSentence.length;
var wordMaxLength=7;
var resultArray=new Array();
var resultString="";
var recognizedWords="";
//如果输入句长度小于词典词汇长度则令最大长度等于句子长度
if(inputSentenceLength<=wordMaxLength){
wordMaxLength=inputSentenceLength;
}
//增加三个空格方便尾部处理,空格数=wordMaxLength-1
inputSentence+=" ";
for(var i=0;i<inputSentenceLength;i++){
//尾部还需特殊处理
for(var j=wordMaxLength;j>0;j--){
var checkword=inputSentence.substr(i,j);
if(found(checkword)){
//alert(checkword);
recognizedWords+=checkword+",";
resultArray.push(checkword);
//注意后面需要-1,因为FOR循环会自动加1
i=i+j-1;
break;
}else{
if(j==1){
resultArray.push(checkword);
}
}
}
}
//处理所得到的结果数组
//由于前面的过程会把英文单词分割成字母,现在需要连接起来
for(var i=0;i<resultArray.length-1;i++){
var regw=/\w/;
if(regw.test(resultArray[i])&®w.test(resultArray[i+1])){
resultArray[i+1]=resultArray[i]+resultArray[i+1];
resultArray[i]="";
}
}
//结果数组转换成结果字符串
resultString=resultArray.join(" ");
//替换掉里面多余的空格
resultString=resultString.replace(/\s{2,}/g," ");
//替换掉多余的逗号去除尾部空元素
resultString=resultString.replace(/,$/,"");
//重新将字符串转换回数组
//去除识别字符串里的重复元素
if(resultString==""){
resultArray=new Array();
}else{
resultArray=resultString.split(" ").reverse().join(",").match(/([^,]+)(?!.*\1)/ig).reverse();
}
//本分词函数对象各个属性最终值
recognizedWords=recognizedWords.replace(/,$/,"");
this.recognizedWords=recognizedWords;
//注意输入值为空或者不匹配的情况
if(this.recognizedWords==""){
this.recognizedWordsArray=new Array();
}else{
this.recognizedWordsArray=recognizedWords.split(",").reverse().join(",").m