Repository: joke2k/faker
Pull request #1316 (2020-11-16 11:09:05)

[th_TH] Add postcode format, country names, person prefix weights, and update phone number format
### What does this changes

- Add weights for person name prefixes
- Add more first names
- Add country names
- Add postcode format
- Update phone number format to be more precise and update test
- Add postcode and person name tests

### What was wrong

These are new additions. The old code does not has the functionality or work somehow but may be less precise.

### How this fixes it

- For person name prefixes, some prefixes are in reality occur more often. So add weights with OrderedDict.
- Add country names in Thai language
- Change postcode to limits them to start only with 1-9, and not zero.
- Change phone number formats to make it distinguished between landline (9 digits, starts with 02, 03, 04, 05 or 07) and mobile (10 digits, starts with 06, 08, or 09).
- Add/update tests for postcode, person name, and phone number


fcurella: Thank you!

Patch:
diff --git a/faker/providers/address/th/__init__.py b/faker/providers/address/th/__init__.py
new file mode 100644
index 00000000..9b3530bc
--- /dev/null
+++ b/faker/providers/address/th/__init__.py
@@ -0,0 +1,252 @@
+from .. import Provider as AddressProvider
+
+
+class Provider(AddressProvider):
+
+    # country names adapted from
+    # https://github.com/PyThaiNLP/pythainlp/blob/dev/pythainlp/corpus/countries_th.txt
+    countries = (
+        "กรีซ",
+        "กรีนแลนด์",
+        "กวม",
+        "กัมพูชา",
+        "กัวเดอลุป",
+        "กัวเตมาลา",
+        "กาตาร์",
+        "กานา",
+        "กาบอง",
+        "กาบูเวร์ดี",
+        "กายอานา",
+        "กินี-บิสเซา",
+        "กินี",
+        "เกรเนดา",
+        "เกาหลีใต้",
+        "เกาหลีเหนือ",
+        "เกาะคริสต์มาส",
+        "เกาะนอร์ฟอล์ก",
+        "เกาะบูเวต",
+        "เกาะแมน",
+        "เกิร์นซีย์",
+        "แกมเบีย",
+        "โกตดิวัวร์",
+        "คอโมโรส",
+        "คอสตาริกา",
+        "คาซัคสถาน",
+        "คิริบาส",
+        "คิวบา",
+        "คีร์กีซสถาน",
+        "คีลิง",
+        "คูเวต",
+        "เคนยา",
+        "แคนาดา",
+        "แคเมอรูน",
+        "โครเอเชีย",
+        "โคลอมเบีย",
+        "จอร์เจีย",
+        "จอร์แดน",
+        "จาเมกา",
+        "จิบูตี",
+        "จีน",
+        "เจอร์ซีย์",
+        "ชาด",
+        "ชิลี",
+        "ซานมารีโน",
+        "ซามัว",
+        "ซาอุดีอาระเบีย",
+        "ซิมบับเว",
+        "ซีเรีย",
+        "ซูดาน",
+        "ซูรินาม",
+        "เซเชลส์",
+        "เซนต์คิตส์และเนวิส",
+        "เซนต์ลูเซีย",
+        "เซนต์วินเซนต์และเกรนาดีนส์",
+        "เซนต์เฮเลนา",
+        "เซเนกัล",
+        "เซอร์เบีย",
+        "เซาตูเมและปรินซิปี",
+        "เซียร์ราลีโอน",
+        "แซ็ง-บาร์เตเลมี",
+        "แซ็งบาร์เตเลมี",
+        "แซ็ง-มาร์แต็ง",
+        "แซ็งมาร์แต็ง",
+        "แซงปีแยร์และมีเกอลง",
+        "แซมเบีย",
+        "โซมาเลีย",
+        "ไซปรัส",
+        "ญี่ปุ่น",
+        "ดอมินีกา",
+        "เดนมาร์ก",
+        "ตรินิแดดและโตเบโก",
+        "ตองกา",
+        "ติมอร์-เลสเต",
+        "ติมอร์เลสเต",
+        "ตุรกี",
+        "ตูนิเซีย",
+        "ตูวาลู",
+        "เติร์กเมนิสถาน",
+        "โตเกเลา",
+        "โตโก",
+        "ไต้หวัน",
+        "ทาจิกิสถาน",
+        "แทนซาเนีย",
+        "ไทย",
+        "นครรัฐวาติกัน",
+        "นอร์เวย์",
+        "นามิเบีย",
+        "นาอูรู",
+        "นิการากัว",
+        "นิวแคลิโดเนีย",
+        "นิวซีแลนด์",
+        "นีอูเอ",
+        "เนเธอร์แลนด์แอนทิลลีส",
+        "เนเธอร์แลนด์",
+        "เนปาล",
+        "ไนจีเรีย",
+        "ไนเจอร์",
+        "บราซิล",
+        "บริติชอินเดียนโอเชียนเทร์ริทอรี",
+        "บรูไนดารุสซาลาม",
+        "บอตสวานา",
+        "บอสเนียและเฮอร์เซโกวีนา",
+        "บังกลาเทศ",
+        "บัลแกเรีย",
+        "บาร์เบโดส",
+        "บาห์เรน",
+        "บาฮามาส",
+        "บุรุนดี",
+        "บูร์กินาฟาโซ",
+        "เบนิน",
+        "เบลเยียม",
+        "เบลารุส",
+        "เบลีซ",
+        "เบอร์มิวดา",
+        "โบลิเวีย",
+        "ปากีสถาน",
+        "ปานามา",
+        "ปาปัวนิวกินี",
+        "ปารากวัย",
+        "ปาเลา",
+        "ปาเลสไตน์",
+        "เปรู",
+        "เปอร์โตริโก",
+        "โปรตุเกส",
+        "โปแลนด์",
+        "ฝรั่งเศส",
+        "พม่า",
+        "ฟิจิ",
+        "ฟินแลนด์",
+        "ฟิลิปปินส์",
+        "เฟรนช์เกียนา",
+        "เฟรนช์โปลินีเซีย",
+        "ภูฏาน",
+        "มองโกเลีย",
+        "มอนต์เซอร์รัต",
+        "มอนเตเนโกร",
+        "มอริเชียส",
+        "มอริเตเนีย",
+        "มอลโดวา",
+        "มอลตา",
+        "มัลดีฟส์",
+        "มาเก๊า",
+        "มาซิโดเนีย",
+        "มาดากัสการ์",
+        "มายอต",
+        "มาร์ตีนิก",
+        "มาลาวี",
+        "มาลี",
+        "มาเลเซีย",
+        "เม็กซิโก",
+        "โมซัมบิก",
+        "โมนาโก",
+        "โมร็อกโก",
+        "ไมโครนีเซีย",
+        "ยานไมเอน",
+        "ยิบรอลตาร์",
+        "ยูกันดา",
+        "ยูเครน",
+        "เยเมน",
+        "เยอรมนี",
+        "รวันดา",
+        "รัสเซีย",
+        "เรอูว์นียง",
+        "โรมาเนีย",
+        "ลักเซมเบิร์ก",
+        "ลัตเวีย",
+        "ลาว",
+        "ลิกเตนสไตน์",
+        "ลิทัวเนีย",
+        "ลิเบีย",
+        "เลโซโท",
+        "เลบานอน",
+        "ไลบีเรีย",
+        "วานูอาตู",
+        "วาลลิสและฟุตูนา",
+        "เวเนซุเอลา",
+        "เวสเทิร์นสะฮารา",
+        "เวียดนาม",
+        "ศรีลังกา",
+        "สกอตแลนด์",
+        "สเปน",
+        "สฟาลบาร์",
+        "สโลวาเกีย",
+        "สโลวีเนีย",
+        "สวาซิแลนด์",
+        "สวิตเซอร์แลนด์",
+        "สวีเดน",
+        "สหรัฐอเมริกา",
+        "สหรัฐอาหรับเอมิเรตส์",
+        "สหราชอาณาจักร",
+        "สาธารณรัฐคองโก",
+        "สาธารณรัฐเช็ก",
+        "สาธารณรัฐโดมินิกัน",
+        "สิงคโปร์",
+        "หมู่เกาะคุก",
+        "หมู่เกาะเคย์แมน",
+        "หมู่เกาะโคโคส",
+        "หมู่เกาะโซโลมอน",
+        "หมู่เกาะบริติชเวอร์จิน",
+        "หมู่เกาะพิตแคร์น",
+        "หมู่เกาะฟอล์กแลนด์",
+        "หมู่เกาะแฟโร",
+        "หมู่เกาะมาร์แชลล์",
+        "อเมริกันซามัว",
+        "ออสเตรเลีย",
+        "ออสเตรีย",
+        "อังกฤษ",
+        "อันดอร์รา",
+        "อัฟกานิสถาน",
+        "อาเซอร์ไบจาน",
+        "อาร์เจนตินา",
+        "อาร์มีเนีย",
+        "อารูบา",
+        "อิเควทอเรียลกินี",
+        "อิตาลี",
+        "อินเดีย",
+        "อินโดนีเซีย",
+        "อิรัก",
+        "อิสราเอล",
+        "อิหร่าน",
+        "อียิปต์",
+        "อุซเบกิสถาน",
+        "อุรุกวัย",
+        "เอกวาดอร์",
+        "เอธิโอเปีย",
+        "เอริเทรีย",
+        "เอลซัลวาดอร์",
+        "เอสโตเนีย",
+        "แองกวิลลา",
+        "แองโกลา",
+        "แอฟริกากลาง",
+        "แอฟริกาใต้",
+        "แอลจีเรีย",
+        "แอลเบเนีย",
+        "โอมาน",
+        "ไอซ์แลนด์",
+        "ไอร์แลนด์",
+        "ไอวอรีโคสต์",
+        "ฮ่องกง",
+        "ฮอนดูรัส",
+        "ฮังการี",
+        "เฮติ",
+    )
diff --git a/faker/providers/address/th_TH/__init__.py b/faker/providers/address/th_TH/__init__.py
new file mode 100644
index 00000000..15646d54
--- /dev/null
+++ b/faker/providers/address/th_TH/__init__.py
@@ -0,0 +1,34 @@
+from ..th import Provider as AddressProvider
+
+
+class Provider(AddressProvider):
+
+    building_number_formats = (
+        "###",
+        "##",
+        "#",
+        "###/#",
+        "###/##",
+        "##/#",
+        "##/##",
+        "#/#",
+    )
+
+    street_prefixes = [
+        "ถนน",
+        "ซอย",
+        "ตรอก",
+    ]
+
+    postcode_formats = (
+        # as per https://en.wikipedia.org/wiki/Postal_codes_in_Thailand
+        "1###0",
+        "2###0",
+        "3###0",
+        "4###0",
+        "5###0",
+        "6###0",
+        "7###0",
+        "8###0",
+        "9###0",
+    )
diff --git a/faker/providers/person/th_TH/__init__.py b/faker/providers/person/th_TH/__init__.py
index 8bf4f9b5..a758b5c9 100644
--- a/faker/providers/person/th_TH/__init__.py
+++ b/faker/providers/person/th_TH/__init__.py
@@ -1,166 +1,789 @@
+from collections import OrderedDict
+
 from .. import Provider as PersonProvider
 
 
 class Provider(PersonProvider):
