Saya memiliki string Unicode dengan Python, dan saya ingin menghapus semua aksen (diakritik).
Saya temukan di Web cara yang elegan untuk melakukan ini di Jawa:
- mengonversi string Unicode ke bentuk normalnya yang panjang (dengan karakter terpisah untuk huruf dan diakritik)
- hapus semua karakter yang jenis Unicode-nya "diakritik".
Apakah saya perlu menginstal perpustakaan seperti pyICU atau apakah ini mungkin hanya dengan perpustakaan standar python? Dan bagaimana dengan python 3?
Catatan penting: Saya ingin menghindari kode dengan pemetaan eksplisit dari karakter beraksen ke mitra non-aksen mereka.
python
python-3.x
unicode
python-2.x
diacritics
MiniQuark
sumber
sumber
unidecode
menggantikan°
dengandeg
. Itu lebih dari sekadar menghilangkan aksen.Bagaimana dengan ini:
Ini juga berfungsi pada huruf yunani:
The kategori karakter "Mn" singkatan
Nonspacing_Mark
, yang mirip dengan unicodedata.combining dalam jawaban MiniQuark (saya tidak memikirkan unicodedata.combining, tetapi mungkin adalah solusi yang lebih baik, karena lebih eksplisit).Dan perlu diingat, manipulasi ini dapat secara signifikan mengubah makna teks. Aksen, Umlaut, dll. Bukan "hiasan".
sumber
unicodedata.name
, atau mendobrak dan menggunakan meja yang mirip - yang Anda perlukan untuk huruf-huruf Yunani (Α hanyalah "GREAT CAPITAL LETTER ALPHA").A
. Jika tidak mau, jangan lakukan itu, tetapi dalam kedua kasus Anda mengganti bahasa Latin (hampir sama).ß
menjadi asciiss
sebagai contoh. Saya masih akan menggunakanunidecode
untuk menghindari kecelakaan.Saya baru saja menemukan jawaban ini di Web:
Ini berfungsi dengan baik (untuk Perancis, misalnya), tapi saya pikir langkah kedua (menghapus aksen) dapat ditangani lebih baik daripada menjatuhkan karakter non-ASCII, karena ini akan gagal untuk beberapa bahasa (Yunani, misalnya). Solusi terbaik mungkin akan secara eksplisit menghapus karakter unicode yang ditandai sebagai diakritik.
Sunting : ini berguna:
unicodedata.combining(c)
akan mengembalikan true jika karakterc
dapat dikombinasikan dengan karakter sebelumnya, terutama jika itu diakritik.Sunting 2 :
remove_accents
mengharapkan string unicode , bukan string byte. Jika Anda memiliki string byte, maka Anda harus mendekodekannya menjadi string unicode seperti ini:sumber
nkfd_form = unicodedata.normalize('NFKD', unicode(input_str, 'utf8'))
, 'utf8'
adalah "jaring pengaman" yang diperlukan jika Anda menguji input di terminal (yang secara default tidak menggunakan unicode). Tetapi biasanya Anda tidak perlu menambahkannya, karena jika Anda menghapus aksen makainput_str
sangat mungkin utf8. Tidak ada ruginya untuk aman.remove_accents
alih-alih string biasa (u "é" bukannya "é"). Anda meneruskan string biasa keremove_accents
, jadi ketika mencoba mengkonversi string Anda ke string unicode,ascii
pengkodean default digunakan. Pengkodean ini tidak mendukung byte yang nilainya> 127. Ketika Anda mengetik "é" di shell Anda, OS Anda menyandikannya, mungkin dengan UTF-8 atau beberapa pengkodean Halaman Kode Windows, dan itu termasuk byte> 127. Saya akan mengubah fungsi saya untuk menghapus konversi ke unicode: itu akan mengebom lebih jelas jika string non-unicode dilewatkan.Sebenarnya saya bekerja pada proyek yang kompatibel dengan python 2.6, 2.7 dan 3.4 dan saya harus membuat ID dari entri pengguna gratis.
Terima kasih kepada Anda, saya telah membuat fungsi ini bekerja sangat baik.
hasil:
sumber
text = unicode(text, 'utf-8')
. Solusi untuk itu adalah menambahkanexcept TypeError: pass
Ini tidak hanya menangani aksen, tetapi juga "guratan" (seperti pada ø dll.):
Ini adalah cara paling elegan yang dapat saya pikirkan (dan telah disebutkan oleh alexis dalam komentar di halaman ini), walaupun saya pikir itu tidak terlalu elegan. Sebenarnya, ini lebih merupakan peretasan, seperti yang ditunjukkan dalam komentar, karena nama Unicode - benar-benar hanya nama, mereka tidak memberikan jaminan untuk konsisten atau apa pun.
Masih ada surat khusus yang tidak ditangani oleh ini, seperti surat yang dibalik dan terbalik, karena nama unicode mereka tidak mengandung 'WITH'. Tergantung pada apa yang ingin Anda lakukan. Saya kadang-kadang membutuhkan aksen stripping untuk mencapai urutan kamus.
CATATAN EDIT:
Memasukkan saran dari komentar (menangani kesalahan pencarian, kode Python-3).
sumber
unicode
pemanggilan fungsi di sana dengan python 3? Saya pikir regex yang lebih ketat di tempatfind
akan menghindari semua masalah yang disebutkan dalam komentar di atas, dan juga, memoisasi akan membantu kinerja ketika itu jalur kode kritis.unicode
typecast tidak lagi yang sesuai dengan Python 3. Dalam kasus apapun, dalam pengalaman saya tidak ada yang universal, solusi elegan untuk masalah ini. Tergantung pada aplikasi, pendekatan apa pun memiliki pro dan kontra. Alat yang berkembang pesat sepertiunidecode
didasarkan pada tabel kerajinan tangan. Beberapa sumber daya (tabel, algoritma) disediakan oleh Unicode, misalnya. untuk pemeriksaan.Menanggapi jawaban @ MiniQuark:
Saya mencoba membaca dalam file csv yang setengah-Perancis (mengandung aksen) dan juga beberapa string yang akhirnya akan menjadi bilangan bulat dan mengapung. Sebagai ujian, saya membuat
test.txt
file yang terlihat seperti ini:Saya harus memasukkan baris
2
dan3
membuatnya bekerja (yang saya temukan di tiket python), serta memasukkan komentar @ Jabba:Hasil:
(Catatan: Saya menggunakan Mac OS X 10.8.4 dan menggunakan Python 2.7.3)
sumber
remove_accents
dimaksudkan untuk menghilangkan aksen dari string unicode. Seandainya dilewatkan byte-string, ia mencoba untuk mengubahnya menjadi string unicode denganunicode(input_str)
. Ini menggunakan pengkodean default python, yaitu "ascii". Karena file Anda dikodekan dengan UTF-8, ini akan gagal. Baris 2 dan 3 mengubah encoding default python ke UTF-8, jadi itu berfungsi, seperti yang Anda tahu. Pilihan lain adalah untuk melewatkanremove_accents
string unicode: hapus baris 2 dan 3, dan pada baris terakhir gantielement
denganelement.decode("utf-8")
. Saya menguji: itu berhasil. Saya akan memperbarui jawaban saya untuk membuat ini lebih jelas.iso-8859-1
, sayangnya saya tidak bisa bekerja dengan fungsi ini!)reload(sys); sys.setdefaultencoding("utf-8")
adalah hack yang meragukan yang kadang-kadang direkomendasikan untuk sistem Windows; lihat stackoverflow.com/questions/28657010/… untuk detailnya.gensim.utils.deaccent (teks) dari Gensim - pemodelan topik untuk manusia :
Solusi lain adalah unidecode .
Perhatikan bahwa solusi yang disarankan dengan unicodedata biasanya menghilangkan aksen hanya dalam beberapa karakter (misalnya berubah
'ł'
menjadi''
, bukan menjadi'l'
).sumber
deaccent
masih memberił
bukannyal
.NumPy
danSciPy
menghilangkan aksen.Beberapa bahasa telah menggabungkan diakritik sebagai huruf bahasa dan aksen diakritik untuk menentukan aksen.
Saya pikir lebih aman untuk menentukan secara eksplisit diactrics apa yang ingin Anda hapus:
sumber