3 สิงหาคม 2557

Published สิงหาคม 03, 2557 by with 3 comments

เขียนโปรแกรมแปลภาษา dictionary บน Python 3


สวัสดีครับทุกท่าน บทความนี้จะพาทุกท่านไปเขียนโปรแกรมแปลภาษา dictionary บน Python เวชั่น 3 กันครับ หลาย ๆ ท่านคงเคยใช้งาน longdo เว็บ dictionary ไทยกันมาบ้างแล้ว ผมเลยเกิดความคิดที่จะเขียนโปรแกรมแปลภาษา dictionary แบบไม่ต้องต่ออินเทอร์เน็ตบ้างครับ

เว็บ longdo ได้ใช้ฐานข้อมูลคำศัพท์ของ LEXiTRON เป็น Xml ผมแปลงมาเป็น Sql ไม่ถูก ผมเลยได้ไปค้นมาจากอินเทอร์เน็ตมา
พบผู้ใจดีได้ทำการแปลง LEXiTRON เป็น Sqlite3 ท่าน Ake Exorcist จาก akexorcist.com ครับ จากบทความนี้ [Android Code] แจก SQLite สำหรับ Dictionary ของ Lexitron 
จะมี 8 คอลัมน์ด้วยกันดังนี้ _id, esearch, eentry, tentry, ecat, ethai, esyn และ eant ในตารางข้อมูล eng2thai
ขอขอบคุณ คุณ Ake Exorcist มา ณ ที่นี้ครับ
ผมได้โหลดไฟล์ฐานข้อมูลที่แปลงเป็น Sqlite3 จาก lexitron [Google Drive] แล้วผมได้บันทึกเป็นชื่อ lexitron.db (ไฟล์ฐานข้อมูลของ Sqlite3 ต้องเป็น .db นะครับ)
บทความนี้จะแปลจากภาษาอังกฤษเป็นภาษาไทยครับ ส่วนไทยเป็นอังกฤษลองไปพัฒนาต่อครับ
เสร็จแล้วเรามาลองมือเขียนกัน!!!
import sqlite3
conn = sqlite3.connect('lexitron.db')
word = input("คำค้นหา:")
c = conn.cursor()
a = c.execute("SELECT * FROM eng2thai WHERE esearch='%s'" % (word,))
for row in a:
   print ("คำค้นหา = ", row[1])
   print ("eentry = ", row[2])
   print ("คำแปล = ", row[3])
   print ("ลักษณะคำ = ", row[4])
   print ("ความหมายเหมือน = ", row[5])
   print ("esyn  = ", row[6])
   print ("eant = ", row[7],"\n")

ตัวอย่างข้างบนผมได้เขียนแบบไม่ได้ใช้ GUI ครับ
 
ต่อมาผมได้เขียนแบบแสดงผลลัพธ์ที่ GUI ด้วย tkinter แต่ยังกรอกข้อมูลใน IDE อยู่ครับ
import sys
import sqlite3
from tkinter import *
conn = sqlite3.connect('lexitron.db')
mGui = Tk()