-    formats = (
-        '{{first_name}} {{last_name}}', '{{first_name}} {{last_name}}',
-        '{{first_name}} {{last_name}}',
-        '{{first_name}} {{last_name}}',
-        '{{first_name}} {{last_name}}',
-        '{{first_name}} {{last_name}}',
-        '{{prefix}} {{first_name}} {{last_name}}',
-        '{{prefix}} {{first_name}} {{last_name}} {{suffix}}',
-        '{{first_name}} {{last_name}} {{suffix}}')
+    # weights are arbitrarily assigned
+    formats = OrderedDict((
+        ("{{first_name}} {{last_name}}", 0.97),
+        ("{{prefix}} {{first_name}} {{last_name}}", 0.015),
+        ("{{prefix}} {{first_name}} {{last_name}} {{suffix}}", 0.02),
+        ("{{first_name}} {{last_name}} {{suffix}}", 0.005),
+    ))
 
-    # Thai prefix
+    # Thai prefix, adapted from
     # http://www.stou.ac.th/thai/grad_stdy/Apply/prefix.asp
-    prefixes_female = (
-        "พลเอก", "พลโท", "พลตรี", "พันเอก", "พันโท", "พันตรี", "ร้อยเอก", "ร้อยโท",
-        "ร้อยตรี",
-        "จ่าสิบเอก", "จ่าสิบโท", "จ่าสิบตรี", "สิบเอก", "สิบโท", "สิบตรี", "พลทหาร",
-        "พลเรือเอก", "พลเรือโท", "พลเรือตรี", "นาวาเอก", "นาวาโท", "นาวาตรี", "เรือเอก",
-        "เรือโท", "เรือตรี", "พันจ่าเอก", "พันจ่าโท", "พันจ่าตรี", "จ่าเอก", "จ่าโท",
-        "จ่าตรี", "พลทหาร", "พลอากาศเอก", "พลอากาศโท", "พลอากาศตรี", "นาวาอากาศเอก",
-        "นาวาอากาศโท", "นาวาอากาศตรี", "เรืออากาศเอก", "เรืออากาศโท", "เรืออากาศตรี",
-        "พันจ่าอากาศเอก", "พันจ่าอากาศโท", "พันจ่าอากาศตรี", "จ่าอากาศเอก", "จ่าอากาศโท",
-        "จ่าอากาศตรี", "พลทหาร", "พลตำรวจเอก", "พลตำรวจโท", "พลตำรวจตรี", "พันตำรวจเอก",
-        "พันตำรวจโท", "พันตำรวจตรี", "ร้อยตำรวจเอก", "ร้อยตำรวจโท", "ร้อยตำรวจตรี",
-        "นายดาบตำรวจ", "จ่าสิบตำรวจ", "สิบตำรวจเอก", "สิบตำรวจโท", "สิบตำรวจตรี",
-        "พลตำรวจ", "นาง", "นางสาว", "หม่อมหลวง", "หม่อมราชวงศ์", "พล.อ.",
-        "พล.ท.", "พล.ต.", "พ.อ.", "พ.ท.", "พ.ต.", "ร.อ.", "ร.ท.", "ร.ต.", "จ.ส.อ.",
-        "จ.ส.ท.",
-        "จ.ส.ต.", "ส.อ.", "ส.ท.", "ส.ต.", "พลฯ", "พล.ร.อ.", "พล.ร.ท.", "พล.ร.ต.", "น.อ.",
-        "น.ท.", "น.ต.", "ร.อ.", "ร.ท.", "ร.ต.", "พ.จ.อ.", "พ.จ.ท.", "พ.จ.ต.", "จ.อ.",
-        "จ.ท.",
-        "จ.ต.", "พลฯ", "พล.อ.อ.", "พล.อ.ท.", "พล.อ.ต.", "น.อ.", "น.ท.", "น.ต.", "ร.อ.",
-        "ร.ท.", "ร.ต.", "พ.อ.อ.", "พ.อ.ท.", "พ.อ.ต.", "จ.อ.", "จ.ท.", "จ.ต.", "พลฯ",
-        "พล.ต.อ.", "พล.ต.ท.", "พล.ต.ต.", "พ.ต.อ.", "พ.ต.ท.", "พ.ต.ต.", "ร.ต.อ.", "ร.ต.ท.",
-        "ร.ต.ต.", "ด.ต.", "จ.ส.ต.", "ส.ต.อ.", "ส.ต.ท.", "ส.ต.ต.", "พลฯ", "ม.ล.", "ม.ร.ว.")
+    # weights are arbitrarily assigned
+    prefixes_female = OrderedDict((
+        ("นาง", 0.3),
+        ("น.ส.", 0.2),
+        ("นางสาว", 0.15),
+        ("ด.ญ.", 0.15),
+        ("เด็กหญิง", 0.05),
+        ("จ.ต.", 0.001),
+        ("จ.ท.", 0.001),
+        ("จ.ส.ต.", 0.001),
+        ("จ.ส.ท.", 0.001),
+        ("จ.ส.อ.", 0.001),
+        ("จ.อ.", 0.001),
+        ("ด.ต.", 0.001),
+        ("น.ต.", 0.001),
+        ("น.ท.", 0.001),
+        ("น.อ.", 0.001),
+        ("พ.จ.ต.", 0.001),
+        ("พ.จ.ท.", 0.001),
+        ("พ.จ.อ.", 0.001),
+        ("พ.ต.", 0.001),
+        ("พ.ต.ต.", 0.001),
+        ("พ.ต.ท.", 0.001),
+        ("พ.ต.อ.", 0.001),
+        ("พ.ท.", 0.001),
+        ("พ.อ.", 0.001),
+        ("พ.อ.ต.", 0.001),
+        ("พ.อ.ท.", 0.001),
+        ("พ.อ.อ.", 0.001),
+        ("ร.ต.", 0.001),
+        ("ร.ต.ต.", 0.001),
+        ("ร.ต.ท.", 0.001),
+        ("ร.ต.อ.", 0.001),
+        ("ร.ท.", 0.001),
+        ("ร.อ.", 0.001),
+        ("ส.ต.", 0.001),
+        ("ส.ต.ต.", 0.001),
+        ("ส.ต.ท.", 0.001),
+        ("ส.ต.อ.", 0.001),
+        ("ส.ท.", 0.001),
+        ("ส.อ.", 0.001),
+        ("พล.ต.", 0.0001),
+        ("พล.ต.ต.", 0.0001),
+        ("พล.ต.ท.", 0.0001),
+        ("พล.ต.อ.", 0.0001),
+        ("พล.ท.", 0.0001),
+        ("พล.ร.ต.", 0.0001),
+        ("พล.ร.ท.", 0.0001),
+        ("พล.ร.อ.", 0.0001),
+        ("พล.อ.", 0.0001),
+        ("พล.อ.ต.", 0.0001),
+        ("พล.อ.ท.", 0.0001),
+        ("พล.อ.อ.", 0.0001),
+        ("ม.ร.ว.", 0.0001),
+        ("ม.ล.", 0.0001),
+        ("หม่อมราชวงศ์", 0.0001),
+        ("หม่อมหลวง", 0.0001),
+    ))
 
