如何重写文本清理函数并使其更高效?
import com.ibm.icu.text.Normalizer2
// A whitespace character: [ tnx0Bfr]
private val whiteSpaceRegex = "\p{Space}"
// Any except letter (subtraction)
private val exceptLetterRegex = "[^\p{L}]"
val normalize = (str: String) => Normalizer2.getNFKCCasefoldInstance.normalize(str)
val cleanse = (str: String) => normalize(str) // 1
.toLowerCase // 2
.split(whiteSpaceRegex) // 3
.filterNot( // 4
p => p.startsWith("@") || p.startsWith("/") || p.startsWith("http") || p.startsWith("www")
).mkString(" ") // 5
.replaceAll("-", "") // 6
.replaceAll(exceptLetterRegex, " ") // 7
.replaceAll("\s{2,}", " ") // 8
.trim // 9
- 规范字符串中的字母
- 将字符串改为小写
- 按空格将字符串拆分为数组[string]
- 过滤掉特定于Twitter的单词:链接、昵称
- 再次生成字符串
- 用连字符粘单词(比如:前妻对前妻(
- 用空格替换除字母以外的所有字母
- 用单个空间替换多个空间
- 删除第一个和最后一个空格
测试:
val strMultiLine =
"""RT @digger: Что-то пиддес52 :|
и так скучать( HERE_HTTP_T_DOT_CO_LINK что,я +100500 surf cвихнусь так D:"""
val res1 = "rt чтото пиддес и так скучать что я surf cвихнусь так d"
cleanse(strMultiLine) must equal(res1)
val strWithLineBreak =
"Говорит: ""Кто то в углу сидит))) и погибает от голода!!! мы,хотя уже сидим из-за"" :DD …"
val res2 = "говорит кто то в углу сидит и погибает от голода мы хотя уже сидим изза dd"
cleanse(strWithLineBreak) must equal(res2)
- HERE_HTTP_T_DOT_CO_LINK--堆栈溢出要求我从文本中删除链接
看起来没有太多的增强空间。我可以建议将删除链接或提及的第一部分和非字母删除缩小到一个正则表达式中,但您需要事先删除连字符,然后:
val cleanse2 = (str: String) => normalize(str) // Normalize
.replace("-","") // Remove -
.replaceAll("""(?<!S)(?:[@/]|http|www)S*|P{L}""", " ") // Remove entities
.replaceAll("""s{2,}""", " ") // Shrink whitespaces
.trim // Trim the result
.toLowerCase // To lower case
请参阅regex演示。
(?<!S)(?:[@/]|http|www)S*|P{L}
模式与匹配
(?<!S)
-空白或字符串位置的开头必须紧跟在当前位置之前(?:[@/]|http|www)S*
-@
、/
、http
或www
,然后是任何0+个非空白字符|
-或P{L}
-任何非字母字符