最近做文本去重,使用simhash算法,首先需要对文本进行分词或者分字,两者使用情况稍有偏差,分词我们使用的时基于hanlp的分词算法,本文介绍第二种文本分字算法,连续的英文字母或者数字分为一个字。scala代码如下:
package com.test.xtf
import scala.collection.mutable.ListBuffer
import scala.util.control.Breaks._
/**
* 将文本分字,连续的英文数字记为一个词
*/
object TotalWordSegment {
def toWordList(text: String): List[String] = {
val chars = text.toCharArray
var sb = new StringBuilder
val sentences = new ListBuffer[String]
val charIndex = Array.range(0, chars.length)
charIndex.foreach{i =>
breakable{
if(sb.isEmpty && Character.isWhitespace(chars(i)) && chars(i).equals(""))
break()
}
sb.append(chars(i))
if(chars(i) >= 48 && chars(i) <= 122){
if(i < chars.length - 1 && (chars(i + 1) < 48 || chars(i + 1) > 122)){
insertIntoList(sb, sentences)
sb = new StringBuilder
}
}else{
insertIntoList(sb, sentences)
sb = new StringBuilder
}
}
if(sb.nonEmpty) insertIntoList(sb, sentences)
sentences.toList
}
private def insertIntoList(builder: StringBuilder, strings: ListBuffer[String]): Unit ={
val content = builder.toString().trim
if(content.length > 0) strings.append(content)
}
def main(args: Array[String]): Unit = {
val tmplist = toWordList("今天天气真好啊huawei xiaomi 889")
println(tmplist)
}
}
控制台输出结果
List(今, 天, 天, 气, 真, 好, 啊, huawei, xiaomi, 889)
关注微信公众号【飞哥大数据】,回复666 获取2022年100+公司面试真题,以及spark与flink面试题汇总