-    prefixes_male = (
-        "พลเอก", "พลโท", "พลตรี", "พันเอก", "พันโท", "พันตรี", "ร้อยเอก", "ร้อยโท",
-        "ร้อยตรี",
-        "จ่าสิบเอก", "จ่าสิบโท", "จ่าสิบตรี", "สิบเอก", "สิบโท", "สิบตรี", "พลทหาร",
-        "พลเรือเอก", "พลเรือโท", "พลเรือตรี", "นาวาเอก", "นาวาโท", "นาวาตรี", "เรือเอก",
-        "เรือโท", "เรือตรี", "พันจ่าเอก", "พันจ่าโท", "พันจ่าตรี", "จ่าเอก", "จ่าโท",
-        "จ่าตรี", "พลทหาร", "พลอากาศเอก", "พลอากาศโท", "พลอากาศตรี", "นาวาอากาศเอก",
-        "นาวาอากาศโท", "นาวาอากาศตรี", "เรืออากาศเอก", "เรืออากาศโท", "เรืออากาศตรี",
-        "พันจ่าอากาศเอก", "พันจ่าอากาศโท", "พันจ่าอากาศตรี", "จ่าอากาศเอก", "จ่าอากาศโท",
-        "จ่าอากาศตรี", "พลทหาร", "พลตำรวจเอก", "พลตำรวจโท", "พลตำรวจตรี", "พันตำรวจเอก",
-        "พันตำรวจโท", "พันตำรวจตรี", "ร้อยตำรวจเอก", "ร้อยตำรวจโท", "ร้อยตำรวจตรี",
-        "นายดาบตำรวจ", "จ่าสิบตำรวจ", "สิบตำรวจเอก", "สิบตำรวจโท", "สิบตำรวจตรี",
-        "พลตำรวจ",
-        "นาย", "บาทหลวง", "หม่อมหลวง", "หม่อมราชวงศ์", "สามเณร", "พระ",
-        "พระอธิการ", "เจ้าอธิการ", "พระปลัด", "พระสมุห์", "พระใบฎีกา", "พระครูปลัด",
-        "พระครูสมุห์", "พระครูใบฎีกา", "พระมหา", "พระครูธรรมธร", "พระครูวินัยธร", "พล.อ.",
-        "พล.ท.", "พล.ต.", "พ.อ.", "พ.ท.", "พ.ต.", "ร.อ.", "ร.ท.", "ร.ต.", "จ.ส.อ.",
-        "จ.ส.ท.",
-        "จ.ส.ต.", "ส.อ.", "ส.ท.", "ส.ต.", "พลฯ", "พล.ร.อ.", "พล.ร.ท.", "พล.ร.ต.", "น.อ.",
-        "น.ท.", "น.ต.", "ร.อ.", "ร.ท.", "ร.ต.", "พ.จ.อ.", "พ.จ.ท.", "พ.จ.ต.", "จ.อ.",
-        "จ.ท.",
-        "จ.ต.", "พลฯ", "พล.อ.อ.", "พล.อ.ท.", "พล.อ.ต.", "น.อ.", "น.ท.", "น.ต.", "ร.อ.",
-        "ร.ท.", "ร.ต.", "พ.อ.อ.", "พ.อ.ท.", "พ.อ.ต.", "จ.อ.", "จ.ท.", "จ.ต.", "พลฯ",
-        "พล.ต.อ.", "พล.ต.ท.", "พล.ต.ต.", "พ.ต.อ.", "พ.ต.ท.", "พ.ต.ต.", "ร.ต.อ.", "ร.ต.ท.",
-        "ร.ต.ต.", "ด.ต.", "จ.ส.ต.", "ส.ต.อ.", "ส.ต.ท.", "ส.ต.ต.", "พลฯ", "ม.ล.", "ม.ร.ว.")
+    prefixes_male = OrderedDict((
+        ("นาย", 0.6),
+        ("ด.ช.", 0.3),
+        ("จ.ต.", 0.001),
+        ("จ.ท.", 0.001),
+        ("จ.ส.ต.", 0.001),
+        ("จ.ส.ท.", 0.001),
+        ("จ.ส.อ.", 0.001),
+        ("จ.อ.", 0.001),
+        ("ด.ต.", 0.001),
+        ("น.ต.", 0.001),
+        ("น.ท.", 0.001),
+        ("น.อ.", 0.001),
+        ("พ.จ.ต.", 0.001),
+        ("พ.จ.ท.", 0.001),
+        ("พ.จ.อ.", 0.001),
+        ("พ.ต.", 0.001),
+        ("พ.ต.ต.", 0.001),
+        ("พ.ต.ท.", 0.001),
+        ("พ.ต.อ.", 0.001),
+        ("พ.ท.", 0.001),
+        ("พ.อ.", 0.001),
+        ("พ.อ.ต.", 0.001),
+        ("พ.อ.ท.", 0.001),
+        ("พ.อ.อ.", 0.001),
+        ("ร.ต.", 0.001),
+        ("ร.ต.ต.", 0.001),
+        ("ร.ต.ท.", 0.001),
+        ("ร.ต.อ.", 0.001),
+        ("ร.ท.", 0.001),
+        ("ร.อ.", 0.001),
+        ("ส.ต.", 0.001),
+        ("ส.ต.ต.", 0.001),
+        ("ส.ต.ท.", 0.001),
+        ("ส.ต.อ.", 0.001),
+        ("ส.ท.", 0.001),
+        ("ส.อ.", 0.001),
+        ("พล.ต.", 0.0001),
+        ("พล.ต.ต.", 0.0001),
+        ("พล.ต.ท.", 0.0001),
+        ("พล.ต.อ.", 0.0001),
+        ("พล.ท.", 0.0001),
+        ("พล.ร.ต.", 0.0001),
+        ("พล.ร.ท.", 0.0001),
+        ("พล.ร.อ.", 0.0001),
+        ("พล.อ.", 0.0001),
+        ("พล.อ.ต.", 0.0001),
+        ("พล.อ.ท.", 0.0001),
+        ("พล.อ.อ.", 0.0001),
+        ("ม.ร.ว.", 0.0001),
+        ("ม.ล.", 0.0001),
+        ("หม่อมราชวงศ์", 0.0001),
+        ("หม่อมหลวง", 0.0001),
+        ("พระ", 0.0001),
+        ("สามเณร", 0.001),
+        ("พระครูธรรมธร", 0.00001),
+        ("พระครูปลัด", 0.00001),
+        ("พระครูวินัยธร", 0.00001),
+        ("พระครูสมุห์", 0.00001),
+        ("พระครูใบฎีกา", 0.00001),
+        ("พระปลัด", 0.00001),
+        ("พระมหา", 0.00001),
+        ("พระสมุห์", 0.00001),
+        ("พระอธิการ", 0.00001),
+        ("พระใบฎีกา", 0.00001),
+        ("เจ้าอธิการ", 0.00001),
+    ))
 
-    prefixes = prefixes_female + prefixes_male
+    prefixes = prefixes_female.copy()
+    prefixes.update(prefixes_male)
 
