文·blogchong
接上一篇鳍置,這篇我來聊聊數(shù)據(jù)蟲巢-小蟲技術(shù)的實現(xiàn)登疗。
我們的目標(biāo)很明確赂韵,針對于大數(shù)據(jù)領(lǐng)域的chatbot娱节,而不是通用型聊天機(jī)器人。
所以祭示,我們需要專門的大數(shù)據(jù)對話式聊天語料作為訓(xùn)練語料肄满。
語料獲取。
如果語料具有垂直性,所以從目前已知的渠道中還是比較難以獲取到的稠歉,因為目前市面中能夠獲取到的也就是一些相對通用的對話訓(xùn)練語料掰担。
所以,對于構(gòu)建一個大數(shù)據(jù)領(lǐng)域的對話機(jī)器人怒炸,如何獲取大數(shù)據(jù)對話語料是一個大問題带饱。
我(公眾號:數(shù)據(jù)蟲巢,ID: blogchong)12年開始入行阅羹,期間加入了不少的大數(shù)據(jù)相關(guān)的QQ群勺疼,基本都是圍繞大數(shù)據(jù)話題的社群。
所以在想捏鱼,聊天群里的聊天記錄是否可以作為訓(xùn)練大數(shù)據(jù)對話聊天機(jī)器人的語料呢执庐?
我(公眾號:數(shù)據(jù)蟲巢,ID:blogchong)把六七個大數(shù)據(jù)相關(guān)的QQ群近一年的(大騰訊只允許導(dǎo)出最近一年的聊天記錄)聊天記錄導(dǎo)出导梆,然后對于一些異常信息(比如系統(tǒng)提示信息等)做了過濾轨淌,去掉了發(fā)言的人,共累計近12萬的聊天記錄看尼,大概長下面這樣猿诸。
看起來勉強(qiáng)可用吧(沒其他法子了,湊合用吧)狡忙,然后我(公眾號:數(shù)據(jù)蟲巢梳虽,ID:blogchong)把每相鄰的兩句作為一個對話,一問一答灾茁,也就擁有了近12萬的垂直領(lǐng)域?qū)υ挕?/p>
至此窜觉,語料問題解決。
技術(shù)框架選型北专。
我們在第一篇中提到過禀挫,進(jìn)行chatbot設(shè)計,從技術(shù)的角度看有三種:基于人工模板拓颓,基于搜索技術(shù)语婴,以及基于深度學(xué)習(xí)。
基于人工模板驶睦,最有名的莫過于Alice的開源了(在github上很容易搜索到開源代碼)砰左。
但是基于AIML語言的chatbot,其中最大的挑戰(zhàn)莫過于模板的整理场航,這對于當(dāng)前有各式各樣詢問需求的用戶來說缠导,顯然是很難達(dá)到目的的(我們總不能把那12萬的語料進(jìn)行模板加工處理吧,工程量太大)溉痢。
所以僻造,在這里AIML的路子走不通憋他,它適用于固定問答模式的情景,類似一些智能客服領(lǐng)域髓削,很多詢問都是固定的竹挡。
關(guān)于AIML做個補(bǔ)充,原生的Alice是不支持中文的立膛,需要修改一定的源碼揪罕,以及支持中文分詞等過程,網(wǎng)上有挺多參考的例子旧巾,這里就不多說了耸序。
基于神經(jīng)網(wǎng)絡(luò)的chatbot忍些,這應(yīng)該是那些大廠構(gòu)建chatbot的主流思路鲁猩。
但是,卻不是我的主流思路罢坝,因為從目前的角度來說廓握,沒有深度學(xué)習(xí)基礎(chǔ)去做一個基于深度學(xué)習(xí)的chatbot,顯然挑戰(zhàn)太大嘁酿,不適合入門(俺要是能輕輕松松寫個牛逼的深度學(xué)習(xí)chatbot隙券,還會坐在這里寫文章么 哈哈)。
所以闹司,這里我(公眾號:數(shù)據(jù)蟲巢娱仔,ID:blogchong)選擇搜索技術(shù)為主,作為從0到1構(gòu)建chatbot的技術(shù)模型游桩。
切確的說牲迫,是以ElasticSearch為核心的搜索引擎,以搜索的思路來解決對話的問題借卧。
技術(shù)思路盹憎。
如上所說,我們(公眾號:數(shù)據(jù)蟲巢铐刘,ID:blogchong)選擇ES作為核心的搜索引擎陪每,通過搜索的思路來解決chatbot的對話問題。
簡單的過程就是:
1 我們把相鄰的對話語料镰吵,分成一問一答的對話模式檩禾。
2 我們通過為問答構(gòu)建索引,通過搜索的技術(shù)方式來解決精確問答的問題(這是比模板模式更靈活所在疤祭,但是會犧牲一定的精確性)锌订。
在這里,我(公眾號:數(shù)據(jù)蟲巢画株,ID:blogchong)雖然對問答都進(jìn)行了全文索引構(gòu)建辆飘,但是在實際的操作過程中啦辐,比如問句搜索中,只搜索問句蜈项,獲取相應(yīng)的問題答案芹关。
并且,由于語料本身具有一定的瑕疵(好吧紧卒,其實瑕疵很大)侥衬,所以在搜索獲取回答的時候,在匹配滿足一定程度的基礎(chǔ)上跑芳,做了一定隨機(jī)答案的獲取處理轴总。
一方面是本身語料不準(zhǔn)的無奈之舉(在匹配度滿足的情況下,萬一不小心剛好對上一個好回答呢)博个,另一方面就是增加趣味性了(不至于每次問的同一個問題怀樟,但回答的是一毛一樣的)。
ES的安裝搭建過程盆佣。
由于我們技術(shù)選型是ES往堡,所以我們首選需要搭建一個ES。
在這里共耍,我選擇了elasticsearch-2.4.4作為我的ES版本虑灰,選擇的依據(jù)是蜗元,版本不能太高贸街,太高難以找到參考黔寇,并且出現(xiàn)bug難以解決蔬蕊,所以選擇一個相對穩(wěn)定的版本即可地熄。
官網(wǎng)下載一個elasticsearch-2.4.3.tar.gz壓縮包锉矢,使用如下命令進(jìn)行解壓到指定位置啃炸。
tar xf elasticsearch-2.4.3.tar.gz -C ./
為了方便操作畦娄,建立一個軟鏈谐算。
ln -sv /data/application/mitechat_bot/elasticsearch-2.4.3 /data/application/mitechat_bot/elasticsearch
開始安裝相關(guān)插件熟尉,第一是head,該插件用于es的集群管理洲脂,是es集群交互的web前臺斤儿,在安裝目錄下執(zhí)行如下。
bin/plugin install mobz/elasticsearch-head
圖片來自網(wǎng)絡(luò)恐锦,我自己的就不截圖了往果,之前為了安全,把host配置了內(nèi)網(wǎng)ID一铅,所以不太方便截圖就拉倒了陕贮。
head工具查看地址(默認(rèn)是9200,可以自行到config文件修改訪問端口):
http://host:9200/_plugin/head/
elasticsearch-kopf工具的安裝潘飘,該工具提供es的管理肮之,當(dāng)然也提供一些API的交互掉缺,與head部分功能有重疊,自行體驗戈擒。
bin/plugin install lmenezes/elasticsearch-kopf
同上眶明,來自網(wǎng)絡(luò),自己的配置的是內(nèi)網(wǎng)host筐高,不方便截圖搜囱。
工具查看的地址如下(端口同樣也是默認(rèn)的9200,建議都配置成自己的端口柑土,更安全)蜀肘。
http://host:9200/_plugin/kopf/#!/cluster
第三個組件,analysis-icu (International Component for Unicode/Unicode國際化組件)簡稱稽屏,用來解決編碼與語言問題 扮宠,安裝命令如下。
bin/plugin install analysis-icu
由于我們使用了中文的全文檢索诫欠,所以需要一個分詞器涵卵,默認(rèn)推薦使用ik浴栽,所以我們需要安裝一個ik分詞器組件荒叼。
最簡單的方式是,官網(wǎng)下載一個編譯好的zip包(找不到的可以找我要典鸡,注意與es對應(yīng)的版本被廓,不然會提示版本不匹配,無法啟動)萝玷,解壓到es的安裝目錄下嫁乘,命令如下。
unzip -o ./elasticsearch-analysis-ik-1.10.3.zip -d ./elasticsearch/plugins/ik
至此球碉,所有插件安裝完畢蜓斧,可以啟動啦。
需要注意的是睁冬,es使用root用戶是起不來的挎春,所以需要專門生成一個用戶,用來啟動它豆拨。
比如直奋,我們生成一個專門用戶,然后為es所有目錄賦予該用戶以及用戶組權(quán)限施禾。
useradd elasticsearch
chown -R elasticsearch.elasticsearch /data/application/mitechat_bot/elasticsearch-2.4.3
在這里我們需要注意脚线,當(dāng)使用chown進(jìn)行權(quán)限賦予的時候,一定要定位到實際的文件夾位置弥搞,而不是軟鏈邮绿。
最后渠旁,我們使用該用戶來啟動它吧,順便讓他在后臺默默運(yùn)行船逮。
su - elasticsearch -c "/data/application/mitechat_bot/elasticsearch/bin/elasticsearch &"
我們使用一個地址來檢測是否啟動成功一死,當(dāng)然,我們這里啟動的是單節(jié)點的es傻唾,自己玩夠用啦投慈,命令如下。
http://host:9200/_cluster/health?pretty
在這里冠骄,我們就可以看到集群名伪煤、es集群的master,節(jié)點數(shù)凛辣,健康狀態(tài)等等抱既。
內(nèi)部邏輯實現(xiàn)過程。
首先是索引的創(chuàng)建過程扁誓,在這里防泵,我們(公眾號:數(shù)據(jù)蟲巢,ID:blogchong)先創(chuàng)建一個具有兩個字段的Mapping模板蝗敢。
索引名字是mite_chat捷泞,類型是chat_str,共兩個字段str_ask,以及str_answe寿谴,兩個字段由于都需要進(jìn)行檢索锁右,所以都進(jìn)行ik分詞,其中調(diào)用PUT模式讶泰,具體如下:
host:port/mite_chat
{
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1
},
"mappings": {
"chat_str": {
"date_detection": false,
"dynamic_templates": [{
"es_string": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "string",
"index": "analyzed",
"analyzer": "ik_max_word"
}
}
}],
"properties": {
"str_ask": {
"type": "string",
"index": "analyzed",
"analyzer": "ik_max_word"
},
"str_answe": {
"type": "string",
"index": "analyzed",
"analyzer": "ik_max_word"
}
}
}
}
}
然后對所有的問答進(jìn)行索引構(gòu)建咏瑟,我們使用了spring boot框架的代碼邏輯(這在里,我提前已經(jīng)把語料處理入庫了)痪署,具體如下码泞。
private?RequestConfig?requestConfig?= RequestConfig.custom()
.setSocketTimeout(15000)
.setConnectTimeout(15000)
.setConnectionRequestTimeout(15000)
.build();
public HttpResult?doPutJson(String url,?String json)?throws?ClientProtocolException,?IOException {
CloseableHttpClient httpClient =?null;
CloseableHttpResponse response =?null;
HttpEntity entity =?null;
String responseContent =?null;
// 創(chuàng)建http PUT請求
httpClient = HttpClients.createDefault();
HttpPut httpPut =?new?HttpPut(url);
httpPut.setConfig(requestConfig);
if (json !=?null) {
// 構(gòu)造一個form表單式的實體
StringEntity stringEntity =?new?StringEntity(json,?ContentType.APPLICATION_JSON);
// 將請求實體設(shè)置到httpPost對象中
httpPut.setEntity(stringEntity);
}
try?{
// 執(zhí)行請求
response = httpClient.execute(httpPut);
return new HttpResult(response.getStatusLine().getStatusCode(),
EntityUtils.toString(response.getEntity(),?"UTF-8"));
}?finally?{
if?(response !=?null) {
response.close();
}
}
}
PS: 囧,由于沒有找到spring boot與es結(jié)合構(gòu)建索引的過程狼犯,所以這里就直接調(diào)用httpclient構(gòu)建一個PUT請求余寥,通過API來構(gòu)建聊天記錄的索引了。
其中url如下辜王,默認(rèn)端口是9300劈狐,可修改,mite_chat是索引名稱呐馆,chat_str是索引類型肥缔,而id就是索引中的唯一id,我們在入庫時有自增id作為唯一id汹来,可以直接使用续膳。
http://host:9300/mite_chat/chat_str/{id}
然后總記錄是12萬條改艇,也很快,基本“唰唰”所有記錄都已經(jīng)構(gòu)建索引完畢坟岔。
接下來就是包裝一個檢索過程來實現(xiàn)傳入問句谒兄,獲取答案了。
在網(wǎng)上有比較多的spring boot與es集成例子社付,所以我們這里就直接使用spring boot內(nèi)嵌的es集成實例了承疲。
首先是spring boot配置,在默認(rèn)的application.properties中鸥咖,配置es相關(guān)的鏈接配置燕鸽,如下。
# elasticsearch相關(guān)配置
spring.data.elasticsearch.cluster-name=mite_chat_es
spring.data.elasticsearch.cluster-nodes=10.24.219.232:14600
PS:第一個配置為集群名稱啼辣,在es的安裝目錄下的config/elasticsearch.yml可以進(jìn)行配置啊研,第二個配置為集群的連接host以及端口,這里只有一個節(jié)點鸥拧,所以配置一個党远,如果有多個,可以英文逗號分隔富弦。
下面為核心查詢的邏輯沟娱。
public static?JSONEntity?multiMatchQuery(Client client,?String str, int?size){
JSONEntity obj =?new?JSONEntity<>();
//需要在文檔中的哪些字段中查詢
QueryBuilder qb= QueryBuilders.multiMatchQuery(str,"str_ask","str_answe")?//夸字段檢索,可設(shè)置type來決定分值高低
.type("best_fields").field("str_ask",2f).field("str_answe",1.f);
//過濾查詢已過時,已采用bool查詢替代
SearchHits hits =EsQuery.query(client,qb,INDEX,TYPE);
SearchHit[] shits = hits.getHits();
int num =(int) hits.getTotalHits();
if(num>size){
num=size;
}
obj.setCount(num);
List list =new?ArrayList<>();
for (int?i=0;i
Map source = shits[i].getSource();
list.add(new?ChatStrEntity(source,shits[i].getScore(),shits[i].getId()));
}
List list1 =?new?ArrayList<>();
int count =?0;
for (ChatStrEntity chatStrEntity:list){
if?(count < size){
list1.add(chatStrEntity);
count++;
}else?{
break;
}
}
obj.setList(list1);
return obj;
}
其中str為問句的字符串舆声,client可以通過spring boot的Autowired注解獲得ElasticsearchTemplate對象花沉,通過該對象獲取client柳爽,包括調(diào)用的代碼如下媳握。
@Autowired
private?ElasticsearchTemplate?es;
public List?multiMatchQuery(String query,int?size){
JSONEntity je = ChatStrDao.multiMatchQuery(es.getClient(),query,size);
List list = je.getList();
return list;
}
其中query調(diào)用過程如下。
public class?EsQuery {
//默認(rèn)查詢的記錄只返回2000條數(shù)據(jù)
public static?SearchHits?query(Client client,?QueryBuilder qb,?String index,?String type){
return?query(client,?qb,?index,?type,2000);
}
//設(shè)置es的返回結(jié)果數(shù)量的查詢
public static?SearchHits?query(Client client,?QueryBuilder qb,?String index,?String type, int?size){
SearchResponse response =client.prepareSearch(index).setTypes(type).setSize(size)
//.setSearchType(SearchType.QUERY_THEN_FETCH)
.setQuery(qb).execute().actionGet();
SearchHits hits = response.getHits();
return hits;
}
上面只是邏輯層的service磷脯,在實際的chatbot的回調(diào)邏輯service中蛾找,如下,做了一些邏輯處理赵誓。
public?String?multiMatchQuery(String query,int?size){
String retStr =?null;
//做安全監(jiān)測
retStr = SafeAnswe.InitJudge(query);
if (retStr !=?null){
return?retStr;
}
Random random =?new?Random();
int randomNum = random.nextInt(100);
if (randomNum %?25?==?0){
return?SafeAnswe.randomSafe(SafeAnswe.safeListsRand);
}
JSONEntity je = ChatStrDao.multiMatchQuery(es.getClient(),query,size);
List list = je.getList();
List listRet =?new?ArrayList<>();
for (ChatStrEntity chatStrEntity: list){
//listRet.add(chatStrEntity.getStr_ask());
listRet.add(chatStrEntity.getStr_answe());
}
if?(listRet.size() !=?0) {
int?count =?0;
while (query.equals(retStr) || retStr ==?null) {
if?(count>size){
retStr = SafeAnswe.randomSafe(SafeAnswe.safeListsNo);
break;
}else?{
int?num = random.nextInt(listRet.size() -?1);
retStr = listRet.get(num);
count++;
}
}
}else?{
retStr = SafeAnswe.randomSafe(SafeAnswe.safeListsNo);
}
return?retStr;
}
我們可以看到打毛,第一個邏輯做了安全問題回到,以及做異常監(jiān)測俩功,具體監(jiān)測幻枉。
//異常處理以及安全監(jiān)測
public static?String?InitJudge(String input){
//做長度判斷
if?(input.length() >?200){
return?randomSafe(safeListsMuch);
}?else if(input.matches(".*你好.*") ||
input.matches(".*hello.*")){
return?randomSafe(safeListsHello);
}?else if?(input.matches(".*你是誰.*") ||
input.matches(".*你叫什么名字.*") ||
input.matches(".*你的名字.*") ||
input.matches(".*你是?.*") ||
input.matches(".*你是?.*") ||
input.matches(".*你叫什么名字.*") ||
input.matches(".*你叫什么.*")){
return?randomSafe(safeListsWho);
}?else if?(input.matches(".*你多大.*") ||
input.matches(".*幾歲.*") ||
input.matches(".*年齡多大.*") ||
input.matches(".*多大了.*")){
return?randomSafe(safeListsAge);
}else if?(input.matches(".*數(shù)據(jù)蟲巢.*")){
return?randomSafe(safeListsBlogchong);
}else?{
return null;
}
}
在這里诡蜓,對于一些常規(guī)的問答模板熬甫,做了定制化的處理,其實有點像AIML的處理過程蔓罚,包括了問你是誰呀椿肩,年齡啊等瞻颂,并且為了增加趣味性,在回答里做了隨機(jī)答案處理郑象,以及對問句長度進(jìn)行了檢測贡这。
//問題過長
public static?List?safeListsMuch?= Arrays.asList(
"你一下子問的太多了,能不能一個一個來厂榛!",
"羅里吧嗦一大推盖矫,能簡單點說嘛?",
"你這是在問問題還是在寫作文击奶?",
"你問的這一坨炼彪,只有神才能回到的出來,(⊙﹏⊙)b",
"隔壁家的siri都未必知道吧正歼,反正我是不知道辐马。",
"你知道答案嗎?局义!",
"建議你去問問隔壁家的小娜姐姐喜爷。",
"你是故意的吧,再這樣我就不陪你玩了萄唇!",
"檩帐。。另萤。湃密。。四敞。泛源。。忿危。达箍。。铺厨。缎玫。。解滓。赃磨。。洼裤。邻辉。。。恩沛。在扰。。雷客。芒珠。。搅裙。皱卓。。部逮。娜汁。。兄朋。掐禁。。颅和。傅事。。峡扩。");
至于這些safelist就是各種隨機(jī)string的list了蹭越。
再接上面chatbot的邏輯service,進(jìn)行了25%的概率進(jìn)行隨機(jī)安全回答教届,根據(jù)有趣味性响鹃,其中safeListsRand如下。
//隨機(jī)趣味問答
public static?List?safeListsRand?= Arrays.asList(
"這種問題用的著回答嗎",
"小蟲不想回答你的問題案训,并向你拋出了一個bug买置,所以別問了,趕緊解決bug去吧~",
"給俺發(fā)紅包了嗎萤衰,沒發(fā)回答個jj堕义。",
"這個問題隔壁家的siri美美吧,太簡單了脆栋,表示不屑回答。",
"隔壁家的小娜姐姐都不知道吧洒擦,你問我我問誰去呀",
"愛瑪椿争,俺在思考人生呢,等會兒再想這個問題熟嫩。",
"起開秦踪,今天不想再說好了",
"這個問題上次就問過小冰妹妹,她也不知道。",
"O(∩_∩)O哈哈~椅邓,先睡一覺再說Z~~");
經(jīng)過安全檢測柠逞,以及25%的安全趣味回答之后,才會走到ES的邏輯景馁。
在ES邏輯里板壮,由于樣本語料的不完整性,所以默認(rèn)ES檢索匹配的不一定的最佳的合住,這里我(公眾號:數(shù)據(jù)蟲巢绰精,ID:blogchong)選擇了默認(rèn)排序的前Top5,做了隨機(jī)回答選擇透葛。
最后笨使,在controller層做接口輸出。
@Autowired
private?MiteChatService?miteChatService;
@RequestMapping(value="/query")
public?String?miteChat(HttpServletRequest httpServletRequest,
@RequestParam(value?=?"input") String input,
@RequestParam(value?=?"size",defaultValue?=?"5")?int?size)?throws?Exception{
long?beginTime = TransferTime.dateToLong(new?Date());
String retStr =?miteChatService.multiMatchQuery(input,size);
long endTime = TransferTime.dateToLong(new?Date());
logger.info("IP["+ GetAddrHostUtils.getAddrHost(httpServletRequest)+"] MODULE[/chatbot/query] INPUT["+input+"] SERVICE_TIME["+(endTime-beginTime)+"ms]");
return retStr;
}
最后我們來看下前端這里僚害,怎么構(gòu)建硫椰。
先來看看前端的效果是怎么樣的。
主要就是內(nèi)容聊天框架萨蚕,這里選擇了cheditor最爬,它支持html的內(nèi)容展示,再加上一個輸入框和發(fā)送按鈕门岔,html代碼如下爱致。
background-image:url(/images/bot_logo.png);
background-repeat:no-repeat;
background-position:left top;
background-blend-mode:normal;
background-attachment:fixed;
background-size:61px?50px;
background-position:?20px?0px">
發(fā)送
然后在發(fā)送按鈕處調(diào)用實際的chatbot聊天接口互艾,實現(xiàn)一個發(fā)送請求獲取結(jié)果的控制器,實際聊天調(diào)用的請求是/chatbot/query接口讯泣,獲取返回數(shù)據(jù) 纫普。
function submit() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.) {
xmlHttp = new ();
}
var input = $("#input").val().trim();
if (input ==?'') {
jQuery('#input').val('');
return;
}
addText(input, false);
jQuery('#input').val('');
jQuery('#info').html('小蟲正在思考中,請稍后...');
var datastr =?"input="?+ input;
datastr = encodeURI(datastr);
var url =?"/chatbot/query";
xmlHttp.open("POST", url, true);
xmlHttp.onreadystatechange = callback;
xmlHttp.setRequestHeader("Content-type",?"application/x-www-form-urlencoded");
xmlHttp.send(datastr);
}
至于其他邊邊角角的展示,可以直接上官網(wǎng)對應(yīng)的小蟲機(jī)器人聊天模塊好渠,查看具體的html源碼()昨稼。
到這里,基本上大體的思路拳锚,以及關(guān)鍵的核心代碼都講解完了假栓,其實原則上來說就是一個搜索過程。
后續(xù)的規(guī)劃霍掺。
我們知道匾荆,最終比較合理的chatbot形態(tài)一定是基于深度學(xué)習(xí)來做的拌蜘,我們這里基于搜索來做只是一個入門,一個鍛煉接觸新事物的方式而已牙丽。
拋開目前的我(公眾號:數(shù)據(jù)蟲巢简卧,ID:blogchong)對于深度學(xué)習(xí)用于chatbot的技能基本為零,這個點倒不是我所擔(dān)心的烤芦,如果真的要學(xué)習(xí)一個新的技能举娩,花點時間和精力問題還是不大。
最關(guān)鍵的問題在于拍棕,實際上我們的訓(xùn)練語料真的沒有想象中好晓铆,比如會存在以下幾個情況。
1 QQ群聊天不像一對一的聊天绰播,可能會存在同時多人在聊情況骄噪,這意味著相鄰的兩個語句不一定是一問一答的模式。
2 整個聊天記錄不是一個整體蠢箩,因為全年的聊天不可能是不間斷的链蕊,直接相鄰處理,意味著強(qiáng)行把兩次間斷的聊天強(qiáng)行合并了谬泌。
語料的不良滔韵,上層架構(gòu)再怎么改進(jìn),最終的效果可能都還會令人擔(dān)憂掌实,但糾結(jié)的是目前又沒有更好的辦法去獲取新的語料陪蜻。
本來小蟲在實現(xiàn)時還會做進(jìn)一步改良的,比如構(gòu)建技術(shù)專有名詞庫贱鼻,提升匹配的精度問題宴卖,以及集成AIML語言,做精確模板的匹配(能走AIML即走AIML模板邻悬,走不了的過搜索的方案)症昏,但由于語料問題,感覺做下去效果也不會太大父丰,所以終止了肝谭。
所以,后續(xù)的規(guī)劃中蛾扇,可能會繼續(xù)往深度學(xué)習(xí)里做全局的改造攘烛,也可能只是做局部趣味改良,比如使用深度學(xué)習(xí)讓小蟲學(xué)會作詩之類的屁桑。
這類例子在網(wǎng)上也是有跡可循的医寿,所以入手起來應(yīng)該會好點,也剛好體驗了深度學(xué)習(xí)的魅力蘑斧。
具體怎么操作,需要看后面的時間以及實際的嘗試了,所以竖瘾,你也可以期待這個系列的下一篇 哈哈沟突。
最后。
不管用用什么技術(shù)實現(xiàn)捕传,從0到1總算是把一個大數(shù)據(jù)對話聊天機(jī)器人給編寫出來了惠拭。
效果的話,有時候答的很有趣合情合理庸论,有時候抽風(fēng)职辅,但就大數(shù)據(jù)領(lǐng)域來說,勉強(qiáng)可以玩玩聂示,其他流弊的chatbot遇到大數(shù)據(jù)垂直技術(shù)問題的時候一樣懵逼(畢竟是通用型chatbot域携,沒有專門的針對這方面的語料進(jìn)行訓(xùn)練)。
所以鱼喉,這就是一個鍛煉以及試圖熟悉對話聊天機(jī)器人領(lǐng)域的嘗試秀鞭,并且試圖去熟悉深度學(xué)習(xí)等領(lǐng)域的知識(后續(xù))。
最后扛禽,關(guān)于小蟲機(jī)器人前端這塊锋边,我(公眾號:數(shù)據(jù)蟲巢,ID:blogchong)基本參考的是“shareditor博客”上的(沒辦法编曼,前端這塊屬于半路出家)豆巨,所以特意謝鳴。
最最后掐场,也希望大伙兒能多動手往扔,嘗試一些對自己技術(shù)有用,并且好玩的事刻肄,沒壞處瓤球。
擴(kuò)展閱讀:
訪問小蟲大數(shù)據(jù)機(jī)器人,直接訪問“數(shù)據(jù)蟲巢(www.mite8.com)”網(wǎng)站敏弃,點擊s網(wǎng)站首頁側(cè)邊的小蟲圖標(biāo)即可進(jìn)入體驗卦羡。
廣而告之:
要不要學(xué)習(xí)如何編寫一個屬于自己的聊天機(jī)器人,一起探討大數(shù)據(jù)麦到、人工智能的相關(guān)的話題绿饵,是不是想要跨界進(jìn)入大數(shù)據(jù)領(lǐng)域,歡迎加入“數(shù)據(jù)蟲巢讀者私密群”瓶颠,目前是一個大數(shù)據(jù)技術(shù)超越百人小圈子拟赊,歡迎你的加入,并且我們的群會有不定期的分享活動喲粹淋。 =>>?吸祟。