φυβλαςのβλογ
phyblas的博客



แปลงภาษาญี่ปุ่นเป็นโรมาจิด้วย pykakasi
เขียนเมื่อ 2017/01/24 17:07
แก้ไขล่าสุด 2021/09/28 16:42
คงมีบ่อยครั้งที่เวลาใช้ตัวหนังสือที่เขียนเป็นอักษรต่างๆที่ไม่ได้เป็นอักษรโรมันแล้วเกิดปัญหาเวลาใช้งานในคอมหรือโปรแกรมแกรมต่างๆในบางกรณี

ในเวลาแบบนี้ถ้าสามารถแปลงตัวอักษรเป็นอักษรโรมันเพื่อให้สามารถใช้งานได้ทุกที่ไม่มีปัญหาน่าจะดีกว่า

ในการแปลงเป็นอักษรโรมันนั้นสำหรับภาษาญี่ปุ่นหากเป็นอักษรคาตาคานะหรือฮิรางานะละก็สามารถทำได้ง่ายได้สบายมาก คงสามารถเขียนโปรแกรมแปลงเองได้ไม่ยาก เพราะมีหลักตายตัวอยู่แล้ว

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

ดังนั้นจึงมีคนทำโปรแกรมแปลงที่ชื่อ kakasi ขึ้นมาเพื่อใช้ถอดเสียงอ่านอย่างเป็นระบบ

ชื่อ kakasi มาจากคำว่า คาคาชิ (カカシ) เป็นภาษาญี่ปุ่น แปลว่าหุ่นไล่กา (ภาพข้างล่างนี้ไม่ได้มีความเกี่ยวข้องแต่อย่างใด)



เว็บของ kakasi >> http://kakasi.namazu.org/index.html.ja

kakasi ถูกทำเป็นไลบรารีสำหรับใช้ใสหลายภาษา เช่น C perl ruby สำหรับในไพธอนใช้ชื่อว่า pykakasi

สำหรับวิธีการติดตั้งนั้น ไม่ใช่ว่าแค่พิมพ์ pip ไปเฉยๆแบบนี้
pip install pykakasi

ถ้าทำแบบนั้นแม้จะติดตั้งได้โดยไม่มีปัญหาแต่พอใช้จริงๆจะติดปัญหา ใช้งานไม่ได้

ที่ถูกต้องคือต้องพิมพ์เป็น
pip install git+https://github.com/miurahr/pykakasi

แบบนี้จึงจะใช้ได้ไม่มีปัญหา

จากนั้นลองเริ่มทำการใช้งาน ขอเริ่มจากยกตัวอย่างการใช้
import pykakasi.kakasi as kakasi
kakasi = kakasi() # สร้างอินสแตนซ์

kakasi.setMode('H','a') # ตั้งให้แปลงฮิรางานะเป็นโรมาจิ
kakasi.setMode('K','a') # ตั้งให้แปลงคาตาคานะเป็นโรมาจิ
kakasi.setMode('J','a') # ตั้งให้แปลงคันจิเป็นโรมาจิ
kakasi.setMode('E','a') # ตั้งให้แปลงสัญลักษณ์เป็นแบบสากล
kakasi.setMode('r','Hepburn') # ตั้งให้ใช้เกณฑ์ของ Hepburn ในการทับศัพท์
kakasi.setMode('s', 1) # ตั้งให้มีการเว้นวรรคระหว่างคำ
kakasi.setMode('C', 1) # ตั้งให้เปลี่ยนอักษรตัวแรกเป็นตัวพิมพ์ใหญ่
romaji = kakasi.getConverter().do # สร้างฟังก์ชันแปลง
print(romaji('敷かれたレールになんか、あたしは興味がないんだもん!道は自分で切り開くからこそ価値があるんだよ!'))

