โจทย์: การประมวลผลข้อมูลจากไฟล์#

โจทย์การเขียนเรกเอกซ์#

จงเขียนเรกเอกซ์ที่จับคู่กับสตริงที่กำหนดให้

  1. เขียนเรกเอกซ์ที่จับคู่กับเลขทะเบียนรถภาษาอังกฤษ ที่ขึ้นต้นด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่สองตัว ตามด้วยตัวเลข 3 หรือ 4 ตัว

สตริงที่ต้องจับคู่

สตริงที่ต้องไม่จับคู่

AB123

aB123

XY5678

12XY34

PQ999

ABC123

LM456

XY12345

GH000

XY12A

ST1234

สต1234

  1. เขียน regular expression เพื่อจับคู่รหัสสีแบบ 6 หลักในระบบฐานสิบหกที่ถูกต้อง ซึ่งเริ่มต้นด้วย # และตามด้วยตัวเลขฐานสิบหก (0-9, a-f, A-F) จำนวน 6 หลัก

สตริงที่ต้องจับคู่

สตริงที่ต้องไม่จับคู่

#ff5733

#12345

#aabbcc

#gg1234

#123456

123456

#ABCDEF

#12345G

#7890ab

#12_456

  1. เขียนเรกเอกซ์ที่จับคู่ชื่อคนไทยที่ประกอบด้วยตัวอักษรไทยอย่างน้อย 2 ตัว และต้องไม่มีตัวอักษรภาษาอื่น

สตริงที่ต้องจับคู่

สตริงที่ต้องไม่จับคู่

สมชาย

somchai

ประภัสสร

Prabhat

สุนทร

Su

อัศวิน

asawin

วิชัย

Vichai

  1. เขียนเรกเอกซ์ที่จับคู่กับชื่อผู้ใช้งานที่ขึ้นต้นและลงท้ายด้วยอักษรภาษาอังกฤษตัวพิมพ์เล็กหรือตัวเลข ชื่อผู้ใช้งานต้องยาวอย่างน้อย 2 ตัวอักษร และประกอบด้วยตัวอักษรภาษาอังกฤษ ตัวเลข และเครื่องหมาย _ และ . เท่านั้น

สตริงที่ต้องจับคู่

สตริงที่ต้องไม่จับคู่

john.doe

John.doe

alice123

.alice

sam_89

sam@t89

j_doe

j_doe_

m.test

m

user1

user1.

  1. เขียนเรกเอกซ์ที่จับคู่เบอร์โทรศัพท์ในประเทศไทยที่เริ่มต้นด้วยเลข 0 และตามด้วยตัวเลขอีก 9 ตัว

สตริงที่ต้องจับคู่

สตริงที่ต้องไม่จับคู่

0812345678

812345678

0112345678

01123456ก8

0912345678

08012345678

0612345678

+66812345678

0991234567

071-234-5678

  1. เขียนเรกเอกซ์ที่จับคู่ที่อยู่ในประเทศไทยที่มีได้เฉพาะตัวอักษรไทย ตัวเลขอารบิก และเครื่องหมาย / โดยตัวเลขต้องปรากฏอย่างน้อยหนึ่งครั้ง

สตริงที่ต้องจับคู่

สตริงที่ต้องไม่จับคู่

123 หมู่บ้านทวีสุข

หมู่บ้านทวีสุข

45/6 ตำบลบางกะปิ

ตำบลบางพลี

บ้านเลขที่ 99/10

บ้านตำบลคลองหนึ่ง

หมู่บ้าน 12

ถนนใหญ่

  1. เขียนเรกเอกซ์เพื่อจับคู่นามสกุลไฟล์ .txt .csv หรือ .json โดยชื่อไฟล์ต้องเริ่มด้วยตัวอักษรภาษาอังกฤษ

สตริงที่ต้องจับคู่

สตริงที่ต้องไม่จับคู่

