这是 Joseph Weizenbaum 于 1966 年创作的经典 Eliza 程序,移植到 SciTE,并从 2005 年 1 月的版本更新而来。这个新脚本运行得更好,请查看下面源代码中的注释以了解如何使用它。
示例输出
WELCOME TO ANOTHER SESSION WITH
YOUR COMPUTER PSYCHIATRIST, ELIZA
IT SURE IS NEAT TO HAVE YOU DROP BY
hi there
THAT'S SO... PLEASE CONTINUE...
thanks for all the fish
I UNDERSTAND...
local SIG = "SciTE_ClassicEliza"
if OnChar and not scite_Command then
Error("There is an OnChar conflict, please use extman")
elseif not scite_OnChar then
local _OnChar
scite_OnChar = function(f) _OnChar = f end
OnChar = function(c) if _OnChar then return _OnChar(c) end end
end
local function Eliza(text)
local response = ""
local user = string.upper(text)
local userOrig = user
local randReplies = {
"WHAT DOES THAT SUGGEST TO YOU?",
"I SEE...",
"I'M NOT SURE I UNDERSTAND YOU FULLY.",
"CAN YOU ELABORATE ON THAT?",
"THAT IS QUITE INTERESTING!",
"THAT'S SO... PLEASE CONTINUE...",
"I UNDERSTAND...",
"WELL, WELL... DO GO ON",
"WHY ARE YOU SAYING THAT?",
"PLEASE EXPLAIN THE BACKGROUND TO THAT REMARK...",
"COULD YOU SAY THAT AGAIN, IN A DIFFERENT WAY?",
}
local replies = {
[" CAN YOU"] = "PERHAPS YOU WOULD LIKE TO BE ABLE TO",
[" DO YOU"] = "YES, I",
[" CAN I"] = "PERHAPS YOU DON'T WANT TO BE ABLE TO",
[" YOU ARE"] = "WHAT MAKES YOU THINK I AM",
[" YOU'RE"] = "WHAT IS YOUR REACTION TO ME BEING",
[" I DON'T"] = "WHY DON'T YOU",
[" I FEEL"] = "TELL ME MORE ABOUT FEELING",
[" WHY DON'T YOU"] = "WHY WOULD YOU WANT ME TO",
[" WHY CAN'T I"] = "WHAT MAKES YOU THINK YOU SHOULD BE ABLE TO",
[" ARE YOU"] = "WHY ARE YOU INTERESTED IN WHETHER OR NOT I AM",
[" I CAN'T"] = "HOW DO YOU KNOW YOU CAN'T",
[" SEX"] = "I FEEL YOU SHOULD DISCUSS THIS WITH A HUMAN.",
[" I AM"] = "HOW LONG HAVE YOU BEEN",
[" I'M"] = "WHY ARE YOU TELLING ME YOU'RE",
[" I WANT"] = "WHY DO YOU WANT",
[" WHAT"] = "WHAT DO YOU THINK?",
[" HOW"] = "WHAT ANSWER WOULD PLEASE YOU THE MOST?",
[" WHO"] = "HOW OFTEN DO YOU THINK OF SUCH QUESTIONS?",
[" WHERE"] = "WHY DID YOU THINK OF THAT?",
[" WHEN"] = "WHAT WOULD YOUR BEST FRIEND SAY TO THAT QUESTION?",
[" WHY"] = "WHAT IS IT THAT YOU REALLY WANT TO KNOW?",
[" PERHAPS"] = "YOU'RE NOT VERY FIRM ON THAT!",
[" DRINK"] = "MODERATION IN ALL THINGS SHOULD BE THE RULE.",
[" SORRY"] = "WHY ARE YOU APOLOGIZING?",
[" DREAMS"] = "WHY DID YOU BRING UP THE SUBJECT OF DREAMS?",
[" I LIKE"] = "IS IT GOOD THAT YOU LIKE",
[" MAYBE"] = "AREN'T YOU BEING A BIT TENTATIVE?",
[" NO"] = "WHY ARE YOU BEING NEGATIVE?",
[" YOUR"] = "WHY ARE YOU CONCERNED ABOUT MY",
[" ALWAYS"] = "CAN YOU THINK OF A SPECIFIC EXAMPLE?",
[" THINK"] = "DO YOU DOUBT",
[" YES"] = "YOU SEEM QUITE CERTAIN. WHY IS THIS SO?",
[" FRIEND"] = "WHY DO YOU BRING UP THE SUBJECT OF FRIENDS?",
[" COMPUTER"] = "WHY DO YOU MENTION COMPUTERS?",
[" AM I"] = "YOU ARE",
}
local conjugate = {
[" I "] = "YOU",
[" ARE "] = "AM",
[" WERE "] = "WAS",
[" YOU "] = "ME",
[" YOUR "] = "MY",
[" I'VE "] = "YOU'VE",
[" I'M "] = "YOU'RE",
[" ME "] = "YOU",
[" AM I "] = "YOU ARE",
[" AM "] = "ARE",
}
local function replyRandomly()
response = randReplies[math.random(table.getn(randReplies))].."\n"
end
local function processInput()
for keyword, reply in pairs(replies) do
local d, e = string.find(user, keyword, 1, 1)
if d then
response = response..reply.." "
if string.byte(string.sub(reply, -1)) < 65 then
response = response.."\n"; return
end
local h = string.len(user) - (d + string.len(keyword))
if h > 0 then
user = string.sub(user, -h)
end
for cFrom, cTo in pairs(conjugate) do
local f, g = string.find(user, cFrom, 1, 1)
if f then
local j = string.sub(user, 1, f - 1).." "..cTo
local z = string.len(user) - (f - 1) - string.len(cTo)
response = response..j.."\n"
if z > 2 then
local l = string.sub(user, -(z - 2))
if not string.find(userOrig, l) then return end
end
if z > 2 then response = response..string.sub(user, -(z - 2)).."\n" end
if z < 2 then response = response.."\n" end
return
end
end
response = response..user.."\n"
return
end
end
replyRandomly()
return
end
if string.sub(user, 1, 3) == "BYE" then
response = "BYE, BYE FOR NOW.\nSEE YOU AGAIN SOME TIME.\n"
return response
end
if string.sub(user, 1, 7) == "BECAUSE" then
user = string.sub(user, 8)
end
user = " "..user.." "
processInput()
response = response.."\n"
return response
end
local function ElizaHandler(c)
if not buffer[SIG] then return end
if c == "\n" then
local lnUser = editor:LineFromPosition(editor.CurrentPos) - 1
if lnUser < 0 then return end
local lbeg = editor:PositionFromLine(lnUser)
local lend = editor.LineEndPosition[lnUser]
local text = editor:textrange(lbeg, lend)
if text ~= "" then
editor:AddText(Eliza(text))
end
end
return true
end
function ClassicEliza()
scite_OnChar(ElizaHandler)
scite.Open("")
buffer[SIG] = true;
editor:AddText([[
WELCOME TO ANOTHER SESSION WITH
YOUR COMPUTER PSYCHIATRIST, ELIZA
IT SURE IS NEAT TO HAVE YOU DROP BY
]])
editor:DocumentEnd()
math.randomseed(os.time())
end
最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2008 年 8 月 14 日下午 7:31 GMT (差异)