-    # Chulalongkorn University famous teacher&student first name
+    # first name partially from
+    # Chulalongkorn University famous teacher & student first name
     # https://th.wikipedia.org/wiki/%E0%B8%A3%E0%B8%B2%E0%B8%A2%E0%B8%99%E0%B8%B2%E0%B8%A1%E0%B8%9A%E0%B8%B8%E0%B8%84%E0%B8%84%E0%B8%A5%E0%B8%88%E0%B8%B2%E0%B8%81%E0%B8%88%E0%B8%B8%E0%B8%AC%E0%B8%B2%E0%B8%A5%E0%B8%87%E0%B8%81%E0%B8%A3%E0%B8%93%E0%B9%8C%E0%B8%A1%E0%B8%AB%E0%B8%B2%E0%B8%A7%E0%B8%B4%E0%B8%97%E0%B8%A2%E0%B8%B2%E0%B8%A5%E0%B8%B1%E0%B8%A2
+    # and
+    # https://github.com/PyThaiNLP/pythainlp/blob/dev/pythainlp/corpus/person_names_female_th.txt
+    # https://github.com/PyThaiNLP/pythainlp/blob/dev/pythainlp/corpus/person_names_male_th.txt
     first_names = (
-        "ขวัญข้าว", "จักรพงศ์", "วัลลภ", "ธนชัย", "ธนพร", "หม่อมหลวงปิยาภัสร์",
-        "นันทวัฒน์", "ภัทร", "ศิริพิชยา", "สุนิดา", "สุรางค์", "หม่อมหลวงสราลี", "อรพรรณ",
-        "อัษฎาวุธ", "อิทธิพงศ์", "อดิสรณ์", "เกริก", "กุศล", "กรรณิการ์", "กฤษฎา",
-        "กอบชัย", "ชยาวุธ", "ชลอ", "ชนิสาร์", "ชาญชัย", "ชูเกียรติ", "ถาวร", "ณัฐจักร",
-        "ณรงค์", "นันทศักดิ์", "ประดิษฐ์", "ปิยะพันธ์", "ยรรยง", "บุญส่ง", "ปรีชา",
-        "มิ่งขวัญ", "เลิศศักดิ์", "วัฒนา", "วีระศักดิ์", "สดศรี", "ภูริกูลกฤษฎ์",
-        "สุวิชา", "สุธรรม", "อาทิวราห์", "กริช", "กฤชภร", "กฤษดา", "กิจมาโนชญ์",
-        "กุลนัดดา", "คมกฤษ", "คีรติ", "จันทรา", "ชนม์ทิดา", "จิระ", "ชลิตา", "ชูเกียรติ",
-        "ทรงยศ", "ฉันทวิชช์", "ฉัตรปวีณ์", "ฐิติมา", "ณภศศิ", "ฟองสนาน", "ทรงยศ",
-        "ทักษอร", "ธีรัตถ์", "ธิติมา", "ณภศศิ", "นิธิวัฒน์", "นิรมล", "บุญยอด", "บรรจง",
-        "ประภัทร์", "ประสงค์", "ประวีณมัย", "ปราโมช", "ปวีณ์สุดา", "ปวีณ์นุช", "ปาณิสรา",
-        "ปิยณี", "พัชรศรี", "พันธุ์เลิศ", "พุทธชาด", "ไพบูลย์", "ภัทรวี", "ยงยุทธ",
-        "ยุทธนา", "รัชวิน", "วิชชพัชร์", "วันชัย", "หม่อมหลวงวราภา", "วิทยา", "วรรษพร",
-        "ศศิวรรณ์", "สุทธิชัย", "สมพล", "สันติ", "สู่ขวัญ", "สายทิพย์", "สายัณห์",
-        "สิริยากร", "สุภิญญา", "เสริมคุณ", "สวรรยา", "หฤหรรษ์", "อดิสรณ์", "มาดามมด",
-        "ไอยวริญท์", "อรุโณชา", "อ่อนอุษา", "อาภาภัทร", "อเล็กซ์", "อภิชาต", "ปวีณ",
-        "เมษ", "ปิยะชาติ", "จารุณี", "ธีมะ", "จักรพันธ์", "ธนพล", "คณาธิป", "กิจมาโนชญ์",
-        "ธัญชนก", "พัฒนะชัย", "สุทัตตา", "ภัทร", "รสสุคนธ์", "นิพนธ์", "ธัญญา",
-        "ปรัชญานันท์", "กรกันต์", "ปาจรีย์", "พิสิทธิ์", "กฤตยา", "กันต์", "กอบศักดิ์",
-        "กานธนิกา", "ขัตติยา", "ชฎาทิพ", "ดวงใจ", "จุฑาวุฒิ", "จันทิมา", "งามนิตย์",
-        "เมตตา", "ปริศนา", "ธนะชัย", "ธนันต์ธรญ์", "นวลพรรณ", "นภารัตน์", "เมธินี", "บดี",
-        "บุษกร", "ประเวช", "พชร", "พลอย", "ภัทรียา", "ยิ่งพันธ์", "ลักษณา", "เลอศักดิ์",
-        "สรสิทธิ์", "สาลินี", "ทองอุไร", "วรุธ", "วิสิฐ", "วศิน", "วรพิศ", "สันติ",
-        "สุกัญญา", "สุวิชญ", "เสาวณี", "สุวรรณ", "สามารถ", "สาคร", "สุชาดา", "หิรัญญา",
-        "ศุภเดช", "ศรัณย์ทร", "อโนทัย", "อนันต์", "บุญยงค์", "พรรณประภา", "วิชัย",
-        "สุรพล", "สมัย", "สำลี", "รอดคล้าย", "สอนตระกูล", "ธรณินทร์", "ศรีหล้า",
-        "สิทธิหล่อ", "วัฒนางกูร", "บุหงา", "สมหมาย", "ขัตติยะ", "บุญทอง", "โสภา",
-        "ธวัชชัย", "ดารณี", "ศิริพร", "อมรวิชช์", "แขมมณี", "สุนีย์", "ชนิตา", "สมพงษ์",
-        "สุนพงษ์ศรี", "ไพฑูรย์", "นงลักษณ์", "ปทีป", "สมหวัง", "วิจิตร", "ธนู", "ธำรง",
-        "นายแพทย์", "พิศาล", "คงสง", "เอี่ยมวรวุฒิกุล", "ชินโสภณทรัพย์", "เพ็ชรา",
-        "ทองประสม", "พสุธา", "ยุกตะนันทน์", "มธุราสัย", "ชาติสุทธิพันธุ์",
-        "หม่อมราชวงศ์อ๊อด", "ประสิทธิ์", "ไตรรัตน์วรกุล", "จีรศักดิ์", "จันศิษย์ยานนท์",
-        "สมพร", "ศิริจิตร", "คันธวงศ์", "พาลุสุข", "พหิทธานุกร", "วลัยเสถียร", "จุลพงศธร",
-        "ภูมิ", "จุฑานนท์", "เดชรักษา", "ดิสสะมาน", "เชื้อบุญชัย", "สรุโฆษิต", "ชลอ",
-        "ปกป้อง", "เหมะรัชตะ", "มันตราภรณ์", "ประยูร", "ไพโรจน์", "ดร.", "ชุติวงศ์",
-        "ภักดีธนากุล", "วสันตสิงห์", "นิติสิริ", "จันทรางศุ", "วิชิตชลชัย", "มหาคุณ",
-        "อริยะนันทกะ", "ธรรมาพิทักษ์กุล", "มงคลนาวิน", "สุรเกียรติ์", "ติงสมิตร", "ฤทัย",
-        "เมฆเกรียงไกร", "เกรียงไกร", "สุนีย์", "วีระพงษ์", "นันทวัฒน์", "ศักดา",
-        "บวรศักดิ์", "วิษณุ", "อุรพีพัฒนพงศ์", "เขมะจารุ", "สุชีวะ", "ลัดพลี",
-        "โฆวิไลกูล", "ดิษฐอำนาจ", "สัจจวานิช", "พานิชวงศ์", "ไตรประสิทธิ์", "ฉ่ำเฉลิม",
-        "ภัทราคม", "ไพศิษฐ์", "คณิต", "สุนทร", "หยุด", "อมร", "โกเมน", "ฦาไชย",
-        "กิตติพงษ์", "มาศดิตถ์", "มาลีนนท์", "ตั้งพูลสินธนา", "รัตนนาคินทร์",
-        "หม่อมหลวงวิฏราธร", "ประกอบผล", "เตชานันท์", "วิรุฬห์รักษ์", "ประเสริฐสกุล",
-        "สุดบรรทัด", "สถาปิตานนท์", "เบ็ญจรงค์กิจ", "ปั้นเหน่งเพ็ชร์", "รอดคำดี",
-        "ทองมีอาคม", "ศิริยุวศักดิ์", "ชลวิไล", "ปราสาททองโอสถ", "เกยุราพันธุ์", "เมณฑกา",
-        "วีระเมธีกุล", "สมะลาภา", "ทองปาน", "แสงสนิท", "คุณพนิชกิจ", "ปานะนนท์",
-        "สามโกเศศ", "บุนนาค", "วีรวรรณ", "สุทธิวาทนฤพุฒิ", "ธัญลักษณ์ภาคย์", "วรรธนะสิน",
-        "รุนสำราญ", "กรัยวิเชียร", "บัญชี", "เมาลานนท์", "อภิเมธีธำรง", "สุชาดา",
-        "จันทร์ฉาย", "ตันละมัย", "กรพรหม", "จันทรลาวัณย์", "ดวงเนตร", "เจริญเศรษฐศิลป์",
-        "ลี่สถาพรวงศา", "เจียมบุญศรี", "อัถโถปกรณ์", "เมฆธน", "วลีอิทธิกุล",
-        "ศรีประพันธ์", "พระครูปลัดสุวัฒนโพธิคุณ", "มโน", "นลินี", "บุรพรัตน์",
-        "ตัณฑ์ไพโรจน์", "มานพ", "เสาวภาพ", "ณรงค์", "ตันตยาภรณ์", "ชีวะเกตุ",
-        "สัณฑ์พิทักษ์", "โปษยะจินดา", "อัมพร", "ชัยชน", "มหาทุมะรัตน์", "ประภัสสราทร",
-        "เหมะจุฑา", "ตัณฑวิเชียร", "ลิ้มสุวรรณ", "เทียนบุญ", "ปิยะรัตน์", "ภู่วรวรรณ",
-        "ศุภจัตุรัส", "โชติเลอศักดิ์", "บุณยะโหตระ", "กสานติกุล", "ลิ้มพงศานุรักษ์",
-        "อนุราษฎร์", "จิตต์มิตรภาพ", "สุวรรณเวลา", "สิทธีอมร", "อ่องจริต", "ดุสิตสิน",
-        "ภานุภาค", "ฟูตระกูล", "โปษยะจินดา", "สิตปรีชา", "ช่วงโชติ", "ศรีจิตรา", "ประมวล",
-        "บุญเชียร", "หงศ์ลดารมภ์", "รามสูต", "อึ้งถาวร", "วาทีสาธกกิจ", "สันติไชยกุล")
+        "กมล",
+        "กรกันต์",
+        "กรรณิการ์",
+        "กริช",
+        "กฤชภร",
+        "กฤตยา",
+        "กฤษฎา",
+        "กฤษดา",
+        "กฤษนะ",
+        "กอบชัย",
+        "กอบศักดิ์",
+        "กัญรภัส",
+        "กันต์",
+        "กานธนิกา",
+        "การะเกด",
+        "กิตตินันท์",
+        "กิตติพงษ์",
+        "กุลนัดดา",
+        "กุลนิจ",
+        "กุศล",
+        "กุศล",
+        "กุสนี",
+        "เกริก",
+        "เกรียงไกร",
+        "เกรียงเดช",
+        "เกษรา",
+        "เกษศิรินทร์",
+        "โกเมน",
+        "ขวัญข้าว",
+        "ขัตติยะ",
+        "ขัตติยา",
+        "เขมิณทรา",
+        "แขมมณี",
+        "คงสง",
+        "คณะณัฐ",
+        "คณาธิป",
+        "คณิต",
+        "คมกฤษ",
+        "คำแข่ง",
+        "คีรติ",
+        "งามนิตย์",
+        "จรรยานี",
+        "จักรพงศ์",
+        "จักรพันธ์",
+        "จันทร์พิมพ์",
+        "จันทรา",
+        "จันทิมา",
+        "จารุณี",
+        "จำเนียร",
+        "จำลอง",
+        "จิตติมา",
+        "จิระ",
+        "จิรัฐิติ",
+        "จีรศักดิ์",
+        "จุฑาวุฒิ",
+        "จุรินทร์",
+        "จุฬิน",
+        "ฉัตรปวีณ์",
+        "ฉัตรวัชร์",
+        "ฉันทวิชช์",
+        "ชญาภา",
+        "ชฎาทิพ",
+        "ชนกนันท์",
+        "ชนม์ทิดา",
+        "ชนาธิป",
+        "ชนิตา",
+        "ชนิสาร์",
+        "ชยกร",
+        "ชยาวุธ",
+        "ชยิศา",
+        "ชลวิไล",
+        "ชลอ",
+        "ชลิตา",
+        "ช่วงโชติ",
+        "ชวฤทธิ์",
+        "ชัชมาภรณ์",
+        "ชัญญานุช",
+        "ชัยชน",
+        "ชัยณรงค์",
+        "ชาญชัย",
+        "ชารีฟ",
+        "ชีวะเกตุ",
+        "ชุติรัตน์",
+        "ชุติวงศ์",
+        "ชูกัน",
+        "ชูเกียรติ",
+        "โชคชัย",
+        "โชติพิพัฒน์",
+        "ซัลมีซา",
+        "ฎาริกา",
+        "ฐนิตนันท์",
+        "ฐิตาชลีข์",
+        "ฐิติมา",
+        "ณชัย",
+        "ณภศศิ",
+        "ณรงค์",
+        "ณรงค์",
+        "ณรัณธกรณ์",
+        "ณัฐจักร",
+        "ณัฐฑิกานต์",
+        "ณัฐ",
+        "ณัฐวลัย",
+        "ณัฐสิทธิ์",
+        "ณัฐหทัย",
+        "ณัทกาญจน์",
+        "ณิชานันท์",
+        "ดวงใจ",
+        "ดวงเนตร",
+        "ดารณี",
+        "ดำริห์",
+        "ดุจฤดี",
+        "ดุสิตสิน",
+        "ดุสิตา",
+        "เดชดำรง",
+        "ติงสมิตร",
+        "เตชานันท์",
+        "ถาวร",
+        "เถลิงเดช",
+        "ทรงยศ",
+        "ทวิช",
+        "ทวีพงศ์",
+        "ทวียศ",
+        "ทองปาน",
+        "ทักษอร",
+        "เทียนบุญ",
+        "ธนกิจ",
+        "ธนชัย",
+        "ธนพร",
+        "ธนพล",
+        "ธนพันธ์",
+        "ธนะชัย",
+        "ธนันต์ธรญ์",
+        "ธนาธร",
+        "ธนิตพล",
+        "ธนู",
+        "ธภัทร",
+        "ธรณินทร์",
+        "ธวัชชัย",
+        "ธัชกร",
+        "ธัญชนก",
+        "ธัญญา",
+        "ธัญฤทธิ์",
+        "ธัญสิทธิ์",
+        "ธันย์ชนก",
+        "ธารา",
+        "ธาราภูมิ",
+        "ธำรง",
+        "ธิติมา",
+        "ธิปัตยา",
+        "ธีมะ",
+        "ธีรภัทธ์",
+        "ธีรัตถ์",
+        "ธีราทัต",
+        "นงลักษณ์",
+        "นนทกานต์",
+        "นพเก้า",
+        "นภารัตน์",
+        "นฤเทพ",
+        "นลินี",
+        "นวลพรรณ",
+        "นันทวัฒน์",
+        "นันทศักดิ์",
+        "นันทิญา",
+        "นิติมา",
+        "นิติสิริ",
+        "นิธิวัฒน์",
+        "นิพนธ์",
+        "นิพาดา",
+        "นิรมล",
+        "นิรมล",
+        "นุชชาลี",
+        "นุชอนงค์",
+        "นูรฟานา",
+        "นูรูมัน",
+        "บดี",
+        "บรรจง",
+        "บวรศักดิ์",
+        "บุญเชียร",
+        "บุญถึง",
+        "บุญทอง",
+        "บุญพิทักษ์",
+        "บุญยงค์",
+        "บุญยอด",
+        "บุญเลื่อน",
+        "บุญส่ง",
+        "บุญเหนือ",
+        "บุรพรัตน์",
+        "บุษกร",
+        "บุหงา",
+        "ปกป้อง",
+        "ปฏิญญา",
+        "ปทีป",
+        "ปรมัตต์",
+        "ปรวรรษ",
+        "ประกายพรึก",
+        "ประดิษฐ์",
+        "ประเทืองวุฒิ",
+        "ประภัทร์",
+        "ประมวล",
+        "ประโมทย์",
+        "ประยูร",
+        "ประวีณมัย",
+        "ประเวช",
+        "ประสงค์",
+        "ประสิทธิ์",
+        "ประเสริฐศรี",
+        "ปราโมช",
+        "ปริศนา",
+        "ปรีชา",
+        "ปรียาพร",
+        "ปวีณ์นุช",
+        "ปวีณ์นุนาย",
+        "ปวีณ",
+        "ปวีณ์สุดา",
+        "ปองภพ",
+        "ปัณย์วีร์",
+        "ปาจรีย์",
+        "ปาณิสรา",
+        "ปานจิตร",
+        "ปาลีรัตน์",
+        "ปิยณี",
+        "ปิยะชาติ",
+        "ปิยะพันธ์",
+        "ปิยะรัตน์",
+        "พงศ์พิสุทธิ์",
+        "พชร",
+        "พรสิทธิ์",
+        "พลอย",
+        "พสุธา",
+        "พัชชริน",
+        "พัชทนัน",
+        "พัชรศรี",
+        "พัชฤนาถ",
+        "พัฒนะชัย",
+        "พันธมิตร",
+        "พันธุ์เลิศ",
+        "พาดีล๊ะ",
+        "พาลุสุข",
+        "พิชยา",
+        "พิชัยยุทธ์",
+        "พิบูลย์รัฐ",
+        "พิมพ์มาดา",
+        "พิมพิกา",
+        "พิรุณรักษ์",
+        "พิศาล",
+        "พิสมัย",
+        "พิสิทธิ์",
+        "พุดตาล",
+        "พุทธชาด",
+        "เพ็ชรา",
+        "ไพฑูรย์",
+        "ไพบูลย์",
+        "ไพโรจน์",
+        "ไพศิษฐ์",
+        "ฟองสนาน",
+        "ภริดา",
+        "ภัทร",
+        "ภัทร",
+        "ภัทรวี",
+        "ภัทราคม",
+        "ภัทรียา",
+        "ภานุเดช",
+        "ภานุภาค",
+        "ภาวิตา",
+        "ภีรเดช",
+        "ภูมิไท",
+        "ภูมิพัฒน์",
+        "ภูมิ",
+        "มณฑิตา",
+        "มโน",
+        "มะบูรฮัน",
+        "มัณฑนา",
+        "มาธวี",
+        "มานพ",
+        "มาศดิตถ์",
+        "มาหะมะสายูตี",
+        "มิ่งขวัญ",
+        "มิตรศิลป์",
+        "มิรันตี",
+        "เมณฑกา",
+        "เมตตา",
+        "เมธินี",
+        "เมลิษา",
+        "เมษ",
+        "ยงยุทธ",
+        "ยรรยง",
+        "ยิ่งพันธ์",
+        "ยุทธนา",
+        "ยุวศิริ",
+        "โยฮัน",
+        "รวีภัทร์",
+        "รสสุคนธ์",
+        "รอแม",
+        "รังสิมาศ",
+        "รัชชาภร",
+        "รัชชา",
+        "รัชวิน",
+        "รัฐนันท์",
+        "รัมภ์รดา",
+        "เริงชัย",
+        "เรืองโรจน์",
+        "ฤทัย",
+        "ลักษณา",
+        "ลัดพลี",
+        "เลอศักดิ์",
+        "เลิศนภา",
+        "เลิศศักดิ์",
+        "ฦาไชย",
+        "วงศกร",
+        "วรพิศ",
+        "วรรณวรงค์",
+        "วรรณา",
+        "วรรณา",
+        "วรรษพร",
+        "วรวงค์",
+        "วรินทร",
+        "วรินทร",
+        "วรุธ",
+        "วศิน",
+        "วัฒนกร",
+        "วัฒนา",
+        "วันชัย",
+        "วัลลภ",
+        "วิจิตร",
+        "วิชชพัชร์",
+        "วิชัยยุตม์",
+        "วิชัย",
+        "วิทยา",
+        "วิภาวี",
+        "วิราภรณ์",
+        "วิรุฬห์รักษ์",
+        "วิษณุ",
+        "วิสิฐ",
+        "วีระพงษ์",
+        "วีระศักดิ์",
+        "ศจีพันธ์",
+        "ศรัณย์ทร",
+        "ศรีจิตรา",
+        "ศรีหล้า",
+        "ศศิวรรณ์",
+        "ศักดา",
+        "ศักดิ์ศิริ",
+        "ศิระรังษี",
+        "ศิริจิตร",
+        "ศิรินทร์ทิพย์",
+        "ศิริพร",
+        "ศิริพิชยา",
+        "ศิริวิมล",
+        "ศีลวัต",
+        "ศึกษา",
+        "ศุภดิตถ์",
+        "ศุภเดช",
+        "ศุภพงศ์",
+        "ศุรุท",
+        "เศรษฐศิริ",
+        "สกาวรัตน์",
+        "สดศรี",
+        "สนุก",
+        "สมพงษ์",
+        "สมพร",
+        "สมพล",
+        "สมภพ",
+        "สมรัตน์",
+        "สมหมาย",
+        "สมหวัง",
+        "สมัญญา",
+        "สมัย",
+        "สรสิทธิ์",
+        "สรุโฆษิต",
+        "สวรรยา",
+        "สันชัย",
+        "สันติ",
+        "สันติ",
+        "สาคร",
+        "สามารถ",
+        "สามารถ",
+        "สายทิพย์",
+        "สายัณห์",
+        "สาลินี",
+        "สาลูดิน",
+        "สาวนูรอนีย์",
+        "สำเร็จ",
+        "สำลี",
+        "สิครินทร์",
+        "สิทธิพงษ์",
+        "สิทธิหล่อ",
+        "สิทธีอมร",
+        "สิริพงษ์",
+        "สิริภาธร",
+        "สิริยากร",
+        "สิโรรส",
+        "สุกัญญา",
+        "สุจินันท์",
+        "สุชาดา",
+        "สุชีวะ",
+        "สุทธิชัย",
+        "สุทธิ",
+        "สุทัตตา",
+        "สุทาทิพย์",
+        "สุธรรม",
+        "สุธรรม",
+        "สุนทร",
+        "สุนิดา",
+        "สุนีย์",
+        "สุนีย์",
+        "สุพิชฌาย์",
+        "สุภเดช",
+        "สุภิญญา",
+        "สุภิษา",
+        "สุมล",
+        "สุรเกียรติ์",
+        "สุรพล",
+        "สุรภา",
+        "สุรางค์",
+        "สุริพล",
+        "สุวรรณ",
+        "สุวลักษณ์",
+        "สุวิชช์",
+        "สุวิชญ",
+        "สุวิชา",
+        "สุวิมล",
+        "สู่ขวัญ",
+        "เสมอกัน",
+        "เสริมคุณ",
+        "เสาวณี",
+        "เสาวภาพ",
+        "แสงสนิท",
+        "โสภา",
+        "หมอนชัย",
+        "หยุด",
+        "หรรษา",
+        "หฤหรรษ์",
+        "หลุยส์",
+        "หิรัญญา",
+        "อณัฐชัย",
+        "อดิสรณ์",
+        "อดิสรณ์",
+        "อธิรัตน์",
+        "อนันดา",
+        "อนันดา",
+        "อนันต์",
+        "อนิตษา",
+        "อนุมัติ",
+        "อนุรัตน์",
+        "อโนทัย",
+        "อภัสรดา",
+        "อภิชาต",
+        "อภิไท",
+        "อมรวิชช์",
+        "อมร",
+        "อมาลีนา",
+        "อรพรรณ",
+        "อรุโณชา",
+        "อ่องจริต",
+        "อ่อนสา",
+        "อ่อนอุษา",
+        "อังษณา",
+        "อัญชนา",
+        "อัฎฐพล",
+        "อับดุลบาซิร",
+        "อับดุลอาเด็ล",
+        "อัมพร",
+        "อัศม์เดนาย",
+        "อัษฎาวุธ",
+        "อาทิตยาพร",
+        "อาทิวราห์",
+        "อานีซะห์",
+        "อาภัสรา",
+        "อาภาภัทร",
+        "อิฐหรอเหม",
+        "อิทธิพงศ์",
+        "อุนนดา",
+        "เอกธนา",
+        "ไอยวริญท์",
+        "ฮัมเสียะ",
+        "ฮาวาติฟ",
+    )
 
     # last name that has given by senior officer
     # http://www.reurnthai.com/index.php?topic=5273.45
     last_names = (
-        "ดำริห์ชอบ", "ดวงทับทิม", "ดิศดใน", "ดัตพันธุ์", "ดุษฎีวนิช", "ดาบเพ็ชร์",
-        "ดิสกะประกาย", "เดชคุ้ม", "ดาวกระจาย", "ดาบเงิน", "ดีตพันธุ์", "ดุริยพันธุ์",
-        "ดาวอร่าม", "เดชวา", "ติระคมน์", "ไตรบรรพ", "ตระกูลบุญ", "เตมิยะเดช", "ตวงทอง",
-        "แต้กุล", "ตรีครุธพันธุ์", "ตัณฑนุช", "ตั้งกุลงาม", "ตระกูลไม้เรียง", "ตะละภัฏ",
-        "ตั้งเผ่า", "ตันเผ่า", "เตชะกำพุ", "ตัณสถิตย์", "ตราชู", "ตวันเยี่ยม",
+        "ดำริห์ชอบ",
+        "ดวงทับทิม",
+        "ดิศดใน",
+        "ดัตพันธุ์",
+        "ดุษฎีวนิช",
+        "ดาบเพ็ชร์",
+        "ดิสกะประกาย",
+        "เดชคุ้ม",
+        "ดาวกระจาย",
+        "ดาบเงิน",
+        "ดีตพันธุ์",
+        "ดุริยพันธุ์",
+        "ดาวอร่าม",
+        "เดชวา",
+        "ติระคมน์",
+        "ไตรบรรพ",
+        "ตระกูลบุญ",
+        "เตมิยะเดช",
+        "ตวงทอง",
+        "แต้กุล",
+        "ตรีครุธพันธุ์",
+        "ตัณฑนุช",
+        "ตั้งกุลงาม",
+        "ตระกูลไม้เรียง",
+        "ตะละภัฏ",
+        "ตั้งเผ่า",
+        "ตันเผ่า",
+        "เตชะกำพุ",
+        "ตัณสถิตย์",
+        "ตราชู",
+        "ตวันเยี่ยม",
         "ตรีเภรินทร์",
-        "ตันตราจิณ", "ตั้งรบ", "ถนัดกลึง", "ถนอมมนุษย์", "ถนัดอักษร", "ถนัดการยนต์",
-        "ถนัดหัดถกรรม", "ถาวรายุศม์", "ถนัดการเขียน", "ถาวรรัตน", "ถนัดพิมพการ",
+        "ตันตราจิณ",
+        "ตั้งรบ",
+        "ถนัดกลึง",
+        "ถนอมมนุษย์",
+        "ถนัดอักษร",
+        "ถนัดการยนต์",
+        "ถนัดหัดถกรรม",
+        "ถาวรายุศม์",
+        "ถนัดการเขียน",
+        "ถาวรรัตน",
+        "ถนัดพิมพการ",
         "ถ้วนศรี",
-        "ถนอมพล", "ถาวระวรณ์", "ถนัดรบ", "ถนอมกุลบุตร", "ถมปัด", "ถนัดภาษา",
+        "ถนอมพล",
+        "ถาวระวรณ์",
+        "ถนัดรบ",
+        "ถนอมกุลบุตร",
+        "ถมปัด",
+        "ถนัดภาษา",
         "ถนัดเดินข่าว",
-        "ถนัดรักษา", "ถนิมมาศ", "ถมังรักษสัตว์", "แถมธน", "ถะเกิงชศ", "ถิรสวัสดิ์",
-        "ถนัดอาวุธ", "ถุงเงิน", "ทุมะบุตร์", "ทองประดิฐ", "ทรงโกมล", "ทัศนสุทธิ",
+        "ถนัดรักษา",
+        "ถนิมมาศ",
+        "ถมังรักษสัตว์",
+        "แถมธน",
+        "ถะเกิงชศ",
+        "ถิรสวัสดิ์",
+        "ถนัดอาวุธ",
+        "ถุงเงิน",
+        "ทุมะบุตร์",
+        "ทองประดิฐ",
+        "ทรงโกมล",
+        "ทัศนสุทธิ",
         "ทหารแท้",
-        "ทองอยู่", "ทำประดู่", "ทรัพย์สาร", "ทีฆะ", "ทวนทอง", "ไทยสุชาต", "ทันยุค",
+        "ทองอยู่",
+        "ทำประดู่",
+        "ทรัพย์สาร",
+        "ทีฆะ",
+        "ทวนทอง",
+        "ไทยสุชาต",
+        "ทันยุค",
         "ไทนิยม",
-        "ทองลาภ", "ทองเนื้อดี", "ทองแท้", "ทวีเดช", "ทับทิมไทย", "ทองสินธุ์", "ไทไชโย",
-        "ทวนไชย์", "ทองสุกเลิศ", "ไทยแท้", "ทองสีไพล", "ธรรมนิยม", "ธนประทีป", "ธรรมเมธา",
-        "ธุวะนุติ์", "ธาราธร", "ธีวร", "ธัญเสถียร", "ธนูปกรณ์", "เธียรายัน", "ธรรมฤดี",
-        "ธัญาโภชน์", "ธนรักษ์", "ธูปะวิโรจน์", "ธูปหอม", "แนวพนิช", "นักสำหรวจ",
+        "ทองลาภ",
+        "ทองเนื้อดี",
+        "ทองแท้",
+        "ทวีเดช",
+        "ทับทิมไทย",
+        "ทองสินธุ์",
+        "ไทไชโย",
+        "ทวนไชย์",
+        "ทองสุกเลิศ",
+        "ไทยแท้",
+        "ทองสีไพล",
+        "ธรรมนิยม",
+        "ธนประทีป",
+        "ธรรมเมธา",
+        "ธุวะนุติ์",
+        "ธาราธร",
+        "ธีวร",
+        "ธัญเสถียร",
+        "ธนูปกรณ์",
+        "เธียรายัน",
+        "ธรรมฤดี",
+        "ธัญาโภชน์",
+        "ธนรักษ์",
+        "ธูปะวิโรจน์",
+        "ธูปหอม",
+        "แนวพนิช",
+        "นักสำหรวจ",
         "นฤทุกข์",
-        "นาฏคายี", "เนื่องนนท์", "น้ำทิพย์", "เนื้อนุ่ม", "นวลฉวี", "นาคพันธุ์", "นำธวัช",
-        "แน่นดุจป้อม", "เณรานุสนธิ์", "นามเสวตร", "นิษประปัญจ์", "นิระหานี", "นิลสุวรรณ์",
-        "นักรบ", "นิติสาขา", "นิยมธรรม", "นิลเสนา", "หนุนสุข", "นิลวิมล", "นฤภัย",
+        "นาฏคายี",
+        "เนื่องนนท์",
+        "น้ำทิพย์",
+        "เนื้อนุ่ม",
+        "นวลฉวี",
+        "นาคพันธุ์",
+        "นำธวัช",
+        "แน่นดุจป้อม",
+        "เณรานุสนธิ์",
+        "นามเสวตร",
+        "นิษประปัญจ์",
+        "นิระหานี",
+        "นิลสุวรรณ์",
+        "นักรบ",
+        "นิติสาขา",
+        "นิยมธรรม",
+        "นิลเสนา",
+        "หนุนสุข",
+        "นิลวิมล",
+        "นฤภัย",
         "นาถะเดชะ",
-        "นพตระกูล", "นิยมเซียม", "หนักแน่น", "นามขำ", "นานายน", "นับเนื่องนอ", "แนวพญา",
-        "นาถะพินธุ", "นิลสลัว", "นะวะมันดร", "นิลวรรณ", "เนตร์มณี", "นุตตาร",
+        "นพตระกูล",
+        "นิยมเซียม",
+        "หนักแน่น",
+        "นามขำ",
+        "นานายน",
+        "นับเนื่องนอ",
+        "แนวพญา",
+        "นาถะพินธุ",
+        "นิลสลัว",
+        "นะวะมันดร",
+        "นิลวรรณ",
+        "เนตร์มณี",
+        "นุตตาร",
         "นิยมสำหรวจ",
-        "นกทอง", "นุชแนวนุ่ม", "นาคสุทิน", "นพคเชนทร์", "นาคะนคร", "นิละทัต", "นาควงษ์",
-        "นากกนก", "บุนยาภิสนท์", "บุญญาภิรมย์", "บุณยะภาชน์", "บินดี", "บุนยะศัพท์",
-        "บุนยะตีรณะ", "บุญญาไลย์", "บุญบำรุง")
+        "นกทอง",
+        "นุชแนวนุ่ม",
+        "นาคสุทิน",
+        "นพคเชนทร์",
+        "นาคะนคร",
+        "นิละทัต",
+        "นาควงษ์",
+        "นากกนก",
+        "บุนยาภิสนท์",
+        "บุญญาภิรมย์",
+        "บุณยะภาชน์",
+        "บินดี",
+        "บุนยะศัพท์",
+        "บุนยะตีรณะ",
+        "บุญญาไลย์",
+        "บุญบำรุง",
+    )
 
     # thai suffix that has given by the king
     # https://th.wikipedia.org/wiki/%E0%B8%99%E0%B8%B2%E0%B8%A1%E0%B8%AA%E0%B8%81%E0%B8%B8%E0%B8%A5%E0%B8%9E%E0%B8%A3%E0%B8%B0%E0%B8%A3%E0%B8%B2%E0%B8%8A%E0%B8%97%E0%B8%B2%E0%B8%99
