JavaScript正则表达式用于在Unicode字符串中搜索单词边界

4
能否通过JavaScript正则表达式(可以使用“xregexp”JS库)在日语字符串(例如:“私はマーケットに行きました。”)中找到单词边界的解决方案?
例如:
var xr = RegExp("\\bst","g");
xr.test("The string") // --> true

我需要针对日语字符串的相同逻辑。


我不明白,\\bst是什么? - hippietrail
一种匹配汉字、平假名和片假名之间边界的方法可以帮助但不能单独解决这个问题。到目前为止,即使使用xregexp,我也找不到一种匹配它们的方法。您可能会对我刚刚提出的一个问题感兴趣:https://dev59.com/HmQn5IYBdhLWcg3w5aey - hippietrail
对于日语来说,最好使用完整的形态分析器。这里有一个JavaScript版本的:https://github.com/takuyaa/kuromoji.js - katspaugh
2个回答

6
然而,将日本句子分割成单词的实际问题比看起来更加复杂,因为单词不像英语一样用空格分开。

例如,句子“私はマーケットに行きました。”(“我去了市场”)有以下单词:

  • 私 - watakushi
  • は - wa
  • マーケット - maaketto
  • に - ni
  • 行きました - ikimashita
  • 。 - (句号)

一个可靠的日语句子解析器必须找到助词(wa和ni)在句子中的位置,以便找到剩下的单词。


3
是的,这确实很难;你需要有大量的词典和猜测单个字符(特别是假名)组合时更可能表示哪个词的启发式算法。有可能制造双关语,使得一句话可以有多种解读方式,因此这项任务并不完全可解,而用像正则表达式这样的工具几乎没有什么作用(更不用说JavaScript的不支持Unicode的正则表达式)。 - bobince

4
\b,以及\w\W在JavaScript中不支持Unicode。您需要将单词边界定义为特定的字符集,例如:(^|$|[\s.,:\u3002]+)或类似的字符集。

\u3002来自于('。'.charCodeAt(0)).toString(16)。它是日语中的标点符号吗?

或者,相反地,定义一个包含构成单词的Unicode范围并对其取反:

var boundaries = /(^|$|\s+|[^\u30A0–\u30FA]+)/g;

这个例子的片假名范围取自http://www.unicode.org/charts/PDF/U30A0.pdf


我认为是的。'。'是一个标点符号。 - Andrei
1
是的,这是一个句号,是分割单词(句子)边界的少数可靠方法之一。要做得比这更好非常困难(正如Peter的回答所述)。 - bobince

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