Как Chrome решает, что нужно выделить, если дважды щелкнуть текст на японском языке?

215

Если дважды щелкнуть текст на английском языке в Chrome, выделенное пробелом слово будет выделено. Это не удивительно. Однако на днях я нажимал, читая какой-то текст на японском языке, и заметил, что некоторые слова были выделены на границах слов, хотя в японском языке нет пробелов. Вот пример текста:

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

Например, если вы нажмете 薄 暗 い, Chrome правильно выделит его как одно слово, даже если это не один класс символов (это смесь кандзи и хирагана). Не все основные моменты правильны, но они не кажутся случайными.

Как Chrome решает, что здесь выделить? Я попытался найти в исходном коде Chrome «японское слово», но нашел только тесты для экспериментального модуля , который не работает в моей версии Chrome.

polm23
источник
1
@Nathaniel Я не знаю, как это для вас, но когда я дважды щелкаю на кандзи, он выбирает только кандзи, а когда я дважды щелкаю в хирагане, он выбирает только последовательный хирагана, и то же самое для немножко катакана (ня ня)
клубника
4
Часть じ め じ め し た полезна для проверки того, действительно ли браузер выполняет интеллектуальный выбор слов, а не просто останавливает выбор на границах kana / kanji / rōmaji. Это все хирагана, но Chrome (и Safari) правильно выбирают только часть じ め じ め (часть し is - это глагол). Firefox, с другой стороны, неправильно выбирает い じ め じ め し た (поскольку Firefox вообще не распознает фактические границы слов, а, по-видимому, просто останавливает выделение на границах kana / kanji / rōmaji).
Sideshowbarker
2
@ Клубника, я вижу. Для меня это выбирает слово 薄 暗 い, как описано в вопросе. (Chrome, Mac.)
Натаниэль
1
За одним исключением, в каждом приложении MacOS, которое я тестировал, - TextEdit, Stickies, Notes, Terminal и т. Д. - двойной щелчок по интеллектуальному выбору слов японского текста работает, как и ожидалось. Поэтому, по крайней мере, в macOS Chrome не делает для этого ничего особенного, чего не делают практически все другие приложения macOS - он просто использует существующую поддержку разрыва слов на основе ICU, встроенную в macOS.
Sideshowbarker
1
В macOS Firefox - единственное исключение, которое я обнаружил в правиле, согласно которому все приложения macOS могут выполнять тот же вид интеллектуального выделения слов на японском языке, что и двойной щелчок мышью, описанный в этом вопросе. Firefox, кажется, делает гораздо более простую вещь - просто останавливает выделение на границах kana / kanji / rōmaji. Мне сказал инженер Firefox, что Firefox не использует встроенные API-интерфейсы MacOS на основе ICU для выделения текста. Смотрите связанную ошибку bugzil.la/345823 .
Sideshowbarker

Ответы:

166

Получается, что в v8 есть нестандартный многоязычный сегментатор слов и он работает с японским языком.

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, который показывает это.

Качество не удивительное, но я удивлен, что это поддерживается вообще.

polm23
источник
24
Это часть проекта ICU: userguide.icu-project.org/boundaryanalysis , также см unicode.org/reports/tr29/#Word_Boundaries
Xorlev
10
Также см. Source.chromium.org/chromium/chromium/src/+/master:v8/src/… где это установлено.
Xorlev
4
В Windows уже есть возможность выбрать правильное слово при двойном щелчке по японскому слову. Вам даже не нужен Chrome для этого
phuclv
7
@phuclv: Не каждый, кто использует Chrome, запускает его в Windows.
Шон
2
Вы уверены, что поведение v8 влияет на выбор текста в пользовательском интерфейсе браузера? Учитывая, что v8 - это движок JavaScript, я не думаю, что какой-либо код v8 будет выполняться, пока вы делаете выбор текста в пользовательском интерфейсе браузера. Я думаю, вы могли бы проверить, отключив JavaScipt в браузере, а затем посмотреть, наблюдаете ли вы такое же поведение. Если вы этого не сделаете, то я думаю, что это покажет, что поведение не связано с v8. (Я бы сделал это сам, чтобы протестировать его, но, как я заметил в другом комментарии, в моей среде macOS это уже работает независимо от того, в каком браузере я тестирую - не только в Chrome.)
sideshowbarker
93

Основываясь на ссылках, опубликованных JonathonW , ответ в основном сводится к следующему: «Существует большой список японских слов и проверок Chrome, чтобы увидеть, дважды ли вы щелкнули слово».

В частности, v8 использует ICU для обработки текстов, связанных с Unicode, включая разбиение текста на слова . Код обнаружения границ ICU включает в себя «BreakIterator на основе словаря» для языков без пробелов, включая японский, китайский, тайский и т. Д.

А для вашего конкретного примера «薄 暗 い» вы можете найти это слово в комбинированном китайско-японском словаре, поставляемом ICU (строка 255431). В настоящее время в списке 315 671 всего китайских / японских слов. Предположительно, если вы найдете слово, которое Chrome не разделяет должным образом, вы можете отправить ICU патч для добавления этого слова.

erjiang
источник
ICU и подобные проекты существуют уже давно. Я не удивлюсь, если движок Chrome V8 подхватил его после перехода с WebKit, созданного на платформах, где стандартные текстовые движки занимаются подобным токенизацией почти 20 лет.
Рикстер