report.txt

.txt

data.csv

data.tx

notes.json

data.csvx

file.txt

1data.txt

my-file.csv

my-file

output.json

output.

  1. เขียนเรกเอกซ์ที่จับคู่ที่อยู่อีเมลซึ่งเริ่มต้นด้วยตัวอักษรภาษาอังกฤษหรือตัวเลขอย่างน้อย 1 ตัว ตามด้วยเครื่องหมาย @ และลงท้ายด้วย @gmail.com หรือ @yahoo.com

สตริงที่ต้องจับคู่

สตริงที่ต้องไม่จับคู่

user@gmail.com

user@hotmail.com

someone@yahoo.com

someone@mail.com

abc123@gmail.com

abc@gmail.co

john@yahoo.com

john@gmail.org

  1. เขียนเรกเอกซ์ที่จับคู่วันที่ในรูปแบบ DD/MM โดย DD เป็นตัวเลข 01-31 เท่านั้น และ MM เป็น 01-12 เท่านั้น

สตริงที่ต้องจับคู่

สตริงที่ต้องไม่จับคู่

12/05

12-05

01/12

01/13

31/01

33/04

15/07

15/7

01/01

01/01/2001

  1. เขียนเรกเอกซ์ที่จับคู่กับคำภาษาไทยที่ขึ้นต้นด้วยอะไรก็ได้ แต่ต้องลงท้ายด้วยสระ า และต้องสามารถออกเสียงสระ -า ลงท้ายได้ ภายในสตริงต้องเป็นอักษรไทยเท่านั้น และมีความยาวอย่างน้อยสองตัวอักษร

สตริงที่ต้องจับคู่

สตริงที่ต้องไม่จับคู่

มะลิลา

มะลิ

สุชาดา

สำเภา

ป่า

กานดา

กานดาา

เกลา

ข้าพเจ้า

โจทย์ปัญหาการประมวลผลข้อมูลจากไฟล์#

ข้อ 1 - สุนทรพจน์ของโอบามา#

ไฟล์ obama.txt ประกอบด้วยสุนทรพจน์ของบารัค โอบามาในปี 2013 ความพิเศษของไฟล์นี้คือมีการระบุประเภทของคำ (Part of speech tag) กล่าวคือ แต่ละคำในไฟล์จะถูกกำกับด้วยประเภทของคำ เช่น คำนาม (noun), คำกริยา (verb), คำสรรพนาม (pronoun) หรือเครื่องหมายวรรคตอนแบบต่าง ๆ เช่น ประโยค

Thank you. God bless you, and may He forever bless these United States of America.

จะปรากฏในไฟล์เป็น

Thank_VV you_PP ._SENT God_NP bless_VVP you_PP ,_, and_CC may_MD He_PP forever_RB bless_VV these_DT United_NP States_NPS of_IN America_NP ._SENT

โดยที่แต่ละคำและเครื่องหมายวรรคตอนจะถูกตามด้วยเครื่องหมายขีดล่าง (_) และตัวหนังสือพิมพ์ใหญ่ทั้งหมด ซึ่งตัวพิมพ์ใหญ่ที่ตามมาเป็นตัวย่อที่ระบุถึงประเภทของคำ (เรียกว่า tag) เช่น VV หมายถึง Verb, PP หมายถึง Pronouns, NN หมายถึง Noun, SENT หมายถึงเครื่องหมายจุด (full stop)

  1. เขียนโปรแกรมเพื่อคำนวณของความถี่ประเภทของคำแต่ละประเภท

  2. เขียนโปรแกรมหาคำที่ปรากฏบ่อยที่สุด 100 อันดับแรก

