从Unicode(任何语言)的字符串中获取字数

jai*_*rik 7 java string unicode multilingual word-count

我想从字符串中获取字数.就这么简单.问题是字符串可能是一种不可预测的语言.

所以,我需要一个int getWordCount(String)带有以下样本输出的签名函数-

getWordCount("???????") => 7
getWordCount("This is a sentence") => 4
Run Code Online (Sandbox Code Playgroud)

任何有关如何进行的帮助将不胜感激:)

McD*_*ell 6

标准API 为此类边界分析提供了BreakIterator,但Oracle Java 7区域设置支持不会破坏示例字符串.

当我使用ICU4J v51.1 BreakIterator时,它将样本分解成了[??, ??, ?, ?, ?].

// import com.ibm.icu.text.BreakIterator;
String sentence = "\u4f9b\u5e94\u5546\u4ee3\u53d1\u53d1\u8d27";
BreakIterator iterator = BreakIterator.getWordInstance(Locale.CHINESE);
iterator.setText(sentence);

List<String> words = new ArrayList<>();
int start = iterator.first();
int end = iterator.next();
while (end != BreakIterator.DONE) {
  words.add(sentence.substring(start, end));
  start = end;
  end = iterator.next();
}
System.out.println(words);
Run Code Online (Sandbox Code Playgroud)

注意:我使用谷歌翻译猜测"供应商代发发货"是中国人.显然,我不会说这种语言所以不能评论输出的正确性.


pet*_*ust 5

"单词"的概念可能是微不足道的或复杂的.这是Apache Stanbol工具包:

字标记:Stanbol Enhancer需要检测单个字来处理文本.虽然这对于大多数语言来说是微不足道的,但对于某些东方语言来说这是一项相当复杂的任务,例如中文,日文,韩文.如果没有另外配置,Stanbol将使用空格来标记单词.

因此,如果单词的概念是语言的,而不是语法的,那么你应该使用NLP工具包

我首选的Java解决方案是Apache的Open NLP

注意:我使用http://www.mdbg.net/chindict/chindict.php?page=worddict 来标记您的示例.它意味着有4个单词而不是7个单词.我剪切和粘贴(相当碎片):

原文字简体Pīnyīn英文定义在字典中添加新的单词Traditional HSK供应商供应商gōngyìngshāng

供应商

供应商代
代dài

替代/代替他人/代替/代/王朝/年龄/时期/(历史)时代/(地质)时代


发fā

发送/显示(一个人的感觉)/发布/开发/分类器枪声(回合)

发HSK 4

发fà

发/台湾公关 [FA3]

发发货
发货fāhuò

派遣/发出货物

发货

前三个字符似乎形成一个单词.