28 กันยายน 2561

Published กันยายน 28, 2561 by with 0 comment

จัดการกับไม้ยมก ๆ ภาษาไทยด้วย Python

สวัสดีผู้อ่านทุกท่านครับ บทความนี้ผมจะพาผู้อ่านไปทำความสะอาดข้อมูลที่มีไม้ยมก "ๆ" ก่อนนำข้อมูลไปประมวลผลใช้งานกับ NLP ภาษาไทยด้วยโค้ด Python กันครับ

ไม้ยมก (ๆ) เป็นตัวที่แสดงถึงการซ้ำคำ หรือ กลุ่มคำ/วลี เนื่องจากไม้ยมกถูกใช้ซ้ำเพียงแค่คำเดียวเป็นส่วนใหญ่ในชีวิตประจำวัน ทำให้คนที่นำข้อมูลไปประมวลผลมักเข้าใจผิดว่า ไม้ยมกใช้ซ้ำแค่คำ แต่ที่จริงแล้วสามารถใช้ซ้ำกลุ่มคำหรือวลีได้ด้วย
ตัวอย่างเช่น
ผมไปเรียนในแต่ละวัน ๆ เจอเรื่องแปลก ๆ มาให้ประหลาดใจอยู่เสมอ
อ่านได้เป็น
ผมไปเรียนในแต่ละวันแต่ละวัน เจอเรื่องแปลกแปลก มาให้ประหลาดใจอยู่เสมอ
ดังนั้น เราจะต้องจัดการกับกลุ่มคำที่ใช้ไม้ยมกในการซ้ำด้วย
มาลงมือโค้ดกัน ก่อนอื่นให้ทำเรียกใช้ PyThaiNLP , re ก่อน (หากไม่มี pythainlp ให้ทำการติดตั้งด้วยคำสั่ง pip install pythainlp ) โดยใช้คำสั่ง
from pythainlp.tokenize import word_tokenize
import re
เสร็จแล้ว ทำการสร้างรายการเก็บกลุ่มคำที่ถูกซ้ำขึ้นมา แล้วทำการแปลงให้เป็น list
list_phrase="""ไฟไหม้
ในแต่ละวัน
ในชั่วพริบตา
เวรกรรม
กรรมเวร
วันหนึ่ง
อ่านหนังสือ
กินข้าว
ดีแต่พูด
กล้วยไม้ป่า
ออกดอกสะพรั่ง
สนุกสนาน
ร่ำรวย
ก้องกังวาน
ทำมาหากิน
มากมาย""".splitlines() # รายการวลีที่ต้องซ้ำทั้งวลี
สร้างกฎสำหรับ re โดยใช้ | หรือ ในการซ้ำกลุ่มคำ
rule="|".join(list_phrase)
เสร็จแล้วเขียนฟังก์ชั่นสำหรับจัดการไม้ยมกขึ้นมา
def maiyamok(t):
    if "ๆ" in t:
        t=re.sub("([ก-ฮ่้๊๋็๋ เแ ิ ื ์ ี  ู ุ า ๅ ำ ฯ ะ])ๆ","\\1 ๆ",t) # กรณีที่ ๆ ติดกับคำให้เว้นก่อน
        while "ๆๆ" in t: # ถ้ามี ๆ ติดกันหลายอัน
            t=t.replace("ๆๆ","ๆ ๆ") # ให้เว้น ๆ
        if re.search(rule,t): # ถ้าข้อความที่รับเข้ามามีวลีที่กำหนด
            for i in list_phrase:
                while i+" ๆ" in t:
                    t=t.replace(i+" ๆ",i+i)#"""
        if "ๆ" in t:
            tt=word_tokenize(t)
            while "ๆ" in tt:
                indext=tt.index("ๆ")
                tt[indext-1]=tt[indext-2] # ซ้ำคำ
                del tt[indext]
            t="".join(tt)
            del tt
    return t
การเรียกใช้งาน
text="ในวันหนึ่งๆพวกเขาเล่นเกมกันอย่างสนุกสนานๆโดยมีเด็กมาเล่นด้วยอย่างมากมายๆจึงเป็นเรื่องที่ดีมากๆเลยอยากให้ทุกเป็นวันที่ดีๆแบบนี้เสมอไป"
print(maiyamok(text))
ผลลัพธ์
ในวันหนึ่งวันหนึ่งพวกเขาเล่นเกมกันอย่างสนุกสนานสนุกสนานโดยมีเด็กมาเล่นด้วยอย่างมากมายมากมายจึงเป็นเรื่องที่ดีมากดีมากเลยอยากให้ทุกเป็นวันที่ดีดีแบบนี้เสมอไป

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

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

แสดงความคิดเห็น

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