88540591 2020-06-04
背景:最近在做中文分词的时候,发现分词后的数据中出现很多特殊字符,即使进行了去停用词操作,但是特殊字符太多,也不可能都加到停用词里,所以就准备用正则去掉,正则很简单,直接上代码:
/** * 正则去掉unicode等特殊字符 * */ private static String regularFilter(String text) { /** * \p{L}或\p{Letter}:来自任何语言的任何形式的字母。 * \p{Ll}或\p{Lowercase_Letter}:小写字母,带有大写字母。 * \p{Lu}或\p{Uppercase_Letter}:具有小写字母变体的大写字母。 * \p{Lt}或\p{Titlecase_Letter}:仅当单词的第一个字母大写时,出现在单词开头的字母。 * \p{L&}或\p{Cased_Letter}:存在小写和大写变体(Ll,Lu和Lt的组合)的字母。 * \p{Lm}或\p{Modifier_Letter}:一个特殊字符,用作字母。 * \p{Lo}或\p{Other_Letter}:没有小写和大写变体的字母或表意文字。 * \p{M}或\p{Mark}:打算与另一个字符组合的字符(例如重音符号,变音符,封闭框等)。 * \p{Mn}或\p{Non_Spacing_Mark}:旨在与另一个字符组合而又不占用多余空间(例如重音符号,变音符号等)的字符。 * \p{Mc}或\p{Spacing_Combining_Mark}:一个字符,旨在与另一个占用额外空间的字符组合(许多东方语言中的元音符号)。 * \p{Me}或\p{Enclosing_Mark}:一个字符,它将与之组合的字符括起来(圆形,正方形,键帽等)。 * \p{Z}或\p{Separator}:任何类型的空格或不可见的分隔符。 * \p{Zs}或\p{Space_Separator}:一个不可见但占用空间的空白字符。 * \p{Zl}或\p{Line_Separator}:行分隔符U + 2028。 * \p{Zp}或\p{Paragraph_Separator}:段落分隔符U + 2029。 * \p{S}或\p{Symbol}:数学符号,货币符号,装饰符号,画框的字符等。 * \p{Sm}或\p{Math_Symbol}:任何数学符号。 * \p{Sc}或\p{Currency_Symbol}:任何货币符号。 * \p{Sk}或\p{Modifier_Symbol}:组合字符(标记)本身就是完整字符。 * \p{So}或\p{Other_Symbol}:不是数学符号,货币符号或组合字符的各种符号。 * \p{N}或\p{Number}:任何脚本中的任何数字字符。 * \p{Nd}或\p{Decimal_Digit_Number}:除表意文字外,任何文字中的数字从零到九。 * \p{Nl}或\p{Letter_Number}:看起来像字母的数字,例如罗马数字。 * \p{No}或\p{Other_Number}:上标或下标数字,或者不是0到9的数字(表意文字中的数字除外)。 * \p{P}或\p{Punctuation}:任何一种标点符号。 * \p{Pd}或\p{Dash_Punctuation}:任何类型的连字符或破折号。 * \p{Ps}或\p{Open_Punctuation}:任何类型的左括号。 * \p{Pe}或\p{Close_Punctuation}:任何类型的右括号。 * \p{Pi}或\p{Initial_Punctuation}:任何形式的开头引号。 * \p{Pf}或\p{Final_Punctuation}:任何形式的结束语。 * \p{Pc}或\p{Connector_Punctuation}:标点符号,例如连接单词的下划线。 * \p{Po}或\p{Other_Punctuation}:不是破折号,方括号,引号或连接符的任何一种标点符号。 * \p{C}或\p{Other}:不可见的控制字符和未使用的代码点。 * \p{Cc}或\p{Control}:ASCII或Latin-1控制字符:0x00–0x1F和0x7F–0x9F。 * \p{Cf}或\p{Format}:不可见的格式指示符。 * \p{Co}或\p{Private_Use}:保留供私人使用的任何代码点。 * \p{Cs}或\p{Surrogate}:采用UTF-16编码的一对代理对的一半。 * \p{Cn}或\p{Unassigned}:未分配任何字符的任何代码点。 * */ // 替换成",",防止本来不是一起的词被分配到一起影响分词结果,同时","会被停用词去掉 return text.replaceAll("[\\pM\\pZ\\pS\\pN\\pP\\pC]+", ","); }
如代码中注释所示,通过使用正则来匹配Unicode所属类别,直接过滤掉了Unicode,非常方便!
注意的是,正则中没有使用“\p{L}”,这是因为“\p{L}”也会过滤掉中文字符,需要注意,其它的自己看说明并尝试下,就比较清楚了!