Chromeは、日本語のテキストをダブルクリックしたときに何をハイライトするかをどのように決定しますか?


214

Chromeで英語のテキストをダブルクリックすると、クリックした空白で区切られた単語が強調表示されます。これは当然のことです。しかし、先日、日本語のテキストを読みながらクリックしていたところ、日本語にスペースがないにもかかわらず、単語の境界でハイライトされている単語があることに気付きました。これがテキストの例です。

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

たとえば、薄暗いをクリックすると、1つの文字クラスではありません(これは漢字とひらがなの混合です)が、Chromeはそれを1つの単語として正しく強調表示します。すべてのハイライトが正しいわけではありませんが、ランダムに見えるわけではありません。

Chromeはここで何を強調するかをどのように決定しますか?Chromeのソースで「日本語」を検索してみましたが、私のバージョンのChromeではアクティブに見えない実験的なモジュールのテストしか見つかりませんでした。


1
@ナタニエル私はあなたのためにそれがどういうものかわからないが、漢字をダブルクリックすると、漢字のみが選択され、ひらがなをダブルクリックすると、連続したひらがなのみが選択され、少し同じof
イチゴ

4
じめじめした部分は、ブラウザが仮名/漢字/ローマ字の境界で選択を停止するだけでなく、実際にインテリジェントな単語選択を行っているかどうかをテストするのに使用するのに適した部分です。それはすべてひらがなですが、Chrome(およびSafari)はじめじめの部分だけを正しく選択します(した部分は動詞の活用形です)。一方、Firefoxは誤っていじめじめしたを選択します(Firefoxは実際の単語の境界をまったく認識せず、仮名/漢字/rōmajiの境界で選択を停止するだけなので)。
sideshowbarker

2
@Strawberryなるほど。私にとっては、質問で説明されているように、薄暗い単語を選択します。(Mac、Chrome)
ナサニエル

1
1つの例外を除いて、私がテストしたすべてのmacOSアプリ(TextEdit、Stickys、Notes、Terminalなど)では、ダブルクリックで日本語テキストのインテリジェントな単語選択が期待どおりに機能します。そのため、少なくともmacOSでは、Chromeはこのために特別なことを行っておらず、事実上他のすべてのmacOSアプリもそうではありません。macOSに組み込まれている既存のICUベースのワードブレークサポートを使用しているだけです。
sideshowbarker

1
macOSでは、Firefoxが唯一の例外であり、macOSアプリはすべて、この質問で説明されている日本語テキストの同じ種類のダブルクリックのインテリジェントな単語選択を実行できます。Firefoxは、かな/漢字/ローマ字の境界で選択を停止するという非常に単純なことだけを行うようです。私は、Firefoxのエンジニアから、Firefoxが組み込みのICUベースのmacOSプラットフォームAPIを使用してテキストを選択していないためと言われました。関連するバグbugzil.la/345823を参照してください。
sideshowbarker

回答:


165

したがって、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も作成しました。

品質は驚くべきものではありませんが、これがサポートされていることに驚いています。


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の動作がブラウザUIのテキスト選択に影響を与えることを本当に確認しますか?v8がJavaScriptエンジンであることを考えると、ブラウザーのUIでテキストを選択しているときにv8コードが実行されるとは思いません。ブラウザでJavaSciptを無効にし、同じ動作が見られるかどうかを確認することで確認できると思います。そうでない場合は、v8が原因ではないことを示していると思います。(私はそれを自分でテストしてテストしますが、別のコメントで述べたように、私のmacOS環境では、Chromeだけでなく、どのブラウザーでテストしてもこれは既に機能しています。)
sideshowbarker

92

JonathonWによって投稿されリンクに基づくと、答えは基本的に次のようになります。「日本語の単語の大きなリストがあり、Chromeは単語をダブルクリックしたかどうかをチェックします。」

具体的には、v8はICUを使用して、テキストを単語に分割するなど、Unicode関連のテキスト処理を行います。ICU境界検出コードには、日本語、中国語、タイ語など、スペースを持たない言語用の「辞書ベースのBreakIterator」が含まれています。

また、「薄暗い」の具体的な例については、ICUが出荷する中国語と日本語の組み合わせ辞書(行255431)でその単語を見つけることができます。現在、リストには315,671の中国語/日本語の単語があります。おそらく、Chromeが適切に分割されないという単語を見つけた場合、ICUにパッチを送信してその単語を追加することができます。



ICUや類似のプロジェクトは長い間存在しています。標準のテキストエンジンがこの種のトークン化をほぼ20年間行ってきたプラットフォームで始まったWebKitからの移行後にChromeのV8エンジンがピックアップしたとしても、私は驚かないでしょう。
リクスター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.