คำใบ้:

  • ทดสอบกับข้อความตัวอย่างข้างต้นก่อน

  • แยกสตริงออกมาเป็นคำ ๆ ในรูปแบบของลิสต์

  • วนซ้ำไปบนลิสต์และแยกคำกับประเภทของคำออกจากกัน

  • ใช้ Counter ในการเก็บความถี่

  • เมื่อดำเนินการข้างต้นเสร็จแล้ว ลองเปิดไฟล์และอ่านทีละบรรทัด

ข้อ 2 - ตรวจหาชื่อ#

ชื่อบุคคลในภาษาอังกฤษ เช่น Peter Meg Lois Brian Stewie จะมีการสะกดแบบพิเศษ คือ ขึ้นต้นด้วยตัวพิมพ์ใหญ่เฉพาะตัวแรกเท่านั้น

ข้อ 2.1#

จงเขียนฟังก์ชันที่ตรวจสอบว่าคำที่ให้มานั้นมีลักษณะเหมือนชื่อคนภาษาอังกฤษหรือไม่

คำใบ้: ใช้คำสั่ง re.match

import re
def is_name_like(word):
  """
  
  ตัวอย่าง
  >>> is_name_like("Brian")  
  True
  >>> is_name_like("brian")  
  False
  >>> is_name_like("BRian")  
  False
  """
  return False

ข้อ 2.2#

เขียนฟังก์ชันที่ return ลิสต์ของคำทั้งหมดที่มีแนวโน้มว่าจะเป็นชื่อบุคคลจากประโยคที่กำหนด

คำใบ้: ใช้คำสั่ง re.findall และหลีกเลี่ยงการใช้คำสั่ง str.split

def get_all_names(sentence):
  """
  
  ตัวอย่าง
  >>> get_all_names('Joe got married to Bonnie after his PhD in the USA')
  ['Joe', 'Bonnie']
  """
  return []

ข้อ 2.3#

เขียนฟังก์ชันที่ทำหน้าที่แทนที่คำที่คาดว่าจะเป็นชื่อบุคคลด้วยสัญลักษณ์ “XXX” เพื่อเป็นการกรองข้อมูลส่วนตัวออกไป

คำใบ้: ใช้คำสั่ง re.sub

def censor_names(sentence):
  """
  
  ตัวอย่าง
  >>> censor_names('Joe got married to Bonnie after his PhD in the USA')
  'XXX got married to XXX after his PhD in the USA')
  """
  return ''

ข้อ 3 - เครื่องตอบรับอัตโนมัติ#

จงเขียนฟังก์ชันที่รับสตริงที่เป็นคำถามที่ขึ้นต้นด้วย “Do” หรือ “Does” และคืนค่า “Yes”, ตามด้วยคำตอบที่ใช้คำกริยา “do” หรือ “does” มาช่วย เช่น

autoanswer('Does he like pop music?') --> 'Yes, he does like pop music.'

autoanswer('Do you sing well?') --> 'Yes, you do sing well.'

แต่หากไม่ได้เป็นคำถามที่ขึ้นต้นด้วย “Do” หรือ “Does” ให้เปลี่ยนเป็นประโยคคำถามโดยการเติมเครื่องหมายคำถาม (?) ต่อท้าย เช่น

autoanswer('I do not understand.') --> 'I do not understand?'

คำสั่ง: ใช้คำสั่ง re.match จากนั้นให้ใช้การอ้างอิงถึงกลุ่ม

def autoanswer(question):
  return ''

ข้อ 4 - สิ่งที่น่าสนใจเกี่ยวกับคำ#

ข้อมูลที่ใช้สำหรับการทำแบบฝึกหัดนี้ สามารถดาวน์โหลดได้จากลิงก์ด้านล่าง

https://attapol.github.io/programming/data/small_nyt_eng_200001

!wget https://attapol.github.io/programming/data/small_nyt_eng_200001

หากต้องการใช้ข้อมูลที่มีขนาดใหญ่ขึ้น สามารถใช้ชุดข้อมูล nyt_eng_200001 ได้เช่นกัน

!gdown --id 1mHNSEU3NrneejXx-RWFJLEWTi8drInOT

