¿Cómo decide Chrome qué resaltar cuando hace doble clic en el texto japonés?

214

Si hace doble clic en el texto en inglés en Chrome, se resalta la palabra delimitada por espacios en blanco en la que hizo clic. Esto no es sorprendente. Sin embargo, el otro día estaba haciendo clic mientras leía texto en japonés y noté que algunas palabras estaban resaltadas en los límites de las palabras, a pesar de que el japonés no tiene espacios. Aquí hay un texto de ejemplo:

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

Por ejemplo, si hace clic en 薄 暗 い, Chrome lo resaltará correctamente como una sola palabra, aunque no se trate de una sola clase de caracteres (esta es una mezcla de kanji e hiragana). No todos los aspectos más destacados son correctos, pero no parecen aleatorios.

¿Cómo decide Chrome qué resaltar aquí? Intenté buscar en la fuente de Chrome "palabra japonesa", pero solo encontré pruebas para un módulo experimental que no parece activo en mi versión de Chrome.

polm23
fuente
1
@Nathaniel No sé cómo es para ti, pero cuando hago doble clic en el kanji, solo selecciona el kanji, y cuando hago doble clic en el hiragana, solo selecciona el hiragana consecutivo, y lo mismo por un momento de katakana (nya nya)
Fresa
44
La parte じ め じ め し た es una buena parte para probar si el navegador realmente está haciendo una selección inteligente de palabras en lugar de solo detener la selección en los límites kana / kanji / rōmaji. Todo es hiragana, pero Chrome (y Safari) seleccionan correctamente solo la parte じ め じ め (la parte し た es una inflexión verbal). Firefox, por otro lado, selecciona incorrectamente い じ め じ め し た (porque Firefox no reconoce los límites reales de las palabras, pero aparentemente solo detiene la selección en los límites kana / kanji / rōmaji).
sidehowbarker
2
@ Fresa ya veo. Para mí, selecciona la palabra 薄 暗 い, como se describe en la pregunta. (Chrome, Mac.)
Nathaniel
1
Con una excepción, en cada aplicación macOS que he probado (TextEdit, Stickies, Notes, Terminal, etc.), haga doble clic en la selección inteligente de palabras de texto japonés que funciona como se esperaba. Entonces, al menos en macOS, Chrome no está haciendo nada especial para esto que prácticamente todas las demás aplicaciones de macOS no están haciendo, solo está usando el soporte de separación de palabras basado en ICU existente integrado en macOS.
sidehowbarker
1
En macOS, Firefox es la única excepción que he encontrado a la regla de que las aplicaciones de macOS pueden hacer el mismo tipo de selección de palabras inteligentes con doble clic del texto japonés descrito en esta pregunta. Firefox parece hacer lo mucho más simple de simplemente detener la selección en los límites de kana / kanji / rōmaji. Un ingeniero de Firefox me dijo que eso se debe a que Firefox no utiliza las API de plataforma macOS basadas en ICU para la selección de texto. Ver error relacionado bugzil.la/345823 .
sidehowbarker

Respuestas:

165

Resulta que v8 tiene un segmentador de palabras en varios idiomas no estándar y maneja japonés.

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

También hice un jsfiddle que muestra esto.

La calidad no es sorprendente, pero me sorprende que esto sea compatible.

polm23
fuente
24
Esto es parte del proyecto de la UCI: userguide.icu-project.org/boundaryanalysis , también vea unicode.org/reports/tr29/#Word_Boundaries
Xorlev
10
También vea source.chromium.org/chromium/chromium/src/+/master:v8/src/… para saber dónde está conectado.
Xorlev
44
Windows ya tiene la capacidad de seleccionar la palabra correcta al hacer doble clic en una palabra japonesa. Ni siquiera necesita Chrome para esto
phuclv
77
@phuclv: no todos los que usan Chrome lo ejecutan en Windows.
Sean
2
¿Está seguro de que el comportamiento v8 tiene algún efecto en la selección de texto en la interfaz de usuario del navegador? Dado que v8 es un motor de JavaScript, no creo que ninguno de los códigos de v8 se ejecute mientras realiza la selección de texto en la interfaz de usuario del navegador. Supongo que puedes comprobar deshabilitando JavaScipt en el navegador y luego ver si observas el mismo comportamiento. Si no lo hace, creo que eso demostraría que el comportamiento no se debe a v8. (Lo haría yo mismo para probarlo, pero como señalé en otro comentario, en mi entorno macOS, esto ya funciona independientemente de en qué navegador pruebo, no solo en Chrome.)
sideshowbarker
92

Según los enlaces publicados por JonathonW , la respuesta básicamente se reduce a: "Hay una gran lista de palabras japonesas y Chrome verifica si has hecho doble clic en una palabra".

Específicamente, v8 usa ICU para hacer un montón de cosas de procesamiento de texto relacionadas con Unicode, incluida la división del texto en palabras . El código de detección de límites de la UCI incluye un "BreakIterator basado en diccionario" para idiomas que no tienen espacios, incluidos japonés, chino, tailandés, etc.

Y para su ejemplo específico de "薄 暗 い", puede encontrar esa palabra en el diccionario combinado chino-japonés enviado por ICU (línea 255431). Actualmente hay 315,671 palabras en total en chino / japonés en la lista. Presumiblemente, si encuentra una palabra que Chrome no se divide correctamente, podría enviar un parche a la UCI para agregar esa palabra.

erjiang
fuente
La UCI y proyectos similares han existido durante mucho tiempo. No me sorprendería que el motor V8 de Chrome lo recogiera después de la transición de WebKit, que se originó en plataformas donde los motores de texto estándar han estado haciendo este tipo de tokenización durante casi 20 años.
rickster