テキストクリーニング機能を書き直して効率を上げるにはどうすればよいですか?
import com.ibm.icu.text.Normalizer2
// A whitespace character: [ \t\n\x0B\f\r]
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
テスト:
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)
多くの機能強化の余地はあまりないようです。リンクやメンションを削除する最初の部分と、文字以外の削除を1つの正規表現に縮小することをお勧めしますが、事前にハイフンを削除する必要があります。
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
正規表現のデモを参照してください。
(?<!\S)(?:[@/]|http|www)\S*|\P{L}
パターンマッチ
(?<!\S)
-空白または文字列の開始位置は、現在の位置の直前になければなりません(?:[@/]|http|www)\S*
- 、、または、その後、任意の0+非空白の文字@
/
http
www
|
-または\P{L}
-文字以外の文字。この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加