mGui.geometry('450x450+200+200')
mGui.title('โปรแกรมแปลภาษา Mark 1') #ชื่อหัวโปรแกรม
Label(text='โปรแกรมแปลภาษา',fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()
Label(text='จัดทำโดย วรรณพงษ์ ภัททิยไพบูลย์',fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()

word = input("คำค้นหา:")
c = conn.cursor()

a = c.execute("SELECT * FROM eng2thai WHERE esearch='%s'" % word)

for row in a:
      t1 = (row[1])
      t2 = (row[2])
      t3 = (row[3])
      t4 =  ("ลักษณะคำ = ", row[4])
      t5 = ("ความหมายเหมือน = ", row[5])
      t6 = ("esyn  = ", row[6])
      t7 = ("eant = ", row[7],"\n")
      Label(text="คำค้นหา: %s" % (t1,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()
      a2 = Label(text="%s" % (t2,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()
      a3 = Label(text="คำแปล: %s" % (t3,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()
      a4 = Label(text="=========================",fg = "light green",font = "Helvetica 16 bold italic").pack()
 
ผลลัพธ์
 นอกจากนั้นไม่พอ ต่อมาผมลองศึกษารายละเอียด tkinter เพื่อเขียนแบบรับค่าข้อมูลและแสดงผลลัพธ์ที่ GUI เลยครับ ผมลองเขียนดู ผมพบปัญหาตรงที่ tkinter เข้าใจยากมากครับ
    import sys
    import sqlite3
    from tkinter import *
    conn = sqlite3.connect('lexitron.db')

    mGui = Tk()

    aaa = ""

    mGui.geometry('450x450+200+200')
    mGui.title('Mark 1') #ชื่อหัวโปรแกรม

     

    def aa():
       aaa = ment.get()
       return

     

    ment = StringVar()

     

    bb = Button(mGui,text='OK',command = aa,fg='red',bg='blue').pack()
    Entry(mGui,textvariable=ment).pack()

    c = conn.cursor()
     
    a = c.execute("SELECT * FROM eng2thai WHERE esearch='%s'" % (aaa,))

    for row in aaa:
          t1 = (row[1])
          t2 = (row[2])
          t3 = (row[3])
          t4 =  ("1 = ", row[4])
          t5 = ("2 = ", row[5])
          t6 = ("3  = ", row[6])
          t7 = ("4 = ", row[7],"\n")
          Label(text="1: %s" % (t1,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()
          Label(text="%s" % (t2,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()
          Label(text="3: %s" % (t3,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()
          Label(text="=========================",fg = "light green",font = "Helvetica 16 bold italic").pack()

หลังจากที่เขียน From รับค่าที่เป็น Entry แล้วทำปุ่ม  Button ต้องมีการอ้างอิงคาลาสแบบ OOP ข้างบนอีกด้วย เท่ากับว่า ผมไม่สามารถเขียนโค้ดโดยหลังจากกรอกข้อมูลกดปุ่ม ค้นหา ผมไม่สามารถใช้โค้ดเดิมต่อไปได้ ผมคิดไม่ออก ผมเลยได้สอบถามพี่ใบบอนครับ ระหว่างหาทางแก้ผมได้ไปเจอ http://stackoverflow.com/questions/11963224/python-sqlite3-tkinter-display-multible-rows ผมเลยได้ลองแก้ไขโค้ดดู พบว่าสามารถทำงานได้ตามที่ต้องการครับ
import sys
import sqlite3
from tkinter import *
conn = sqlite3.connect('lexitron.db')
mGui = Tk()
aaa = ""
ment = StringVar()
def aa():
    aaa = ment.get()
    c = conn.cursor()
    search = c.execute("SELECT * FROM eng2thai WHERE esearch='%s'" % (ment.get(),))
    for row in search:
      t1 = (row[1])
      t2 = (row[2])
      t3 = (row[3])
      t4 =  ("ลักษณะคำ = ", row[4])
      t5 = ("ความหมายเหมือน = ", row[5])
      t6 = ("esyn  = ", row[6])
      t7 = ("eant = ", row[7],"\n")
      Label(text="คำค้นหา: %s" % (t1,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()
      a2 = Label(text="%s" % (t2,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()
      a3 = Label(text="คำแปล: %s" % (t3,),fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()
      a4 = Label(text="=========================",fg = "light green",font = "Helvetica 16 bold italic").pack()



mGui.geometry('450x450+200+200')
mGui.title('โปรแกรมแปลภาษา Mark 1') #ชื่อหัวโปรแกรม
Label(text='โปรแกรมแปลภาษา',fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()
Label(text='จัดทำโดย วรรณพงษ์ ภัททิยไพบูลย์',fg = "light green",bg = "dark green",font = "Helvetica 16 bold italic").pack()



Entry(mGui,textvariable=ment).pack()
bb = Button(mGui,text='ค้นหา',command = aa,fg='light green',bg='dark green').pack()


mGui.mainloop()
ผลลัพธ์

แนวทางการนำไปพัฒนาต่อ

จากโปรแกรมที่ผมเขียนเป็นตัวอย่างไป ท่านสามารถนำไปพัฒนาต่อเป็นแปลงจากภาษาไทยเป็นภาษาอังกฤษ เป็นต้นครับ และอย่าลืมอ่านข้อตกลงการใช้งาน License ของ LEXiTRON ด้วยนะครับ http://lexitron.nectec.or.th/2009_1/index.php?q=common_manager/faqs

ไฟล์ตัวอย่าง https://db.tt/ZDITGceZ
ขอบคุณครับ

3 ความคิดเห็น:

  1. สามารถนำไปประยุกต์ใช้กับ Qt เช่น PyQt Pyside ได้ครับ

    ตอบลบ
  2. ทำเป็น .exe ยังไงคะ หนูทำแล้วมันไม่สามารถค้นหาได้คะ

    ตอบลบ
    คำตอบ
    1. ลองตรวจสอบดูนะครับว่าได้บรรจุไฟล์ LEXiTRON ไปด้วยไหมครับ

      ลบ

แสดงความคิดเห็นได้ครับ :)