我想从字符串中获取字数。就这么简单。问题是字符串可能是不可预测的语言。
所以,我需要一个int getWordCount(String)
带有以下示例输出的签名函数 -
getWordCount("供应商代发发货") => 7
getWordCount("This is a sentence") => 4
任何有关如何进行的帮助将不胜感激:)
我想从字符串中获取字数。就这么简单。问题是字符串可能是不可预测的语言。
所以,我需要一个int getWordCount(String)
带有以下示例输出的签名函数 -
getWordCount("供应商代发发货") => 7
getWordCount("This is a sentence") => 4
任何有关如何进行的帮助将不胜感激:)
标准 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);
注意:我用谷歌翻译猜测“供应商代发发货”是中文的。显然,我不会说这种语言,所以无法评论输出的正确性。
“词”的概念可能是微不足道的,也可能是复杂的。这是Apache Stanbol工具包:
Word Tokenization:Stanbol Enhancer 需要检测单个单词来处理文本。虽然这对于大多数语言来说是微不足道的,但对于一些东方语言(例如中文、日语、韩语)来说却是一项相当复杂的任务。如果没有另外配置,Stanbol 将使用空格来标记单词。
所以如果单词的概念是语言的,而不是句法的,你应该使用NLP 工具包
我首选的 Java 解决方案是Apache 的 Open NLP
注意:我使用http://www.mdbg.net/chindict/chindict.php?page=worddict 来标记您的示例。这意味着有 4 个单词而不是 7 个单词。我已经剪切并粘贴(相当零碎):
原文 简体拼音 英文定义 添加新词到词典 繁体 HSK 供应商 供应商 gōngyìngshāng</p>
供应商
供应商代<br> 代dài</p>
代替 / 代为行事 / 代替 / 世代 / 朝代 / 时代 / 时期 / (历史) 时代 / (地质) eon
发<br>发fā</p>
发出 / 显示(一个人的感觉) / 发出 / 开发 / 枪声分类器(回合)
发 HSK 4
发fà
头发 / 台湾公关 [fa3]
发包裹
</p>
发出/发出货物
退货
这前三个字符似乎形成了一个单词。
如果我们假设每种语言都有一个(或多个)单词分隔符,并且您可以为这些分隔符构建正则表达式,那么问题可以这样解决:
public String separatorForLanguage(char unicodeChar){
// Find out in which language unicodeChar falls
return ""; // return regex of separator of that language
}
public int wordCount(String sentance){
char unicodeChar = sentance.charAt(0);
String separator = separatorForLanguage(unicodeChar);
int count = sentance.split(separator).length;
if (separator.isEmpty()) {
count--;
}
return count;
}
这是java中的片段
public static int getWordCount(String string)
{
Pattern pattern = Pattern.compile("[\\w']+|[\\u3400-\\u4DB5\\u4E00-\\u9FCC]");
Matcher matcher = pattern.matcher(string);
int count = 0;
while(matcher.find())
count++;
return count;
}
例子
//count is 5
int wordCount = getWordCount("this is popcorny's 電腦");
英文版
对于英文版,您可以使用相当简单的 Regex。我可能错过了一些自定义分隔符,但是:
public static int getWordCount(String str) {
return str.split("[\\s,;-]+").length;
}
正则表达式解释:
如果在组中找到任何内容,则拆分[]
:
[
\\s Any whitespace character or
, A comma
; or a semi-colon
]
+ Followed by any patterns in the group any number of times
中文版
对于中文版,您需要识别分隔符是什么。如果你得到中文分隔符的 Unicode 字符代码并将它们添加到上面的正则表达式中,你会得到想要的结果。
测试
System.out.println(getWordCount("This is a sentence"));// 4
System.out.println(getWordCount("This is a sentence")); // 4
System.out.println(getWordCount("This is a ,,sentence")); // 4