nltk.chat.util聊天机器人如何替换无匹配时返回的None值
问题原因
你原代码没生效的核心原因是chat.converse()本身就是内置无限循环的交互方法,调用后会一直卡在这行执行自带的交互逻辑,你后面写的while循环永远不会被执行。
解决方法
有两种常用实现方案:
方案1:添加兜底匹配规则(最简单)
nltk的Chat类会按从上到下的顺序匹配规则,你只需要在现有规则列表的最后添加一个匹配所有输入的兜底规则,所有没命中前面规则的输入都会走这个规则,直接返回你自定义的内容,不会再输出None。
修改后的完整代码:
from nltk.chat.util import Chat, reflections ciftler = [ ['(Benim adım|adım|ben)(.*)', ["Merhaba %1, nasılsın?"]], ['(.*)(Benim adım|adım|ben)', ["Merhaba %1, nasılsın?"]], ['(adın ne|adın|isim|ismin ne|ismin var mı|ismin varmı|sana ne diyorlar|sana nasıl seslenelim|bir adın varmı|bir adın var mı)',['onur']], ['(merhaba|selam|selamünaleyküm|hey|naber|bro|hi|whatsup)',['merhaba nasılsın,','selam nasılsın ', 'merhaba nasıl gidiyor']], ['(iyidir|sağol|sağolasın|eyvallah|iyi iyi|iyi|eh işte|ii|sen)',['süper']], ['(iyi değilim|kötü|sik gibi|keyfim yok|hiç iyi sayılmaz|kötüyüm|bilmem|boşver)',['ne oldu ki']], ['(Yaşın kaç?|yaş|yaş?|yaşın|Yaşın?|kaç yaşındasın)',['yeni doğdum sayılır']], ['(memleket|nerelisin|hangi şehir|hangi ülke|nerdesin|şu an nerdesin|neredesin|şu an neredesin|memleketin)',['şişli, istanbul']], ['(.*) gittim',['%1! ok']], # 新增兜底规则,必须放在所有规则的最后 ['(.*)', ['Anlamadım, lütfen tekrar anlatır mısın?']] ] yansimalar={ 'merhaba': 'merhaba, nasılsın', 'gittim':'gittin', 'Selamünaleyküm':'Aleykümselam', '12':'21' } chat = Chat(ciftler, yansimalar) def deneme(): chat.converse() deneme()
方案2:自定义交互逻辑,不用自带的converse方法
如果你不想加兜底规则,也可以自己实现交互流程,手动判断返回结果是否为None,自行替换成自定义内容,这种方案灵活度更高,还可以加额外的交互逻辑:
from nltk.chat.util import Chat, reflections ciftler = [ ['(Benim adım|adım|ben)(.*)', ["Merhaba %1, nasılsın?"]], ['(.*)(Benim adım|adım|ben)', ["Merhaba %1, nasılsın?"]], ['(adın ne|adın|isim|ismin ne|ismin var mı|ismin varmı|sana ne diyorlar|sana nasıl seslenelim|bir adın varmı|bir adın var mı)',['onur']], ['(merhaba|selam|selamünaleyküm|hey|naber|bro|hi|whatsup)',['merhaba nasılsın,','selam nasılsın ', 'merhaba nasıl gidiyor']], ['(iyidir|sağol|sağolasın|eyvallah|iyi iyi|iyi|eh işte|ii|sen)',['süper']], ['(iyi değilim|kötü|sik gibi|keyfim yok|hiç iyi sayılmaz|kötüyüm|bilmem|boşver)',['ne oldu ki']], ['(Yaşın kaç?|yaş|yaş?|yaşın|Yaşın?|kaç yaşındasın)',['yeni doğdum sayılır']], ['(memleket|nerelisin|hangi şehir|hangi ülke|nerdesin|şu an nerdesin|neredesin|şu an neredesin|memleketin)',['şişli, istanbul']], ['(.*) gittim',['%1! ok']] ] yansimalar={ 'merhaba': 'merhaba, nasılsın', 'gittim':'gittin', 'Selamünaleyküm':'Aleykümselam', '12':'21' } chat = Chat(ciftler, yansimalar) def deneme(): print("Merhaba, benimle sohbet edebilirsin! Çıkmak için 'quit' yazabilirsin.") while True: user_input = input("> ") if user_input.lower() == 'quit': break resp = chat.respond(user_input) # 无匹配时resp为None,替换为自定义内容 if not resp: resp = "Anlamadım, lütfen tekrar söyler misin?" print(resp) deneme()
内容的提问来源于stack exchange,提问作者onur yılmaz
相关产品推荐
相关产品推荐

