给定一组包含中文字符,基于拉丁字母的单词或两者混合的单词,我想获得单词count。
即便:
this is just an example
这只是个例子
理想情况下应该给出10个单词;但是,当然,如果没有字典,例子最好被视为两个独立的字符。因此,这里也可以接受11个单词/字符的计数。
显然,wc -w
不起作用。它将6个汉字/ 5个单词视为1个“单词”,并返回总共6个单词。
我该怎么办?我愿意尝试不同的语言,尽管bash和python现在对我来说是最快的。
答案 0 :(得分:3)
您应该在Unicode word boundaries上拆分文本,然后计算包含字母或表意符号的元素。如果您正在使用Python,则可以使用uniseg或nltk包。另一种方法是简单地使用Unicode-aware regexes,但这些只会在simple word boundaries上中断。另请参阅问题Split unicode string on word boundaries。
请注意,对于某些语言,您需要更复杂的基于字典的解决方案。 UAX#29声明:
对于Thai,Lao,Khmer,Myanmar和其他通常不在单词之间使用空格的脚本,一个好的实现不应该依赖于默认的单词边界规范。它应该使用更复杂的机制,这也是断线所必需的。日语和中文等表意文字剧本更为复杂。如果韩文文本没有空格,则同样适用。但是,由于缺乏更复杂的机制,本附件中规定的规则提供了明确的默认值。
答案 1 :(得分:0)
我想到了一个快速的黑客,因为中文字符在UTF8中是3个字节长:
(伪代码)
for each character:
if character (byte) begins with 1:
add 1 to total chinese chars
if it is a space:
add 1 to total "normal" words
if it is a newline:
break
然后取total chinese chars / 3 + total words
得到每一行的总和。这将对混合语言的情况给出错误的计数,但应该是一个良好的开端。
这是test
但是,上面的句子总共会给出2个(每个汉字1个)。需要两种语言之间的空格才能给出正确的计数。