โจทย์: การประมวลผลข้อมูลจากไฟล์#
โจทย์การเขียนเรกเอกซ์#
จงเขียนเรกเอกซ์ที่จับคู่กับสตริงที่กำหนดให้
เขียนเรกเอกซ์ที่จับคู่กับเลขทะเบียนรถภาษาอังกฤษ ที่ขึ้นต้นด้วยตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่สองตัว ตามด้วยตัวเลข 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 {}