โจทย์: การประมวลผลข้อมูลจากไฟล์#
โจทย์การเขียนเรกเอกซ์#
จงเขียนเรกเอกซ์ที่จับคู่กับสตริงที่กำหนดให้
เขียนเรกเอกซ์ที่จับคู่กับเลขทะเบียนรถภาษาอังกฤษ ที่ขึ้นต้นด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่สองตัว ตามด้วยตัวเลข 3 หรือ 4 ตัว
สตริงที่ต้องจับคู่  | 
สตริงที่ต้องไม่จับคู่  | 
|---|---|
AB123  | 
aB123  | 
XY5678  | 
12XY34  | 
PQ999  | 
ABC123  | 
LM456  | 
XY12345  | 
GH000  | 
XY12A  | 
ST1234  | 
สต1234  | 
เขียน regular expression เพื่อจับคู่รหัสสีแบบ 6 หลักในระบบฐานสิบหกที่ถูกต้อง ซึ่งเริ่มต้นด้วย # และตามด้วยตัวเลขฐานสิบหก (0-9, a-f, A-F) จำนวน 6 หลัก
สตริงที่ต้องจับคู่  | 
สตริงที่ต้องไม่จับคู่  | 
|---|---|
#ff5733  | 
#12345  | 
#aabbcc  | 
#gg1234  | 
#123456  | 
123456  | 
#ABCDEF  | 
#12345G  | 
#7890ab  | 
#12_456  | 
เขียนเรกเอกซ์ที่จับคู่ชื่อคนไทยที่ประกอบด้วยตัวอักษรไทยอย่างน้อย 2 ตัว และต้องไม่มีตัวอักษรภาษาอื่น
สตริงที่ต้องจับคู่  | 
สตริงที่ต้องไม่จับคู่  | 
|---|---|
สมชาย  | 
somchai  | 
ประภัสสร  | 
Prabhat  | 
สุนทร  | 
Su  | 
อัศวิน  | 
asawin  | 
วิชัย  | 
Vichai  | 
เขียนเรกเอกซ์ที่จับคู่กับชื่อผู้ใช้งานที่ขึ้นต้นและลงท้ายด้วยอักษรภาษาอังกฤษตัวพิมพ์เล็กหรือตัวเลข ชื่อผู้ใช้งานต้องยาวอย่างน้อย 2 ตัวอักษร และประกอบด้วยตัวอักษรภาษาอังกฤษ ตัวเลข และเครื่องหมาย _ และ . เท่านั้น
สตริงที่ต้องจับคู่  | 
สตริงที่ต้องไม่จับคู่  | 
|---|---|
john.doe  | 
John.doe  | 
alice123  | 
.alice  | 
sam_89  | 
sam@t89  | 
j_doe  | 
j_doe_  | 
m.test  | 
m  | 
user1  | 
user1.  | 
เขียนเรกเอกซ์ที่จับคู่เบอร์โทรศัพท์ในประเทศไทยที่เริ่มต้นด้วยเลข 0 และตามด้วยตัวเลขอีก 9 ตัว
สตริงที่ต้องจับคู่  | 
สตริงที่ต้องไม่จับคู่  | 
|---|---|
0812345678  | 
812345678  | 
0112345678  | 
01123456ก8  | 
0912345678  | 
08012345678  | 
0612345678  | 
+66812345678  | 
0991234567  | 
071-234-5678  | 
เขียนเรกเอกซ์ที่จับคู่ที่อยู่ในประเทศไทยที่มีได้เฉพาะตัวอักษรไทย ตัวเลขอารบิก และเครื่องหมาย / โดยตัวเลขต้องปรากฏอย่างน้อยหนึ่งครั้ง
สตริงที่ต้องจับคู่  | 
สตริงที่ต้องไม่จับคู่  | 
|---|---|
123 หมู่บ้านทวีสุข  | 
หมู่บ้านทวีสุข  | 
45/6 ตำบลบางกะปิ  | 
ตำบลบางพลี  | 
บ้านเลขที่ 99/10  | 
บ้านตำบลคลองหนึ่ง  | 
หมู่บ้าน 12  | 
ถนนใหญ่  | 
เขียนเรกเอกซ์เพื่อจับคู่นามสกุลไฟล์ .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 ตัว ตามด้วยเครื่องหมาย @ และลงท้ายด้วย @gmail.com หรือ @yahoo.com
สตริงที่ต้องจับคู่  | 
สตริงที่ต้องไม่จับคู่  | 
|---|---|
เขียนเรกเอกซ์ที่จับคู่วันที่ในรูปแบบ 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 - สุนทรพจน์ของโอบามา#
ไฟล์ 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)
เขียนโปรแกรมเพื่อคำนวณของความถี่ประเภทของคำแต่ละประเภท
เขียนโปรแกรมหาคำที่ปรากฏบ่อยที่สุด 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 {}