如果你在Chrome中双击英文文本,你点击的以空格分隔的单词会高亮显示。这并不奇怪。然而,有一天我在阅读一些日语文本时点击,注意到一些单词在单词边界处被突出显示,尽管日语没有空格。下面是一些文本示例:

我完全猜不出他出生在哪里。只记得在昏暗潮湿的地方喵喵地哭。

例如,如果你点击薄暗い,Chrome会正确地突出显示为一个单词,即使它不是一个单一的字符类(这是一个混合的汉字和平假名)。并不是所有的挑染都是正确的,但它们看起来并不随机。

Chrome如何决定在这里突出显示什么?我试着在Chrome源代码中搜索“日语单词”,但只找到了一个实验模块的测试,在我的Chrome版本中似乎不活跃。


当前回答

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来显示这个。

质量不是惊人的,但我很惊讶这是支持在所有。

其他回答

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来显示这个。

质量不是惊人的,但我很惊讶这是支持在所有。

根据JonathonW发布的链接,答案基本上可以归结为:“有一个很大的日文单词列表,Chrome会检查你是否双击了一个单词。”

具体来说,v8使用ICU来做一些与unicode相关的文本处理工作,包括将文本分解为单词。ICU边界检测代码包括一个“基于字典的BreakIterator”,用于没有空格的语言,包括日语、中文、泰国语等。

对于您的具体示例“薄暗い”,您可以在ICU提供的中日联合词典中找到该词(第255431行)。目前收录的汉语/日语词汇共有315671个。如果你发现Chrome浏览器不能正确拆分一个单词,你可以给ICU发送一个补丁来添加这个单词。

谷歌仍然是初级的(2022-11-27),但它在语言解析的各个领域进展非常快。 今天的状态代码,谷歌Chrome打破|生れ|たか|和|泣|い|て|いた事|,两个“たか’和‘いた事”都奇怪的词汇方面因为“たか’和‘いた”(A)通常与前面的字符串”与“使用99年,9%的时间(B)很少有意义(频率使用超出10000排名)。

对于中文和日语,任何人都可以用一个只有10万个条目的词汇表(你在阅读时添加到列表中)来获得更好的结果,你可以从最长的字符串组织到更短的(单个字符),对于中文,我将长度设置为最大5个字符,任何更大的是一个组织的名称或类似的,对于日语,我将最大长度设置为9个字符。有音调语言的单词比无音调语言短(65%)。

To parse a paragraph you launch a "do while" loop that starts from the first character and tries to find first the longest possible string in the vocabulary list, if that wasn't successful the search proceed towards the end of the list to shorter parts of words with less meaning, till it gets too simple letters or rare single-characters (you need to have all these single items, like, all 6,000 kanji/hanzi for daily reading). You set a separator when you encounter punctuation or numbers and you skip to the next word.

如果我在工作中展示这个会更容易,但我不知道人们是否感兴趣,我是否可以在这里发布视频链接。