Bagaimana Chrome memutuskan apa yang akan disorot ketika Anda mengklik dua kali teks Jepang?

214

Jika Anda mengklik dua kali teks bahasa Inggris di Chrome, kata yang dibatasi spasi yang Anda klik akan disorot. Ini tidak mengejutkan. Namun, tempo hari saya mengklik saat membaca beberapa teks dalam bahasa Jepang dan memperhatikan bahwa beberapa kata disorot pada batas kata, meskipun bahasa Jepang tidak memiliki spasi. Inilah beberapa contoh teks:

ど こ で 生 生 た か と と ん と 見 当 つ つ か ぬ 何 何 暗 暗 暗 い い め め じ じ じ じ ャ ャ ー ー ー ー ー ー い る だ だ け けけ

Misalnya, jika Anda mengklik 薄 暗 い, Chrome akan menyorotnya dengan benar sebagai satu kata, meskipun itu bukan kelas karakter tunggal (ini adalah campuran dari kanji dan hiragana). Tidak semua highlight benar, tetapi tampaknya tidak acak.

Bagaimana Chrome memutuskan apa yang harus disorot di sini? Saya mencoba mencari sumber Chrome untuk "kata Jepang" tetapi hanya menemukan tes untuk modul eksperimental yang tampaknya tidak aktif di versi Chrome saya.

polm23
sumber
1
@Nathaniel Saya tidak tahu bagaimana ini untuk Anda, tetapi ketika saya mengklik dua kali pada kanji, itu hanya memilih kanji, dan ketika saya mengklik dua kali dalam hiragana, itu hanya memilih hiragana berturut-turut, dan sama untuk sedikit dari katakana (nya nya)
Strawberry
4
Bagian じ め じ め し た adalah bagian yang baik untuk digunakan dalam menguji apakah browser benar-benar melakukan pemilihan kata cerdas daripada hanya menghentikan pilihan pada batas kana / kanji / rōmaji. Itu semua hiragana, tetapi Chrome (dan Safari) dengan benar memilih hanya bagian じ め じ め (bagian し た adalah infleksi kata kerja). Sebaliknya, Firefox salah memilih い じ め じ め し た (karena Firefox tidak mengenali batas kata yang sebenarnya sama sekali, tetapi tampaknya hanya menghentikan seleksi di batas kana / kanji / rajiaji).
sontonbarker
2
@Strawberry, begitu. Bagi saya itu memilih kata 薄 暗 い, seperti yang dijelaskan dalam pertanyaan. (Chrome, Mac.)
Nathaniel
1
Dengan satu pengecualian, di setiap aplikasi macOS yang saya uji - TextEdit, Stickies, Notes, Terminal, dll. - klik dua kali pemilihan kata cerdas pada teks Jepang berfungsi seperti yang diharapkan. Jadi setidaknya pada macOS, Chrome tidak melakukan sesuatu yang istimewa untuk ini sehingga hampir semua aplikasi macOS lainnya juga tidak melakukan - itu hanya menggunakan dukungan kata-melanggar berbasis ICU yang ada dibangun ke dalam macOS.
sontonbarker
1
Di macOS, Firefox adalah satu-satunya pengecualian yang saya temukan pada aturan bahwa aplikasi macOS semua dapat melakukan jenis yang sama klik ganda pemilihan kata cerdas dari teks Jepang yang dijelaskan dalam pertanyaan ini. Firefox tampaknya hanya melakukan hal yang lebih sederhana dengan menghentikan seleksi pada batas kana / kanji / rajiaji. Saya telah diberitahu oleh insinyur Firefox karena Firefox tidak menggunakan API platform macOS berbasis ICU bawaan untuk pemilihan teks. Lihat bugzil.la/345823 bug terkait .
sontonbarker

Jawaban:

165

Jadi ternyata v8 memiliki segmenter kata multi-bahasa non-standar dan menangani bahasa Jepang.

function tokenizeJA(text) {
  var it = Intl.v8BreakIterator(['ja-JP'], {type:'word'})
  it.adoptText(text)
  var words = []

  var cur = 0, prev = 0

  while (cur < text.length) {
    prev = cur
    cur = it.next()
    words.push(text.substring(prev, cur))
  }

  return words
}

console.log(tokenizeJA('どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。'))
// ["どこ", "で", "生れ", "たか", "とんと", "見当", "が", "つ", "か", "ぬ", "。", "何でも", "薄暗い", "じめじめ", "した", "所", "で", "ニャーニャー", "泣", "い", "て", "いた事", "だけ", "は", "記憶", "し", "て", "いる", "。"]

Saya juga membuat jsfiddle yang menunjukkan ini.

Kualitasnya tidak luar biasa tapi saya terkejut ini didukung sama sekali.

polm23
sumber
24
Ini adalah bagian dari proyek ICU: userguide.icu-project.org/boundaryanalysis , juga melihat unicode.org/reports/tr29/#Word_Boundaries
Xorlev
10
Juga lihat source.chromium.org/chromium/chromium/src/+/master:v8/src/… untuk di mana kabel itu terhubung.
Xorlev
4
Windows sudah memiliki kemampuan untuk memilih kata yang benar ketika mengklik dua kali pada kata Jepang. Anda bahkan tidak memerlukan Chrome untuk ini
phuclv
7
@ phuclv: Tidak semua orang yang menggunakan Chrome menjalankannya di Windows.
Sean
2
Apakah Anda yakin perilaku v8 memengaruhi pemilihan teks di UI browser? Mengingat v8 itu adalah mesin JavaScript, saya tidak akan berpikir bahwa kode v8 mana pun akan dieksekusi saat Anda sedang melakukan pemilihan teks di UI browser. Saya kira Anda dapat memeriksa dengan menonaktifkan JavaScipt di browser dan kemudian melihat apakah Anda mengamati perilaku yang sama. Jika tidak, maka saya akan berpikir itu akan menunjukkan perilaku itu bukan karena v8. (Saya akan melakukannya sendiri untuk mengujinya, tetapi seperti yang saya catat dalam komentar lain, di lingkungan macOS saya, ini sudah berfungsi terlepas dari browser mana saya mengujinya - bukan hanya di Chrome.)
sontonbarker
92

Berdasarkan tautan yang diposting oleh JonathonW , jawabannya pada dasarnya bermuara pada: "Ada daftar besar kata-kata Jepang dan Chrome memeriksa untuk melihat apakah Anda mengklik dua kali dalam sebuah kata."

Secara khusus, v8 menggunakan ICU untuk melakukan banyak hal yang berhubungan dengan pemrosesan Unicode, termasuk memecah teks menjadi kata-kata . Kode deteksi batas ICU termasuk "BreakIterator Berbasis Kamus" untuk bahasa yang tidak memiliki spasi, termasuk Jepang, Cina, Thailand, dll.

Dan untuk contoh spesifik Anda dari "薄 暗 い", Anda dapat menemukan kata itu dalam kamus Cina-Jepang gabungan yang dikirimkan oleh ICU (baris 255431). Saat ini ada 315.671 total kata Cina / Jepang dalam daftar. Agaknya jika Anda menemukan kata yang Chrome tidak terbelah dengan benar, Anda dapat mengirim ICU tambalan untuk menambahkan kata itu.

erjiang
sumber
ICU dan proyek serupa sudah ada sejak lama. Saya tidak akan terkejut jika mesin V8 Chrome mengambilnya setelah mereka beralih dari WebKit, yang berasal dari platform di mana mesin teks standar telah melakukan tokenization semacam ini selama hampir 20 tahun.
rickster