Як Chrome вирішує, що виділити, коли ви двічі клацніть японський текст?


214

Якщо ви двічі клацніть текст англійською мовою в Chrome, виділене вами слово з обмеженим пробілом виділяється. Це не дивно. Однак днями я натискав, читаючи текст японською мовою, і помічав, що деякі слова виділяються на межі слів, навіть якщо у японців немає пробілів. Ось приклад тексту:

ど こ で 生 れ た か と ん と 見 当 が か ぬ。 何 で も 薄 暗 じ め じ め し た 所 ニ ャ ャ ー ニ ャ 泣 い て い た 事 だ け は は は

Наприклад, якщо натиснути 薄 暗 い, Chrome правильно виділить його як одне слово, навіть якщо це не один клас символів (це суміш кандзі та хірагани). Не всі основні моменти є правильними, але вони не здаються випадковими.

Як Chrome вирішує, що тут виділити? Я спробував шукати в джерелі Chrome "японське слово", але виявив лише тести експериментального модуля , який не видається активним у моїй версії Chrome.


1
@Nathaniel Я не знаю, як це у вас, але коли я двічі клацнув на канджі, він вибирає лише канджі, а коли я двічі клацаю в хірагані, він вибирає лише послідовну хірагану і те саме для трішки of katakana (nya nya)
Полуниця

4
Частина じ め じ め し た є хорошою частиною для використання при тестуванні того, чи справді браузер робить інтелектуальний підбір слів, а не просто зупиняє вибір на межах кана / kanji / rōmaji. Це все хірагана, але Chrome (і Safari) правильно вибирають лише частину じ め じ め (частина し た - це перебір дієслова). Firefox з іншого боку неправильно вибирає い じ め じ め し た (оскільки Firefox взагалі не розпізнає фактичні межі слова, але, очевидно, просто зупиняє виділення на межах kana / kanji / rōmaji).
боковий шоубаркер

2
@Strawberry Я бачу. Для мене він вибирає слово 薄 暗 い, як описано в питанні. (Chrome, Mac.)
Натаніел

1
За одним винятком, у кожному додатку macOS, який я перевіряв, - TextEdit, Stickies, Notes, Terminal тощо - двічі клацніть інтелектуальним підбором слів японського тексту, як працює, як очікується. Так що в macOS принаймні для цього Chrome не робить нічого особливого, що практично не роблять і всі інші додатки macOS - це лише використання існуючої в ICU підтримки розбиття слів, вбудованої в macOS.
sidehowbarker

1
На macOS Firefox - єдиний виняток, з якого я виявив правило, що програми macOS можуть робити один і той же вид інтелектуального підбору подвійного клацання японського тексту, описаного в цьому запитанні. Firefox, здається, робить лише набагато простішу річ - просто зупинити вибір на межах kana / kanji / rōmaji. Мені розповіли інженер Firefox, тому що Firefox не використовує вбудовані інтерфейси API для платформи macOS на основі ICU для вибору тексту. Дивіться пов’язані помилки bugzil.la/345823 .
sidehowbarker

Відповіді:


165

Ось і виявляється, v8 має нестандартне багатомовне слово segmenter, і воно обробляє японську.

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('どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。'))
// ["どこ", "で", "生れ", "たか", "とんと", "見当", "が", "つ", "か", "ぬ", "。", "何でも", "薄暗い", "じめじめ", "した", "所", "で", "ニャーニャー", "泣", "い", "て", "いた事", "だけ", "は", "記憶", "し", "て", "いる", "。"]

Я також зробив jsfiddle, що це показує.

Якість не дивовижна, але я здивований, що це взагалі підтримується.


24
Це частина проекту ICU: userguide.icu-project.org/boundaryanalysis , також див unicode.org/reports/tr29/#Word_Boundaries
Xorlev

10
Також дивіться source.chromium.org/chromium/chromium/src/+/master:v8/src/… про те, куди це
провід

4
У Windows вже є можливість вибрати правильне слово при подвійному клацанні на японське слово. Для цього вам навіть не потрібен Chrome
phuclv

7
@phuclv: Не кожен, хто користується Chrome, запускає його в Windows.
Шон

2
Ви впевнені, що поведінка v8 впливає на вибір тексту в інтерфейсі браузера? Враховуючи, що v8 - це двигун JavaScript, я не думаю, що будь-який з кодів v8 буде виконуватися під час вибору тексту в інтерфейсі браузера. Я думаю, ви могли перевірити, відключивши JavaScipt у веб-переглядачі та побачивши, чи дотримуєтесь ви такої поведінки. Якщо ви цього не зробите, то я думаю, що це показало б, що поведінка пов'язана не з v8. (Я б це зробив сам, щоб протестувати це, але, як я зазначив в іншому коментарі, в моєму середовищі macOS це вже працює незалежно від того, в якому браузері я тестую - не тільки в Chrome.)
sideshowbarker

92

На основі посилань, опублікованих JonathonW , відповідь в основному зводиться до: "Існує великий список японських слів і Chrome перевіряє, чи ви двічі клацнули на слові".

Зокрема, v8 використовує ІКУ, щоб здійснити купу речей, пов'язаних з обробкою тексту Unicode, включаючи розбиття тексту на слова . Код виявлення кордонів ICU включає в себе "BreakIterator на основі словника" для мов, які не мають пробілів, включаючи японську, китайську, тайську тощо.

А для вашого конкретного прикладу "薄 暗 い" ви можете знайти це слово в комбінованому китайсько-японському словнику, який постачається ICU (рядок 255431). На даний момент у списку є 315,671 загальна кількість китайських / японських слів. Імовірно, якщо ви знайдете слово, яке Chrome не розбивається належним чином, ви можете надіслати ICU патч, щоб додати це слово.



ICU та подібні проекти існують вже давно. Я не був би здивований, якби двигун V8 Chrome підхопив його після переходу з WebKit, який виник на платформах, де стандартні текстові двигуни роблять подібну токенізацію майже 20 років.
рикстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.