วันพฤหัสบดีที่ 26 เมษายน พ.ศ. 2555
วันศุกร์ที่ 6 เมษายน พ.ศ. 2555
swath python linux
from subprocess import *
inp = raw_input('Input>>')
p = Popen("echo %s | swath -b ' ' -u u,u" % inp, shell=True, stdout=PIPE)
p.wait()
word = unicode(p.communicate()[0],'utf-8')
word = word.split()
print word
inp = raw_input('Input>>')
p = Popen("echo %s | swath -b ' ' -u u,u" % inp, shell=True, stdout=PIPE)
p.wait()
word = unicode(p.communicate()[0],'utf-8')
word = word.split()
print word
AIML (Artificial Intelligence Markup Language)
AIML (Artificial Intelligence Markup Language)
AIML
เป็นภาษาปัญญาประดิษฐ์
ที่พัฒนาจาก XML
(Extensive Markup Language) ใช้ในการพัฒนาแชทบอท
มีลักษณะงานต่อการเรียนรู้
ซึ่งมีรายละเอียดดังนี้
- แท็กในภาษา AIML
- แท็ก <aiml> เป็นแท็กที่ใช้เมื่อเริ่มต้น และสิ้นสุดเอกสาร aiml
- แท็ก <category> เป็นแท็กที่เริ่มต้น และสิ้นสุดการเพิ่ม 1 ฐานความรู้ของแชทบอท
- แท็ก <pattern> เป็นแท็กที่ใช้เปรียบเทียบประโยคที่ผู้ใช้พิมพ์สนทนากับแชทบอท
- แท็ก <template> เป็นแท็กที่โต้ตอบผู้ใช้
- แท็ก <random> เป็นแท็กที่ใช้ในการสุ่มประโยคเพื่อโต้ตอบผู้ใช้
- แท็ก <li>เป็นแท็กที่ใช้เป็นประโยคตัวเลือกในการสุ่มประโยคเพื่อโต้ตอบผู้ใช้
- แท็ก <that> เป็นแท็กที่อ้างถึงบทสนทนาที่ผ่านมา
- แท็ก <think> เป็นแท็กที่ใช้กำหนดให้แชทบอทมีความนึกคิด ซึ่งจะไม่แสดงผลลัพธ์นั่นกลับไปยังผู้ใช้เป็นวิธีหนึ่งที่ทำให้บทสนทนามี ความกระชับมากยิ่งขึ้น
- แท็ก <topic> เป็นแท็กที่เพิ่มประเด็น หรือหัวข้อในกับแชทบอท
- แท็ก <srai> เป็นแท็กที่ใช้อ้างอิงถึง category อื่นๆ
ตัวอย่างเช่น
<aiml>
<category>
<pattern>คุณ
คือ ใคร</pattern>
<template>
<think><set
name=“topic”>me</set></think>
ดิฉันคือแชทบอท
มีชื่อว่าศิรารณี
</template>
</category>
</aiml>
จะได้ผลลัพธ์ดังนี้
Client:
คุณ คือ
ใคร
Robot:
ดิฉันคือแชทบอท
มีชื่อว่าศิรารณี
เมื่อผู้ใช้พิมพ์ประโยค
"คุณ
คือ ใคร” ซึ่งตรง <pattern>
ที่กำหนดไว้
แชทบอทจะตอบกลับมาตามที่กำหนดไว้ใน
<template>
ว่า
"ดิฉันคือแชทบอท
มีชื่อว่าศิรารณี”
การำหนดแท็ก
<pattern>
และ แท็ก
<template>
นั้นจะต้องกำหนดภายใต้
<category>
</category> เท่านั้น
และภายในแท็ก <category>
จะมี
<pattern>
และ แท็ก
<template>
ได้เพียง
1 ชุดเท่านั้น
แท็ก
<think>
เป็นแท็กที่ใช้กำหนดให้แชทบอทมีความนึกคิด
ซึ่งไม่แสดงผลลัพธ์นั้นกลับไปยังผู้ใช้
ในที่นี้ แชทบอทจะไปกำหนด
<topic>
เป็น
"Me”
ซึ่งเป็นหัวข้อที่เกี่ยวกับตัวแชทบอทเอง
และเก็บไว้ในหน่อยความจำ
ทกให้ category
อื่นๆ
สามารถอ้างถึง topic
นี้ได้
- หลักการทำงานของ AIML
การทำงานของ
AIML นั้น
จะใช้หลักการทำงานของ
"znearest-neighbor
classification” โดยจะรับประโยคเข้ามาเพื่อนไปเปรียบเทียบกับรูปแบบ
<pattern>
ที่ใกล้เคยงที่สุด
แต่ละรูปแบบจะมีการโต้ตอบตาม
<template>
ที่ได้กำหนดไว้
รูปแบบ
(model)
การเรียนรู้แบบนี้เป็นรูปแบบหนึ่ง
ที่เรียกว่า "supervised
training” ซึ่งจะต้องมีผู้กำหนดบทบาทในการตอบสนองต่างๆ
ให้แชทบอท
การเปรียบเทียบรูปแบบที่ใกล้เคียงของ
AIML
จะเปรียบเทียบ
โดยใช้คำ (word)
ภายใต้
categories
ในการเปรียบเทียบ
ซึ่งจะแบ่งเป็น 3
ชนิด
ได้แก่
- Atomic categories
คือ
categories
ที่ประกอบด้วย
<pattern>
ทีไม่มีสัญลักษณ์
_ (under
score) และ
* (star)
ตัวอย่างเช่น
<aiml>
<category>
<pattern>คุณ
อยู่ ที่ ไหน</pattern>
<template>ดิฉันอยู่มหาวิทยาลัยศิลปากร</template>
</category>
</aiml>
จากตัวอย่างนี้
ถ้าผู้ใช้งานแชทบอทพิมพ์
ประโยค "คุณ
อยู่ ที่ ไหน"
แล้วซึ่งตรงกับ
<pattern>
จากนั้นแชทบอทจะตอบกลับมา
"ดิฉันอยู่มหาวิทยาลัยศิลปากร”
ตามที่ <template>
ได้กำหนดไว้มีสัญลักษณ์
_ (under
score) และ
* (star)
จะทำให้การรับ
input
ประโยคหรือวลี
สามารถทำได้ซับซ้อนขึ้น
เพราะถ้าหากแชทบอทไม่สามารถจับคู่
<pattern>
แบบ
- Default categories
คือ
categories
ที่ประกอบด้วย
<pattern>
ที่
Atomic
categories ได้
แชทบอทจะพยายามจับคู่แบบ
Default
categories
สัญลักษณ์
_ (under
score) จะทำให้การรับ
input และ
<pattern>
สามารถทำได้ง่านขึ้นโดย
input
แต่ละครั้งที่รับเข้ามานั้น
บางครั้งไม่ตรงกับ <pattern>
ที่กำหนดไว้ทั้งหมด
ทำให้ไม่สามาระจับคู่ได้
แต่ถ้ามีสัญลักษณ์ _
(under score) ใน
<pattern>
ถึงแม้ว่า
input
จะไม่ตรงกับ
<pattern>
ทั้งหมด
ก็สามารถจับได้
ตัวอย่างที่
1
<category>
<pattern>สวัสดี
_</pattern>
<template>สวัสดีค่ะ</template>
</category>
จากตัวอย่างนี้
ถ้าผู้ใช้งานแชทบอทพิมพ์
ประโยคที่ขึ้นต้นด้วย สวัสดี
และมีคำต่อท้ายอะไรก็ได้
เช่น สวัสดีจ้า แชทบอทจะจับคู่
ประโยคที่ตรงกับ <pattern>
ที่กำหนดไว้คือ
สวัสดีจ้า แต่เมื่อไม่พบ
จะจับคู่กับ <pattern>สวัสดี
_</pattern>
แล้วตอบกลับมา
"สวัสดีค่ะ"
ตามที่
<template>
ได้กำหนดไว้
สัญลักษณ์
* (star)
จะสัญลักษณ์ที่มีหลักการทำงานคล้ายกับสัญลักษณ์
_ (under
score) แต่ลำดับความการทำงานโปรแกรมจะประมวลผลสัญลักษณ์
_ (under
score) ก่อนสัญลักษณ์
* (star) เสมอ
และในหนึ่ง <pattern>
จะมีสัญลักษณ์
_ (under
score) และสัญลักษณ์
* (star)
ได้อย่าละหนึ่งสัญลักษณ์เท่านั้น
ตัวอย่างที่
2
<category>
<pattern>สวัสดี
*</pattern>
<template>สวัสดีค่ะ</template>
</category>
จากตัวอย่างนี้
ถ้าผู้ใช้งานแชทบอทพิมพ์
ประโยคที่ขึ้นต้นด้วย สวัสดี
และมีคำต่อท้ายอะไรก็ได้
เช่น สวัสดีศิราณี แชทบอทจะจับคู่
ประโยคที่ตรงกับ <pattern>
ที่กำหนดไว้คือ
สวัสดีศิราณี แต่เมื่อไม่พบ
จะจับคู่กับ <pattern>สวัสดี
*</pattern>
แล้วตอบกลับมา
"สวัสดีค่ะ"
ตามที่
<template>
ได้กำหนดไว้
ถ้าแต่ทั้งสอง
<category>
อยู่ในเอกสาร
AIML เดียวกัน
แชทบอทจะประมวลผล <category>
ที่มีสัญลักษณ์
_ (under
score) ก่อนสัญลักษณ์
* (star) ทำให้
<category>
ที่มีสัญลักษณ์
* (star)
ไม่ถูกใช้ในเอกสาร
AIML
- Recursive categories
ตือ
categories
ที่ประกอบด้วยแท็ก
<srai>
Simply Recursive Artificial Intelligence และแท็ก
<sr>
Symbolic reduction ซึ่งทั้งสองแท็กนี้จะทำให้การกำหนดบทสนทนาสั้น
และกระชับมากขึ้น
โดยการลดทอนประโยคที่ป้อนเข้ามาให้อยุ่ในรูปเดี่ยวที่ง่ายขึ้น
จากนั้นแบ่งประโยคออกเป็นประโยคย่อยๆ
เป็น 2
ส่วน
หรือมากกว่านั้น
และทำการรวมส่วนที่เป็นคำตอบของแต่ละส่วมาเป็นโต้ตอบผู้ใช้
และเชื่อมส่วนที่คล้ายคลึงกันโดยการรวมคำพูดต่าง
ๆ ซึ่งคล้ายกับการคิดนั้นเป้ฯคำตอบ
Symbolic
reduction
จะเป็นการใช้แท็ก
<srai>
เพื่อลดทอนประโยคที่ป้อนเข้ามาให้อยู่ในรูปที่งายขึ้น
ตัวอย่าง
<category>
<pattern>คุณ
รู้ ไหม ว่า *
คือ
อะไร</pattern>
<template><srai>อะไรคือ<star/></srai></template>
</category>
จากตัวอย่างนี้
ถ้าผู้ใช้งานแชทบอทพิมพ์
แระโยค "คุณ
รู้ ไหม ว่า *
คือ
อะไร” เข้ามาแชทบอท จะตอบกลับไปโดย
ลดทอนประโยค เป็น อะไรคือ
*
แล้วจับคู่กับ
<pattern>
ที่กำหนดไว้ซึ่ง
* จะหมายถึง
คำตอบอะไรก็ได้ถ้ามี <category>
ที่กำหนด
<pattern>
อะไร
คือ *
</pattern> ไว้
แชทบอท จะจับคู่กับ <pattern>
นั้น
แล้วตอบกลับมาตามที่ <template>
ได้กำหนดไว้
Divide
and conquer
จะเป็นการแยกประโยคออกเป็นสองส่วน
โดยใช้ <sr/>
ซึ่งจะหมายถึง
<srai><star></srai>
ตัวอย่าง
<category>
<pattern>ใช่
*</pattern>
<template><srai>ใช่</srai><sr/><template>
</category>
จากตัวอย่างนี้
ถ้าผู้ใช้งานแชทบอทพิมพ์
ประโยคที่ขึ้นต้นด้วยคำว่า
"ใช่"
ตามด้วยคำว่าอะไรก้ได้
เข้ามา แชทบอท จะ แยกประโยคออกเป็น
"ใช่"
และ *
ซึ่ง *
จะหมายถึง
คำอะไรก็ได้ ถ้ามี <category>
ที่กำหนด
<pattern>ใช่</pattern>
ไว้
แชทบอท จะจับคู่กับ <pattern>
นั้น
แล้วตอบกลับมาตามที่ <template>
และถ้ามี
<category>
ที่กำหนด
<pattern>*</pattern>
ไว้แชทบอท
จะจับคู่กับ <pattern>
นั้น
แล้ตอบกลับมาตามที่ <template>
ได้กำหนดไว้
Synonyms
จะเป็นการตอบโต้สำหรับประโยคที่มีความหมายใกล้เคียงกัน
ตัวอย่าง
<category>
<pattern>หวาดดี</pattern>
<template><srai>สวัสดี</srai></template>
</category>
จากตัวอย่างนี้
ถ้าผู้ใช้งานแชทบอทพิมพ์ประโยค
"หวาดดี”
เข้ามา แชทบอท จะตอบกลับไปโดยใช้อ้างอิงกับ
<category>
ที่ประกอบด้วย
<pattern>สวัสดี</pattern>
แล้วตอบกลับมาตามที่
<template>
ได้กำหนดไว้
Keywords
โดยปกติประโยคที่รับเข้ามาจะไม่ได้ตรงกับ
<pattern>
โดยตรงจึงต้องกำหนด
<template>
ให้สามารถหาคำตอบในประโยคนั้นได้
ตัวอย่าง
<category>
<pattern>พ่อ</pattern>
<template>เล่าเรื่องเกี่ยวกับครอบครัวคุณให้เราฟังหน่อยสิ</template>
</category>
<category>
<pattern>_พ่อ</pattern>
<template><srai>พ่อ</srai></template>
</category>
<category>
<pattern>พ่อ_</pattern>
<template><srai>พ่อ</srai></template>
</category>
<category>
<pattern>_พ่อ
*</pattern>
<template><srai>พ่อ</srai></template>
</category>
จากตัวอย่างนี้
ทั้งหมดจะถูกโต้ตอบด้วย
<template>เล่าเรื่องเกี่ยวกับครอบครัวคุณให้เราฟังหน่อยสิ</template>
ซึ่งรายละเอียดแต่ละ
<category>
มีดังนี้
<category>
ที่หนึ่งจะเป็น
Atomic
Category ซึ่งถ้าหากผู้ใช้งานแชทบอทพิมพ์คำว่า
"พ่อ”
เข้ามา แชทบอทจะตอบกลับไปว่า
"เล่าเรื่องเกี่ยวกับครอบครัวคุณให้เราฟังหน่อยสิ”
ตามที่ <template>
ได้กำหนดไว้
<category>
ที่สอง
ถ้าหากผู้ใช้งานแชทบอทพิมพ์ประโยคที่มี
"พ่อ”
เป็นคำสุดท้ายของประโยคเข้ามา
แชทบอทจะอ้างอิงคำตอบของ
<category>
แม่
</category>
ซึ่งมีคำตอบเป็น
"เล่าเรื่องเกี่ยวกับครอบครัวคุณให้เราฟังหน่อยสิ”
ตามที่ <template>
ของ
<category>
แม่
</category>
ได้กำหนดไว้
<category>
ที่สาม
ถ้าหากผู้ใช้งานแชทบอทพิมพ์ประโยคที่มี
"พ่อ”
เป็นคำแรกของประโยคเข้ามา
แชทบอทจะอ้างอิงคำตอบของ
<category>
แม่
</category>
ซึ่งมีคำตอบเป็น
"เล่าเรื่องเกี่ยวกับครอบครัวคุณให้เราฟังหน่อยสิ”
ตามที่ <template>
ของ
<category>
แม่
</category>
ได้กำหนดไว้
<category>
ที่สี่
ถ้าหากผู้ใช้งานแชทบอทพิมพ์ประโยคที่มี
"พ่อ”
อยู่ในประโยคเข้ามา
ไม่ว่าจะอยู่ตำแหน่งในดของประโยคก็ตาม
แชทบอทจะอ้างอิงคำตอบของ
<category>
แม่
</category>
ซึ่งมีคำตอบเป็น
"เล่าเรื่องเกี่ยวกับครอบครัวคุณให้เราฟังหน่อยสิ”
ตามที่ <template>
ของ
<category>
แม่
</category>
ได้กำหนดไว้
Context
คือการใช้แท็ก
<that>
ในการอ้างถึงคำพูดที่แชทบอท
โต้ตอบกับผู้ใช้เมื่อครั้งที่ผ่านมา
ตัวอย่าง
<category>
<pattern>ชอบ</pattern>
<that>คุณชอบดูหนังไหมคะ</that>
<template>คุณชอบดูหนังประเภทไหนคะ</template>
</category>
การโต้ตอบของ
<category>
นี้
เป็นเงื่อนไขว่า
ถ้าหากก่อนหน้านี้แชทบอทถามว่า
"คุณชอบดูหนังไหมคะ”
แล้วผู้ใช้ตอบว่า "ชอบ”
<category>
นี้ถูกประมวลผลแล้วแชทบอทจะโต้ตอบกลับไปว่า
"คุณชอบดูหนังประเภทไหนคะ”
ทำให้บทสนามีความต่อเนื่อง
ตัวอย่าง
<category>
<pattern>ก๊อก
ก๊อก</pattern>
<template>ใครเหรอ</template>
</category>
<category>
<pattern>*</pattern>
<that>ใครเหรอ</that>
<template><person>คือใคร</template>
</category>
<category>
<pattern>*</pattern>
<that>*
ใครเ</that>
<template>ฮา
ๆ ตลกมากนะ</template>
</category>
ผลที่ได้คือ
Client:
ก๊อก
ก๊อก
Robot:
ใครเหรอ
Client:
กล้วยหอม
Robot:
กล้วยหอม
คือใคร
Client:
ก๊อก
ก๊อก
Robot:
ใครเหรอ
Client:
กล้วยหอม
Robot:
กล้วยหอม
คือใคร
Client:
ก๊อก
ก๊อก
Robot:
ใครเหรอ
Client:
ส้ม
Robot:
ส้ม
คือใคร
Client:
ผมพูดว่าส้มไม่ใช่กล้วยหอม
Robot:
ฮาๆ
ตลกมากนะ
จากตัวอย่างข้างต้น
จะเห็นได้ว่าการใช้แท็ก
<that>
จะทำให้การสนทนาระหว่างแชทบอท
และผู้ใช้นั้นกระชับ
และได้ใจความ นอกจากนี้ หาก
<category>
ใดๆ มี
<pattern>
และ
<that>
ที่เหมือนกัน
อาจจะกำหนดแท็ก <topic>
เพื่อให้สามารถแยกเยอะเรื่องที่สนทนาได้
จากโครงสร้างที่ใช้ในการกำหนดการโต้ตอบชองแชทบอท
จะไม่นิยมใช้ <that>
จนกว่าจะกำหนด
<category>
ที่มี
<pattern>
เหมือนกัน
และจะไม่ใช้ <topic>
จนกว่าจะกำหนด
<category>
ที่มี
<pattern>
และ
<that>
ที่เหมือนกัน
ตัวอย่าง
<topic
name=“CARS”>
<category>
<pattern>*</pattern>
<template>
<random>
<li>คุณชอบรถประเภทไหน</li>
<li>คุณขับรถประเภทไหน</li>
<li>คุณมีที่จอดรถหรือเปล่า</li>
<li>คุณล้างรถเองหรือเปล่า</li>
</ramdom>
</template>
จากตัวอย่างนี้ได้กำหนด
<topic>
เป็น
CARS
ซึ่งทำให้ขอบเขตการสนทนาครอบคลุมเรื่องรถเท่านั้นซึ่งคำตอบ
<template>
จึงกำหนดไว้หลากหลายรูปแบบ
ซึ่งแท็ก <random>
จะทำให้แชทบอทสุ่มเลือกหนึ่งคำตอบในการโต้ตอบผู้ใช้
ทำให้หัวข้อสนทนามีหลากหลาย
- เครื่องมือที่ใช้ในการเขียน AIML
เครื่องมือที่จำเป็นสำหรับการเขียน
AIML ได้แก่
Text Editor
AIML Interpreter และบราวเซอร์
- Text Editor
Text
Editor คือโปรแกรมที่ไว้ใช้สำหรับการเขียนโค้ดคำสั่งของภาษาต่างๆ
ที่มีลักษณะเป็นไฟล์ตัวอักษร
โปรแกรมที่ Text
Editor นิยมใช้
เช่น Notepad
Wordpad และ
EditPlus
เป็นต้น
การเขียน AIML
สามารถใช้
Text Editor
โปรแกรมใดก็ได้
- AIML Interpreter
เป็นซอฟต์แวร์ที่ใช้ในการประมวลภาษา
AIML
ซึ่งพัฒนามาจากภาษาต่างๆ
เช่น LispJava
PHP Ruby Perl Pascal Python .Net C++ และ
SETLซึ่งมีความสามารถ
และฟังก์ชั่นแตกต่างกันไป
ตัวอย่าง AIML
Interpreter เช่น
Chatterbean
libaiml RebeccaAIML J-Alice เป็นต้น
- บราวเซอร์ (Browser)
บราวเซอร์ใช้ในการทดสอบผลลัพธ์ของแชทบอทที่เขียนขึ้น
โดยบราวเซอร์ที่นิยมใช้ได้แต่
Internet
Explorer และ
Firefox
ซึ่งทั้งสองบราวเซอร์สามารถรับการทำงานของเชทบอทได้เป็นอย่างดี
Credit :เรื่อง The development of Thai Chat Bot and its application
สมัครสมาชิก:
บทความ (Atom)