Skip to content

Instantly share code, notes, and snippets.

@wannaphong
Forked from korakot/LK82.py
Last active June 29, 2017 04:29
Show Gist options
  • Save wannaphong/f65f5da55a5cfa62bb96eff816338b43 to your computer and use it in GitHub Desktop.
Save wannaphong/f65f5da55a5cfa62bb96eff816338b43 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.ลบวรรณยุกต์
if re.search("[ก-ฮ][ิุู]?์",s):
# 4.ลบการันต์
# เนื่องจากภาษาไทยมีตัวการ์รันต์ เช่น ตร์ ทร์ ดร์ อยู่ด้วย จึงต้องเอาออกไปด้วย
if re.search("ตร์",s):
s = re.sub("ตร์","",s)
elif re.search("ทร์",s):
s = re.sub("ทร์","",s)
elif re.search("ดร์",s):
s = re.sub("ทร์","",s)
else:
s = re.sub("[ก-ฮ][ิุู]?์", "", s)
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(c) and (c[i+1] in "ึืุู"):
res.append(c.translate(t2))
elif c in 'รวยฤฦ':
if i_v == i-1 or (i+1<len(c) and (c[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
@korakot
Copy link

korakot commented Jun 29, 2017

ปรับ code ให้สั้นลงนะครับ จาก

    if re.search("[ก-ฮ][ิุู]?์",s):
      # 4.ลบการันต์
      # เนื่องจากภาษาไทยมีตัวการ์รันต์ เช่น ตร์ ทร์  ดร์ อยู่ด้วย จึงต้องเอาออกไปด้วย
      if re.search("ตร์",s):
        s = re.sub("ตร์","",s)
      elif re.search("ทร์",s):
        s = re.sub("ทร์","",s)
      elif re.search("ดร์",s):
        s = re.sub("ทร์","",s)
      else:
        s = re.sub("[ก-ฮ][ิุู]?์", "", s)

เป็น
s = re.sub("[ตทด]ร์|[ก-ฮ][ิุู]?์", "", s)

แต่จริงๆ ใช้กฎข้อ 6. ของ Udom83 จะเหมาะที่สุด
s = re.sub('จน์|มณ์|ณฑ์|ทร์|ตร์|[ก-ฮ]์|[ก-ฮ][ะ-ู]์', "", s) # 6.

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