@@ -185,4 +808,5 @@ class Provider(PersonProvider):
         "ณ วิเชียร",
         "ณ สงขลา",
         "ณ หนองคาย",
-        "ณ อุบล")
+        "ณ อุบล",
+    )
diff --git a/faker/providers/phone_number/th_TH/__init__.py b/faker/providers/phone_number/th_TH/__init__.py
index 9c0ba036..d1f5eb65 100644
--- a/faker/providers/phone_number/th_TH/__init__.py
+++ b/faker/providers/phone_number/th_TH/__init__.py
@@ -2,7 +2,71 @@ from .. import Provider as PhoneNumberProvider
 
 
 class Provider(PhoneNumberProvider):
+    # as per https://en.wikipedia.org/wiki/Telephone_numbers_in_Thailand
     formats = (
-        '+66 #### ####',
-        '+668 #### ####',
+        # landline (9 digits, starts with 02, 03, 04, 05, or 07)
+        "+66 2### ####",
+        "+662 ### ####",
+        "+66 (0) 2### ####",
+        "02#######",
+        "0 2### ####",
+        "02# ######",
+        "02#-######",
+        "0-2###-####",
+        "02 ### ####",
+        "+66 3### ####",
+        "+663 ### ####",
+        "+66 (0) 3### ####",
+        "03#######",
+        "0 3### ####",
+        "03# ######",
+        "03#-######",
+        "0-3###-####",
+        "03 ### ####",
+        "+66 4### ####",
+        "+664 ### ####",
+        "+66 (0) 4### ####",
+        "04#######",
+        "0 4### ####",
+        "04# ######",
+        "04#-######",
+        "0-4###-####",
+        "04 ### ####",
+        "+66 5### ####",
+        "+665 ### ####",
+        "+66 (0) 5### ####",
+        "05#######",
+        "0 5### ####",
+        "05# ######",
+        "05#-######",
+        "0-5###-####",
+        "05 ### ####",
+        "+66 7### ####",
+        "+667 ### ####",
+        "+66 (0) 7### ####",
+        "07#######",
+        "0 7### ####",
+        "07# ######",
+        "07#-######",
+        "0-7###-####",
+        "07 ### ####",
+        # mobile (10 digits, starts with 06, 08, or 09)
+        "+66 6## ### ###",
+        "+66 (0) 6## ### ###",
+        "06########",
+        "0 6## ### ###",
+        "06# ### ####",
+        "06#-###-####",
+        "+66 8## ### ###",
+        "+66 (0) 8## ### ###",
+        "08########",
+        "0 8## ### ###",
+        "08# ### ####",
+        "08#-###-####",
+        "+66 9## ### ###",
+        "+66 (0) 9## ### ###",
+        "09########",
+        "0 9## ### ###",
+        "09# ### ####",
+        "09#-###-####",
     )