4.1 คำที่มีตัว K#

ในชุดข้อมูลนี้มีคำที่มีคุณสมบัติต่อไปนี้ปรากฏอยู่ทั้งหมดกี่คำ (นับคำที่ซ้ำกันได้):

  • คำที่ขึ้นต้นด้วยตัว k

  • คำที่ตัวที่สองเป็นตัว k

  • คำที่ลงท้ายด้วยตัว k

s = open('nyt_eng_200001').read()

4.2 คำศัพท์ที่ประกอบด้วยตัว k#

ในชุดข้อมูลนี้มีคำที่มีคุณสมบัติต่อไปนี้ปรากฏอยู่ทั้งหมดกี่คำ โดยไม่นับคำซ้ำด้วยเพื่อให้ได้ขนาดของรายการคำศัพท์ (vocabulary)

  • คำที่ขึ้นต้นด้วยตัว k

  • คำที่ตัวที่สองเป็นตัว k

  • คำที่ลงท้ายด้วยตัว k

ข้อ 5 - ชื่อจากประกาศ#

เขียนฟังก์ชันชื่อ find_names ที่รับพารามิเตอร์เป็นชื่อไฟล์ที่มีข้อความที่มาจากประกาศทางราชการย้อนหลัง 5 ปี ให้ฟังก์ชันนี้คืนค่าเป็นทูเปิลของลิสต์ 2 ลิสต์ ลิสต์แรกเก็บชื่อผู้ชาย ลิสต์ที่สองเก็บชื่อผู้หญิงทั้งหมดที่อยู่ในไฟล์ โดยจะเก็บชื่อจากท้ายประกาศที่มักจะมีชื่อบุคคลที่เซ็นประกาศ เช่น

ข้อความในไฟล์

(นายขุนแผน แสนสุภาพ)
กรรมการ
(นางสาวมณโฑ ตาโตข้างเดียว)
หัวหน้าศูนย์สอบภาษาอังกฤษที่ 2 
(นางวันทอง กี่ใจก็ได้)
ประธานกรรมการโครงการพัฒนาชนบท 

ฟังก์ชันต้อง return ค่าเป็นทูเปิลของลิสต์ 2 ลิสต์ ดังนี้

(['ขุนแผน'], ['มณโฑ', 'วันทอง']) 

ในไฟล์จะมีข้อความอื่นเพิ่มเติมที่เป็นข้อมูลที่ไม่เกี่ยวข้องมาพร้อมกับประกาศ ดังนั้นเราจึงต้องใช้ regular expression เพื่อค้นหาชื่อที่มีตัวอักษรนำหน้าวงเล็บเปิดตามด้วย นาย นาง หรือ นางสาว

def find_names(announcement_file):
    return ([], [])

ข้อ 6 - Codeswitching#

Codeswitch เป็นปรากฏการณ์ทางภาษาศาสตร์หนึ่งที่เกิดขึ้นเมื่อผู้พูดใช้สองภาษาหรือสองสำเนียงผสมกัน (เช่น การพูดไทยคำอังกฤษคำ)

เขียนฟังก์ชันที่นับว่าในลิสต์ของคำที่ได้มา มีคำที่สะกดด้วยตัวภาษาอังกฤษกี่คำ และคำที่สะกดด้วยตัวภาษาไทยกี่คำ โดยให้คืนค่าผลลัพธ์เป็นดิกชันนารีที่ key เป็นรหัสภาษา (en สำหรับภาษาอังกฤษ และ th สำหรับภาษาไทย) และ value เป็นจำนวนคำของแต่ละภาษา

def count_en_th_words(word_list):
    """
    
    ตัวอย่าง:
    >>> count_en_th_words(['รองเท้า', 'ไม่', 'match', 'กับ', 'coat', 'เลย'])
    {'en': 2, 'th': 4}
    """
    return {}