Como o Chrome decide o que destacar quando você clica duas vezes em texto em japonês?

214

Se você clicar duas vezes no texto em inglês no Chrome, a palavra delimitada por espaços em branco em que você clicou será destacada. Isto não é surpreendente. No entanto, no outro dia, eu estava clicando enquanto lia um texto em japonês e percebi que algumas palavras estavam destacadas nos limites das palavras, mesmo que o japonês não tenha espaços. Aqui está um exemplo de texto:

ど こ で 生 れ 見 当 が つ ぬ。 何 で も 薄 暗 い じ め じ し し た 所 で ニ ー ー ー し け け け け け け け け け け け.

Por exemplo, se você clicar em 薄 暗 い, o Chrome a destacará corretamente como uma única palavra, mesmo que não seja uma classe de caractere único (essa é uma mistura de kanji e hiragana). Nem todos os destaques estão corretos, mas não parecem aleatórios.

Como o Chrome decide o que destacar aqui? Tentei pesquisar na "fonte em japonês" a fonte do Chrome, mas só encontrei testes para um módulo experimental que não parece ativo na minha versão do Chrome.

polm23
fonte
1
@ Nathaniel Não sei como é para você, mas quando clico duas vezes no kanji, ele seleciona apenas o kanji, e quando clico duas vezes nos hiragana, ele seleciona apenas hiragana consecutivos e o mesmo por um tempo. de katakana (nya nya)
Strawberry
4
A parte じ め じ め し た é uma boa parte para testar se o navegador está realmente fazendo a seleção inteligente de palavras, em vez de apenas interromper a seleção nos limites de kana / kanji / rōmaji. É tudo hiragana, mas o Chrome (e o Safari) selecionam corretamente apenas a parte じ め じ め (a parte is た é uma inflexão de verbo). Por outro lado, o Firefox seleciona incorretamente い じ め じ め し (porque o Firefox não reconhece os limites reais das palavras, mas aparentemente apenas interrompe a seleção nos limites kana / kanji / rōmaji).
sideshowbarker
2
@ Morango eu vejo. Para mim, seleciona a palavra 薄 暗 い, conforme descrito na pergunta. (Chrome, Mac.)
Nathaniel
1
Com uma exceção, em todos os aplicativos do macOS que eu testei - TextEdit, Stickies, Notes, Terminal etc. - clique duas vezes na seleção inteligente de palavras em texto em japonês, conforme o esperado. Portanto, no macOS, pelo menos, o Chrome não está fazendo nada de especial por isso que praticamente todos os outros aplicativos do macOS também não estão fazendo - está apenas usando o suporte à quebra de palavras existente baseado em ICU incorporado ao macOS.
sideshowbarker
1
No macOS, o Firefox é a única exceção que encontrei à regra de que os aplicativos macOS podem fazer o mesmo tipo de seleção inteligente de palavras com duplo clique do texto em japonês descrito nesta pergunta. O Firefox parece fazer apenas a coisa mais simples de parar a seleção nos limites de kana / kanji / rōmaji. Fui informado por um engenheiro do Firefox porque o Firefox não usa as APIs da plataforma macOS baseadas em ICU para seleção de texto. Veja bug relacionado relacionado bugzil.la/345823 .
sideshowbarker

Respostas:

165

Acontece que a v8 tem um segmentador de palavras em vários idiomas não padrão e lida com o 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('どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。'))
// ["どこ", "で", "生れ", "たか", "とんと", "見当", "が", "つ", "か", "ぬ", "。", "何でも", "薄暗い", "じめじめ", "した", "所", "で", "ニャーニャー", "泣", "い", "て", "いた事", "だけ", "は", "記憶", "し", "て", "いる", "。"]

Eu também fiz um jsfiddle que mostra isso.

A qualidade não é incrível, mas estou surpreso que isso seja suportado.

polm23
fonte
24
Isso faz parte do projeto da UTI: userguide.icu-project.org/boundaryanalysis , consulte também unicode.org/reports/tr29/#Word_Boundaries
Xorlev
10
Consulte também source.chromium.org/chromium/chromium/src/+/master:v8/src/… para saber onde está conectado.
Xorlev
4
O Windows já tem a capacidade de selecionar a palavra correta ao clicar duas vezes em uma palavra japonesa. Você nem precisa do Chrome para isso
phuclv
7
@ phuclv: nem todo mundo que usa o Chrome executa no Windows.
Sean
2
Tem certeza de que o comportamento da v8 afeta a seleção de texto na interface do usuário do navegador? Dado que a v8 é um mecanismo JavaScript, eu não acho que algum código da v8 esteja sendo executado enquanto você faz a seleção de texto na interface do usuário do navegador. Eu acho que você pode verificar desativando o JavaScipt no navegador e ver se você observa o mesmo comportamento. Caso contrário, acho que isso mostraria que o comportamento não se deve à v8. (Eu faria isso a mim mesmo para testá-lo, mas como eu observado no outro comentário, no meu ambiente de MacOS, isso já funciona independentemente de qual teste de navegador I in -. Não apenas no Chrome)
sideshowbarker
92

Com base nos links publicados por JonathonW , a resposta se resume basicamente a: "Há uma grande lista de palavras em japonês e o Chrome verifica se você clicou duas vezes em uma palavra".

Especificamente, a v8 usa a ICU para executar várias tarefas de processamento de texto relacionadas ao Unicode, incluindo dividir o texto em palavras . O código de detecção de limite da ICU inclui um "BreakIterator baseado em dicionário" para idiomas que não têm espaços, incluindo japonês, chinês, tailandês etc.

E para o seu exemplo específico de "薄 暗 い", você pode encontrar essa palavra no dicionário combinado chinês-japonês enviado pela ICU (linha 255431). Atualmente, existem 315.671 total de palavras em chinês / japonês na lista. Presumivelmente, se você encontrar uma palavra que o Chrome não se divide corretamente, você poderá enviar à ICU um patch para adicionar essa palavra.

erjiang
fonte
UTI e projetos similares existem há muito tempo. Não ficaria surpreso se o mecanismo V8 do Chrome o capturasse após a transição do WebKit, que se originou em plataformas nas quais os mecanismos de texto padrão fazem esse tipo de tokenização há quase 20 anos.
rickster