Test patch:
diff --git a/tests/providers/test_address.py b/tests/providers/test_address.py
index 0aa21db7..802a6082 100644
--- a/tests/providers/test_address.py
+++ b/tests/providers/test_address.py
@@ -31,6 +31,7 @@ from faker.providers.address.pt_BR import Provider as PtBrAddressProvider
 from faker.providers.address.pt_PT import Provider as PtPtAddressProvider
 from faker.providers.address.ru_RU import Provider as RuRuAddressProvider
 from faker.providers.address.ta_IN import Provider as TaInAddressProvider
+from faker.providers.address.th_TH import Provider as ThThAddressProvider
 from faker.providers.address.zh_CN import Provider as ZhCnAddressProvider
 from faker.providers.address.zh_TW import Provider as ZhTwAddressProvider
 
@@ -1409,3 +1410,19 @@ class TestRuRu:
         with title_patch, suffix_patch:
             result = faker.street_name()
             assert result == expected
+
+
+class TestThTh:
+    """Test th_TH address provider methods"""
+
+    def test_country(self, faker, num_samples):
+        for _ in range(num_samples):
+            country = faker.country()
+            assert isinstance(country, str)
+            assert country in ThThAddressProvider.countries
+
+    def test_postcode(self, faker, num_samples):
+        for _ in range(num_samples):
+            postcode = faker.postcode()
+            assert isinstance(postcode, str)
+            assert re.fullmatch(r'[1-9]\d{4}', postcode)
diff --git a/tests/providers/test_person.py b/tests/providers/test_person.py
index eaee9165..a90ae978 100644
--- a/tests/providers/test_person.py
+++ b/tests/providers/test_person.py
@@ -21,6 +21,7 @@ from faker.providers.person.ru_RU import Provider as RuProvider
 from faker.providers.person.ru_RU import translit
 from faker.providers.person.sv_SE import Provider as SvSEProvider
 from faker.providers.person.ta_IN import Provider as TaINProvider
