当你双击日语文本时,Chrome如何决定高亮显示什么?

220
如果你在Chrome中双击英文文本,你所点击的以空格分隔的单词会被突出显示。这并不奇怪。然而,前几天我在阅读一些日文文本时点击了一下,注意到一些单词在单词边界处被突出显示,即使日文没有空格。以下是一些示例文本:
例如,如果你点击“薄暗い”,Chrome会正确地将其作为一个单词突出显示,即使它不是一个单一字符类(这是汉字和平假名的混合体)。并非所有的高亮都是正确的,但它们似乎不是随机的。
Chrome是如何决定在这里突出显示什么的?我尝试搜索Chrome源代码中的“日语单词”,但只找到了一个实验模块的测试,这个模块在我的Chrome版本中似乎没有激活。

1
@Nathaniel 我不知道你的情况怎么样,但是当我双击汉字时,它只会选择那个汉字,当我在平假名上双击时,它只会选择连续的平假名,对于一小部分片假名(にゃにゃ),也是同样的情况。 - Strawberry
6
测试浏览器是否真正具备智能词语选择功能,而不仅仅在假名/汉字/罗马字的边界处停止选择,"じめじめした"是一个很好的测试部分。它全部都是平假名,但Chrome(和Safari)可以正确地仅选择"じめじめ"部分("した"是一个动词屈折形)。另一方面,Firefox则错误地选择了"いじめじめした"(因为Firefox根本无法识别实际的单词边界,但显然只会在假名/汉字/罗马字的边界处停止选择)。 - sideshowbarker
2
@Strawberry 我明白了。对我来说,它选择了问题中描述的单词“薄暗い”。(Chrome,Mac。) - N. Virgo
1
除了一个例外,在我测试过的每个macOS应用程序中——TextEdit、Stickies、Notes、Terminal等——双击智能选择日语文本都能按预期工作。因此,至少在macOS上,Chrome并没有为此做任何特殊处理,几乎所有其他macOS应用程序也都是使用macOS内置的基于ICU的断词支持。 - sideshowbarker
1
在 macOS 上,Firefox 是我发现的唯一例外,即 macOS 应用程序都可以执行与此问题中描述的日语文本智能双击选择相同类型的操作。 Firefox 似乎只做了更简单的事情,即仅在假名/汉字/罗马字边界处停止选择。 我曾被 Firefox 工程师告知,这是因为 Firefox 不使用基于 ICU 的内置 macOS 平台 API 进行文本选择。 请参见相关错误 https://bugzil.la/345823。 - sideshowbarker
显示剩余4条评论
3个回答

170

结果表明,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来展示这个。

质量并不是很好,但我很惊讶居然支持这个。


27
这是 ICU 项目的一部分:http://userguide.icu-project.org/boundaryanalysis,同时请参阅 http://www.unicode.org/reports/tr29/#Word_Boundaries - Xorlev
10
另请参见https://source.chromium.org/chromium/chromium/src/+/master:v8/src/objects/js-break-iterator.cc;l=69-93;drc=7cba1ed502e90ece18cccc568eb2fb986b085aa1?originalUrl=https:%2F%2Fcs.chromium.org%2F,此处已连接。 - Xorlev
4
双击日语单词时,Windows已经具备选择正确词语的能力。这个功能不需要借助Chrome。 - phuclv
7
并非每个使用 Chrome 浏览器的人都在 Windows 操作系统上运行它。 - Vikki
2
你确定 v8 的行为会影响浏览器 UI 中的文本选择吗?鉴于 v8 是一个 JavaScript 引擎,我认为在你执行浏览器 UI 中的文本选择时,v8 代码不应该执行。我猜你可以通过禁用浏览器中的 JavaScript,然后看看是否观察到相同的行为来检查这一点。如果没有,那么我认为这将表明该行为不是由 v8 导致的。(我会测试一下,但正如我在另一个评论中所指出的那样,在我的 macOS 环境中,无论在哪个浏览器中测试,这已经可以工作了 - 不仅在 Chrome 中。) - sideshowbarker
等到这个功能在 Android 上的 Chrome 实现时,我可能已经入土为安了。我已经等了好几年了!有些事情告诉我我还要等很长时间,我不知道为什么团队还没有实现它……这对日本人来说肯定很沮丧。 - vdegenne

96
根据JonathonW发布的链接,基本上答案就是:“有一个日语单词列表,Chrome会检查你是否双击了一个单词。”
具体来说,v8使用ICU进行一些与Unicode相关的文本处理,包括将文本拆分成单词。ICU边界检测代码包括一个适用于没有空格的语言(例如日语,中文,泰语等)的基于字典的BreakIterator
对于您提供的“薄暗い”这个特定例子,您可以在ICU提供的中日合并词典(第255431行)中找到该单词。目前该列表中共有315,671个中日文单词。如果您发现Chrome不能正确地分割某个单词,可能需要向ICU发送补丁以添加该单词。

7
Windows在双击选择方面也使用了字典查找的方法。 - phuclv
ICU和类似的项目已经存在很长时间了。如果Chrome的V8引擎在从WebKit转换后采用了它,我不会感到惊讶,因为WebKit起源于标准文本引擎已经进行这种记号化处理的平台,已经有近20年的历史了。 - rickster

1
谷歌在语言分析的各个领域取得了快速进展,虽然目前(2022年11月27日)仍处于基础阶段。根据代码的当前状态,Google Chrome无法正确解析“|生れ|たか|”和“|泣|い|て|いた事|”,因为“たか”和“いた事”在词汇上都很奇怪,因为(A)它们通常与前面的字符串“黏合”在一起使用,占据99.9%的情况,(B)它们的意义非常微小(频率使用超过第10000位排名)。
对于中文和日文,任何人都可以通过一个包含10万个项目的词汇表(您可以在阅读时添加到该列表中)获得更好的结果,并将其从最长的字符串组织到较短的字符串(单个字符),对于中文,我将长度设置为5个字符,任何大于此长度的字符串都是组织名称等;对于日文,我将最大长度设置为9个字符。声调语言的单词比非声调语言短(65%)。
要解析一个段落,您需要启动一个“do while”循环,从第一个字符开始并尝试在词汇表中找到最长的可能字符串,如果失败,则向列表末尾搜索具有较少意义的较短单词,直到遇到太简单的字母或罕见的单个字符(您需要拥有所有这些单个项目,例如日常阅读的6000个汉字/假名)。当遇到标点符号或数字时,您需要设置一个分隔符并跳到下一个单词。
如果我展示一下实际操作,那会更容易理解,但我不知道人们是否感兴趣以及我是否可以在这里发布视频链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接