วันศุกร์ที่ 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

AIML (Artificial Intelligence Markup Language)

AIML (Artificial Intelligence Markup Language)
AIML เป็นภาษาปัญญาประดิษฐ์ ที่พัฒนาจาก XML (Extensive Markup Language) ใช้ในการพัฒนาแชทบอท มีลักษณะงานต่อการเรียนรู้ ซึ่งมีรายละเอียดดังนี้
  1. แท็กในภาษา 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 นี้ได้
  1. หลักการทำงานของ AIML
การทำงานของ AIML นั้น จะใช้หลักการทำงานของ "znearest-neighbor classification” โดยจะรับประโยคเข้ามาเพื่อนไปเปรียบเทียบกับรูปแบบ <pattern> ที่ใกล้เคยงที่สุด แต่ละรูปแบบจะมีการโต้ตอบตาม <template> ที่ได้กำหนดไว้
รูปแบบ (model) การเรียนรู้แบบนี้เป็นรูปแบบหนึ่ง ที่เรียกว่า "supervised training” ซึ่งจะต้องมีผู้กำหนดบทบาทในการตอบสนองต่างๆ ให้แชทบอท
การเปรียบเทียบรูปแบบที่ใกล้เคียงของ AIML จะเปรียบเทียบ โดยใช้คำ (word) ภายใต้ categories ในการเปรียบเทียบ ซึ่งจะแบ่งเป็น 3 ชนิด ได้แก่
  1. Atomic categories
คือ categories ที่ประกอบด้วย <pattern> ทีไม่มีสัญลักษณ์ _ (under score) และ * (star)
ตัวอย่างเช่น
<aiml>
<category>
<pattern>คุณ อยู่ ที่ ไหน</pattern>
<template>ดิฉันอยู่มหาวิทยาลัยศิลปากร</template>
</category>
</aiml>
จากตัวอย่างนี้ ถ้าผู้ใช้งานแชทบอทพิมพ์ ประโยค "คุณ อยู่ ที่ ไหน" แล้วซึ่งตรงกับ <pattern> จากนั้นแชทบอทจะตอบกลับมา "ดิฉันอยู่มหาวิทยาลัยศิลปากร” ตามที่ <template> ได้กำหนดไว้มีสัญลักษณ์ _ (under score) และ * (star) จะทำให้การรับ input ประโยคหรือวลี สามารถทำได้ซับซ้อนขึ้น เพราะถ้าหากแชทบอทไม่สามารถจับคู่ <pattern> แบบ
  1. 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

  1. 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> จะทำให้แชทบอทสุ่มเลือกหนึ่งคำตอบในการโต้ตอบผู้ใช้ ทำให้หัวข้อสนทนามีหลากหลาย

  1. เครื่องมือที่ใช้ในการเขียน AIML
เครื่องมือที่จำเป็นสำหรับการเขียน AIML ได้แก่ Text Editor AIML Interpreter และบราวเซอร์
  1. Text Editor
Text Editor คือโปรแกรมที่ไว้ใช้สำหรับการเขียนโค้ดคำสั่งของภาษาต่างๆ ที่มีลักษณะเป็นไฟล์ตัวอักษร โปรแกรมที่ Text Editor นิยมใช้ เช่น Notepad Wordpad และ EditPlus เป็นต้น การเขียน AIML สามารถใช้ Text Editor โปรแกรมใดก็ได้

  1. AIML Interpreter
เป็นซอฟต์แวร์ที่ใช้ในการประมวลภาษา AIML ซึ่งพัฒนามาจากภาษาต่างๆ เช่น LispJava PHP Ruby Perl Pascal Python .Net C++ และ SETLซึ่งมีความสามารถ และฟังก์ชั่นแตกต่างกันไป ตัวอย่าง AIML Interpreter เช่น Chatterbean libaiml RebeccaAIML J-Alice เป็นต้น
  1. บราวเซอร์ (Browser)
บราวเซอร์ใช้ในการทดสอบผลลัพธ์ของแชทบอทที่เขียนขึ้น โดยบราวเซอร์ที่นิยมใช้ได้แต่ Internet Explorer และ Firefox ซึ่งทั้งสองบราวเซอร์สามารถรับการทำงานของเชทบอทได้เป็นอย่างดี
 
Credit :เรื่อง The development of Thai Chat Bot and its application