(ที่มาของข้อความ http://hinaboshi.com/walidet/724479827570791)



ผลลัพธ์ที่ได้
Shika reta re-ru ninanka, atashiha Kyoumi ganaindamon !Michi ha Jibun de Kiri Hiraku karakoso Kachi gaarundayo !

จะเห็นว่าขั้นตอนการใช้ก็คือ
1. import มอดูล
2. สร้านอินสแตนซ์ของตัวแปลงขึ้นมา
3. ตั้งโหมดรูปแบบต่างๆให้เป็นไปตามที่ต้องการ
4. สร้างฟังก์ชันแปลงขึ้นมา
5. นำฟังก์ชันแปลงนั้นมาใช้แปลง

อนึ่ง สำหรับไพธอน 2 นั้นให้ระวังว่าสายอักขระที่ใช้จะต้องเป็นยูนิโค้ด คือต้องเติม u นำหน้าด้วย ไม่เช่นนั้นจะไม่ทำงาน

สำหรับในส่วนตั้งค่า ๔ บรรทัดแรกนั้นคือตัวที่กำหนดว่าอักษรไหนจะแปลงเป็นอะไร โดยตัวซ้ายคือตัวตั้งต้น ขวาคือตัวที่ได้ ในที่นี้ความหมายของอักษรย่อก็คือ
H ฮิรางานะ สามารถแปลงเป็นโรมาจิ (a) หรือคาตาคานะ (K)
K คาตาคานะ สามารถแปลงเป็นโรมาจิ (a) หรือฮิรางานะ (H)
J คันจิ สามารถแปลงเป็นโรมาจิ (a) หรือคาตาคานะ (K) หรือฮิรางานะ (H)
E สัญลักษณ์ ถ้าตั้งเป็น a จะหมายความว่าแปลงสัญลักษณ์แบบญี่ปุ่น เช่น 、・「」『』 ไปเป็น ,・()()

ในที่นี้ต้องการแปลงเป็นโรมาจิทั้งหมดจึงเขียนเป็น a ทั้งหมด แต่จะแปลงคันจิเป็นคาตาคานะหรือฮิรางานะก็ได้เช่นกัน เช่น
kakasi.setMode('H','H') # ตั้งให้ไม่ต้องแปลงฮิรางานะ
kakasi.setMode('K','H') # ตั้งให้แปลงคาตาคานะเป็นฮิรางานะ
kakasi.setMode('J','H') # ตั้งให้แปลงคันจิเป็นฮิรางานะ
romaji = kakasi.getConverter().do
print(romaji('彼女にフラグを折られたら'))

ได้
かのじょ にふらぐ をおら れたら

ส่วน ๓ บรรทัดที่เหลือเป็นแฟล็ก
r เกณฑ์การทับศัพท์ มี ๓ แบบให้เลือกคือ Hepburn,Kunrei,Passport
s จะเว้นวรรคระหว่างคำหรือไม่ (0=False, 1=True)
C จะให้ตัวแรกเป็นพิมพ์ใหญ่หรือไม่ (0=False, 1=True)

ลองมาดูความแตกต่างระหว่างระบบการทับศัพท์แบบต่างๆ
s = 'しじ、ちぢ、つづ、ふヴ、しゃしゅしょ、ツァシェ、ヴァふぉウォを、ゐゑ'
kakasi.setMode('H','a')
kakasi.setMode('K','a')
kakasi.setMode('r','Hepburn')
romaji = kakasi.getConverter().do
print(romaji(s))
kakasi.setMode('r','Kunrei')
romaji = kakasi.getConverter().do
print(romaji(s))
kakasi.setMode('r','Passport')
romaji = kakasi.getConverter().do
print(romaji(s))

ได้
shiji, chiji, tsuzu, fu vu, shashusho, tsuashie, va fo uo wo, ie
sizi, tizi, tuzu, fu vu, syasyusyo, tuasie, va fo uo wo, ie
shiji, chiji, tsuzu, fu bu, shashusho, tsuashie, bua fuo uo wo, ie

เท่าที่ดูปัญหาที่ยังเป็นอยู่ไม่ว่าจะใช้ระบบไหนก็คือ
- を กลายเป็น wo แทนที่จะเป็น o
- ウォ กลายเป็น uo แทนที่จะเป็น wo
- ツァ กลายเป็น tsua หรือ tua แทนที่จะเป็น tsa
- シェ กลายเป็น shie หรือ sie แทนที่จะเป็น she
- は กลายเป็น ha เสมอ แม้จะใช้เป็นคำช่วยก็ไม่เป็น wa
- へ กลายเป็น he เสมอ แม้จะใช้เป็นคำช่วยก็ไม่เป็น e

แต่ถ้ารู้ว่าตรงไหนที่มีปัญหาก็แค่เอามาแปลงต่ออีกทีให้เป็นแบบที่ตัวเองต้องการก็พอ มาถึงขั้นนี้ก็ทำต่อได้ไม่ยากอยู่แล้ว



ส่วนปัญหาเรื่องคันจินั้นยิ่งมีมาก คันจิที่อ่านได้หลายแบบ และที่เป็นข้อยกเว้นต่างๆก็มีเยอะ ไม่อาจแปลงได้สมบูรณ์

ยิ่งพวกชื่อบุคคลต่างๆยิ่งไม่สามารถทำให้ถูกต้องได้ เช่น
print(romaji('雨宮天')) # ได้ Amemiya Ten แต่ที่ถูกต้องคือ Amamiya Sora

เพียงแต่ว่าหากเป็นบุคคลที่มีชื่อเสียงมากในประวัติศาสตร์ก็อาจจะถูกแปลงถูกต้อง
print(romaji('夏目 漱石')) # ได้ Natsume  Souseki
print(romaji('愛新覚羅溥儀')) # ได้ Ai Shin Kaku Ra Fu Gi

แต่บางชื่อดูเหมือนว่าจะต้องเขียนชื่อนามสกุลติดกัน ไม่เช่นนั้นก็ผิดอยู่ดี
print(romaji('土方歳三')) # ได้ Hijikatatoshizou (ถูกต้อง)
print(romaji('土方 歳三')) # ได้ Dokata  Toshi San (ผิด)

ดังนั้นแล้วหากเจอพวกชื่อเฉพาะยังไงก็ยังคงต้องมาเพิ่มเติมเองเพื่อแก้ให้ถูกต้องจริงๆอยู่ดี



แม้จะไม่ได้แปลงถูกต้องสมบูรณ์ทั้งหมดแต่โดยรวมแล้วก็ใช้ได้ ดังนั้นก็พอจะนำมาใช้ประโยชน์ได้ดีทีเดียว แบบนี้ก็ทำให้แม้แต่คนที่ไม่เป็นภาษาญี่ปุ่น ไม่รู้คันจิเลยก็สามารถพอรู้ได้ว่ามันควรจะอ่านว่ายังไง

สำหรับวิธีการอ่านออกเสียงโรมาจิและทับศัพท์เป็นภาษาไทยหน้านี้ได้ https://phyblas.hinaboshi.com/20130109



อ้างอิง
http://pythonskywalker.hatenablog.com/entry/2016/10/20/094509
http://qiita.com/almichest/items/52f871ee22e4a44346d4


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python
-- ภาษาศาสตร์ >> ภาษาญี่ปุ่น

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  查看日志

  推荐日志

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