+from faker.providers.person.th_TH import Provider as ThThProvider
 from faker.providers.person.zh_CN import Provider as ZhCNProvider
 from faker.providers.person.zh_TW import Provider as ZhTWProvider
 
@@ -320,6 +321,40 @@ class TestCsCZ(unittest.TestCase):
         assert last_name in CsCZProvider.last_names_female
 
 
+class TestThTh(unittest.TestCase):
+    """ Tests person in the th_TH locale """
+
+    def setUp(self):
+        self.fake = Faker('th_TH')
+        Faker.seed(0)
+
+    def test_first_name(self):
+        # General first name
+        name = self.fake.first_name()
+        assert name
+        self.assertIsInstance(name, str)
+        assert name in ThThProvider.first_names
+
+    def test_last_name(self):
+        # There's no gender-specific last name in Thai.
+        assert not hasattr(ThThProvider, 'last_names_male')
+        assert not hasattr(ThThProvider, 'last_names_female')
+        # All last names apply for all genders.
+        assert hasattr(ThThProvider, 'last_names')
+
+        # General last name.
+        name = self.fake.last_name()
+        assert name
+        self.assertIsInstance(name, str)
+        assert name in ThThProvider.last_names
+
+    def test_name(self):
+        # Full name
+        name = self.fake.name()
+        assert name
+        self.assertIsInstance(name, str)
+
+
 class TestZhCN(unittest.TestCase):
 
     def setUp(self):
diff --git a/tests/providers/test_phone_number.py b/tests/providers/test_phone_number.py
index 3ff20508..952e3259 100644
--- a/tests/providers/test_phone_number.py
+++ b/tests/providers/test_phone_number.py
@@ -82,8 +82,16 @@ class TestHuHu:
 class TestThTh:
     """Test th_TH phone number provider methods"""
 
-    def test_phone_number_should_be_in_defined_format(self, faker, num_samples):
-        pattern = re.compile(r'\+668? \d{4} \d{4}')
+    def test_phone_number(self, faker, num_samples):
+        pattern = re.compile(
+            # leading zero or internaional code
+            r'((\+66)|\+66[ -]?\(0\)|0)[ -]?'
+            # landline or mobile
+            r'([23457][ -]?(\d[ -]?){6}\d|[689][ -]?(\d[ -]?){7}\d)'
+            # extension
+            r'([ ]?(x|ext|ต่อ)[\.]?[ ]?\d{1,5})?',
+            re.IGNORECASE,
+        )
         for _ in range(num_samples):
             phone_number = faker.phone_number()
             assert isinstance(phone_number, str)