Skip to content

Instantly share code, notes, and snippets.

@korakot
Last active April 13, 2020 04:16
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save korakot/0b772e09340cac2f493868da035597e8 to your computer and use it in GitHub Desktop.
Save korakot/0b772e09340cac2f493868da035597e8 to your computer and use it in GitHub Desktop.
Thai Soundex LK82, Udom83
# ตาม guru.sanook.com/1520
import re
t1 = str.maketrans("กขฃคฅฆงจฉชฌซศษสญยฎดฏตณนฐฑฒถทธบปผพภฝฟมรลฬฤฦวหฮอ",
"กกกกกกงจชชชซซซซยยดดตตนนททททททบปพพพฟฟมรรรรรวหหอ")
t2 = str.maketrans(
"กขฃคฅฆงจฉชซฌฎฏฐฑฒดตถทธศษสญณนรลฬฤฦบปพฟภผฝมำยวไใหฮาๅึืเแโุูอ",
"1111112333333333333333333444444445555555667777889AAABCDEEF")
def LK82(s):
res = []
s = re.sub("[่-๋]", "", s) # 4.ลบวรรณยุกต์
s = re.sub("[ก-ฮ][ิุู]?์", "", s) # 4.ลบการันต์
s = re.sub("[็ํฺๆฯ]", "", s) # 5.ทิ้งไม้ไต่คู่ ฯลฯ
# 6.เข้ารหัสตัวแรก
if 'ก'<=s[0]<='ฮ':
res.append(s[0].translate(t1))
s = s[1:]
else:
res.append(s[1].translate(t1))
res.append(s[0].translate(t2))
s = s[2:]
# เข้ารหัสตัวที่เหลือ
i_v = None # ตำแหน่งตัวคั่นล่าสุด (สระ)
for i,c in enumerate(s):
if c in "ะัิี": # 7. ตัวคั่นเฉยๆ
i_v = i
res.append('')
elif c in "าๅึืู": # 8.คั่นและใส่
i_v = i
res.append(c.translate(t2))
elif c == 'ุ': # 9.สระอุ
i_v = i
if i==0 or (s[i-1] not in "ตธ"):
res.append(c.translate(t2))
else:
res.append('')
elif c in 'หอ':
if i+1<len(s) and (s[i+1] in "ึืุู"):
res.append(c.translate(t2))
elif c in 'รวยฤฦ':
if i_v == i-1 or (i+1<len(s) and (s[i+1] in "ึืุู")):
res.append(c.translate(t2))
else:
res.append(c.translate(t2)) # 12.
# 13. เอาตัวซ้ำออก
res2 = [res[0]]
for i in range(1, len(res)):
if res[i] != res[i-1]:
res2.append(res[i])
# 14. เติมศูนย์ให้ครบ ถ้าเกินก็ตัด
return ("".join(res2)+"0000")[:5]
# ตาม https://sites.google.com/site/knowledgecomplex/porkaerm-kar-subkhn-kha-thiy-tam-seiyng-xan-thai-soundex
import re
tu1 = str.maketrans("กขฃคฅฆงจฉชฌซศษสฎดฏตฐฑฒถทธณนบปผพภฝฟมญยรลฬฤฦวอหฮ"
,"กขขขขขงจชชชสสสสดดตตททททททนนบปพพพฟฟมยยรรรรรวอฮฮ")
tu2 = str.maketrans("มวำกขฃคฅฆงยญณนฎฏดตศษสบปพภผฝฟหอฮจฉชซฌฐฑฒถทธรฤลฦ"
,"0001111112233344444445555666666777778888889999")
def Udom83(s):
s = re.sub('รร([เ-ไ])', 'ัน\\1', s) # 4.
s = re.sub('รร([ก-ฮ][ก-ฮเ-ไ])', 'ั\\1', s) # 5.
s = re.sub('รร([ก-ฮ][ะ-ู่-์])','ัน\\1', s)
s = re.sub('รร', 'ัน', s)
s = re.sub('ไ([ก-ฮ]ย)', '\\1', s) # 2.
s = re.sub('[ไใ]([ก-ฮ])','\\1ย', s)
s = re.sub('ำ(ม[ะ-ู])', 'ม\\1', s) # 3.
s = re.sub('ำม', 'ม', s)
s = re.sub('ำ', 'ม', s)
s = re.sub('จน์|มณ์|ณฑ์|ทร์|ตร์|[ก-ฮ]์|[ก-ฮ][ะ-ู]์', "", s) # 6.
s = re.sub('[ะ-์]', '', s) # 7.
sd = s[0].translate(tu1)
sd += s[1:].translate(tu2)
return (sd+'000000')[:7]
# มีปัญหา กับ กรรไกร ที่ ไ โดนแปลงไป ทำให้ รร ไม่ได้
# จึงต้องย้าย 4-5 ขึ้นไปก่อน 1
@wannaphong
Copy link

wannaphong commented Jun 25, 2017

ผมแก้ไขตรงตัวการ์รันต์ใน LK82.py ครับ เพราะเนื่องจากภาษาไทยมีตัวการ์รันต์ เช่น ตร์ ทร์ ดร์ อยู่ด้วย จึงต้องเอาออกไปด้วยครับ https://gist.github.com/wannaphongcom/f65f5da55a5cfa62bb96eff816338b43#file-lk82-py

@korakot
Copy link
Author

korakot commented Jun 29, 2017

งั้นเปลี่ยนมาใช้กฎข้อ 6 ของ Udom83 แทนสิครับ
s = re.sub('จน์|มณ์|ณฑ์|ทร์|ตร์|[ก-ฮ]์|[ก-ฮ][ะ-ู]์', "", s)

@n9ti
Copy link

n9ti commented Dec 12, 2017

พอจะแนะนำการเอา algorithm นี้ไปใช้งานให้หน่อยได้ไหมครับ ว่าต้องเอาไปใช้งานอย่างไร
คือที่สงสัยก็คือ เวลาใช้นี้ต้องเลือกเอาระหว่าง LK82 กับ Udom83 หรือว่าต้องใช้งานร่วมกันครับ
พอจะมีตัวอย่างการนำไปใช้งานให้ดูหน่อยได้ไหมครับ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment