7

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

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

getWordCount("供应商代发发货") => 7
getWordCount("This is a sentence") => 4

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

4

5 回答 5

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);

注意:我用谷歌翻译猜测“供应商代发发货”是中文的。显然,我不会说这种语言,所以无法评论输出的正确性。

于 2013-05-19T18:18:42.327 回答
5

“词”的概念可能是微不足道的,也可能是复杂的。这是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ōng​yìng​shāng​</p>

供应商

供应商代<br> 代dài​</p>

代替 / 代为行事 / 代替 / 世代 / 朝代 / 时代 / 时期 / (历史) 时代 / (地质) eon

发<br>发fā​</p>

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

发 HSK 4

发fà​​​​

头发 / 台湾公关 [fa3]

发包裹
</p>

发出/发出货物

退货

这前三个字符似乎形成了一个单词。

于 2013-05-19T18:00:13.173 回答
2

如果我们假设每种语言都有一个(或多个)单词分隔符,并且您可以为这些分隔符构建正则表达式,那么问题可以这样解决:

    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;
    }
于 2013-05-19T18:07:20.603 回答
2

这是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 電腦");
于 2013-08-01T10:24:05.853 回答
1

英文版

对于英文版,您可以使用相当简单的 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
于 2013-05-19T17:42:53.467 回答