Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update Peter Norvig's spell checker to suggest words based on probability #137

Merged
merged 19 commits into from
Oct 29, 2018

Conversation

bact
Copy link
Member

@bact bact commented Oct 25, 2018

ใช้วิธีดึง (คำ, ความถี่) มาจาก Thai National Corpus (TNC) เพื่อสร้างรายการคำสำหรับคำนวณความน่าจะเป็น

คำ "สะกดผิด" ใน TNC และวิธีแก้ไข

เนื่องจาก TNC มีขนาดใหญ่มาก จึงมีคำที่อาจไม่ได้เป็นคำที่พบทั่วไป หรือใช้ตัวสะกดตามพจนานุกรม

  • วิธีหนึ่ง (1) ที่เป็นไปได้เพื่อแก้ไขปัญหา คือเอารายการคำจาก TNC มาเทียบกับรายการคำที่เรามั่นใจว่าสะกดถูกแน่ๆ แล้วดึงมาเฉพาะคำที่มีอยู่ในทั้ง 2 รายการ แต่ก็จะทำให้จำนวนคำที่ได้น้อยลง (เป็นไปได้ว่า precision จะสูงขึ้น แต่ recall จะต่ำลง)

  • อีกวิธี (2) คือ ไปใช้ Thai Textbook Corpus (TTC) แทน ซึ่งจะเป็นคำที่เป็นทางการกว่า

  • วิธีที่ใช้ในปัจจุบัน (3) คือ ใช้ TNC ตามที่ดึงมาได้ แล้วกรองเอาคำจำนวนหนึ่งออกไป เพื่อให้มีเฉพาะคำที่น่าจะเป็นประโยชน์ต่อการแก้ไขคำผิด

    • คำมีความถี่ต่ำกว่าหรือเท่ากับ 1 ตัดทิ้ง
    • คำยาวกว่า 40 ตัวอักษร ตัดทิ้ง
    • คำมีตัวเลข ตัดทิ้ง
    • คำมีอักษรนอกจากภาษาไทยและจุด ตัดทิ้ง
    • คำเริ่มต้นด้วยจุด ตัดทิ้ง
  • วิธีที่ (3) นี้ จากการดูด้วยตาคร่าวๆ พบว่าคำที่มีความถี่เท่ากับ 2 มีทั้งคำที่สะกดผิดและถูก แต่โดยรวมแล้วคุณภาพน่าจะใช้ได้ โดยคาดหวังว่าคำที่สะกดถูกที่มี edit distance เดียวกันจะมีความถี่มากกว่า ทำให้ปัญหาไม่น่าจะมีมากนัก

    • อย่างไรก็ตาม ถ้าเป็นคำที่มี exact match ใน corpus ตัว spell() จะคืนค่านั้นค่าเดียวทันที โดยไม่สนใจ edit distance เช่น คำว่า "กัต" (ปรากฏใน TNC 115 ครั้ง)

ตัวอย่างคำและความถี่ที่พบใน TNC:

๒๕๔๘ 452
๑๕๐ 441
๒๕๔๗ 372
_______________________________ 48
วิทยาศาสตร์เทคโนโลยีและสิ่งแวดล้อม 10
งงงงงงงงงงงงงงงงงงงงงง 2
ม่อต้อ 2
ตลกหัวเราะ 2
เทรอซ์ 2
ยุกติธรรม 2
โหรสพ 2
ยยยยยยยยยยยยยยย 2
ปากขม 2
เจริญสมณธรรม 2
ลองเพลย์ 2
เตตียม 2
นั่งทางใน 2
ลิคเตนสไตน์ 2
มวยหมู่ 2
ข้าวนก 2
กะบ่อนกะแบ่น 2
เสิรฟ์ 2
66-70-73 2
Directors 2
.สำหรับชาวไทยมุสลิมในสี่จังหวัดภาคใต้ซึ่งยิ่งด้อยการศึกษาเป็นส่วนมากไม่ใช่เป็นเรื่องง่าย 1
.ได้ชี้แจงกับกลุ่มการเมืองว่าช่วงเวลา 1
.ต.ท.ทักษิณและให้การต้อนรับรัฐบาลของตนถึงสองครั้งสองคราทำไมการเดินทางของ 1

Update from PyThaiNLP origin
… on probability (as suggested in issue #90 )

- use word frequencies from Thai National Corpus
@wannaphong wannaphong added this to the 1.8 milestone Oct 25, 2018
_WORDS_TOTAL = sum(_WORDS.values())


def _prob(word, n=_WORDS_TOTAL):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ฟังก์ชันนี้จะเก็บไว้ไหมครับ ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ต้องใช้ _prob() สำหรับเป็น sort key ใน correction() ครับ ต้องเก็บไว้ครับ

@wannaphong
Copy link
Member

ผมกด Merge ได้เลยไหมครับ @bact

@bact
Copy link
Member Author

bact commented Oct 29, 2018

@wannaphongcom ถ้ารีวิวแล้วโอเค merge ได้เลยครับ

ผมเพิ่มคลาส NorvigSpellChecker เข้าไป เพื่อให้เพิ่มพจนานุกรมได้เองครับ

@wannaphong wannaphong merged commit c148699 into PyThaiNLP:dev Oct 29, 2018
@bact
Copy link
Member Author

bact commented Oct 29, 2018

ขอบคุณครับ :)

@wannaphong wannaphong mentioned this pull request Nov 3, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants