分类 自然语言处理 下的文章

使用unicodedata和regex将文本中的组合字符拆分

文本处理时有时候需要将组合字符对应到同一个字符,不同种类的组合字符拆分的结果会有区别,这里的组合字符以法语字符举例。

代码示例如下:

import regex as re
import unicodedata
text = u'à ? ? è é ê ? ? ? ? ù ? ? ?'
print (text)
text = unicodedata.normalize('NFD',text)
print (text)
text = re.sub(ur'\p{M}',u'',text)
print (text)

输出结果为:

à ? ? è é ê ? ? ? ? ù ? ? ?
a? a? c? e? e? e? e? i? i? o? u? u? ? C?
a a c e e e e i i o u u ? C

其中的NFD可以换成NFKD,在当前情况下结果相同,在控制台中的输出和这里显示的有些不一样。

unicodedata.png

第二行中的数据被拆分为:

u'a\u0300 a\u0302 c\u0327 e\u0300 e\u0301 e\u0302 e\u0308 i\u0302 i\u0308 o\u0302 u\u0300 u\u0302 \u0153 C\u0327'


python中正则表达式regex库的使用

python中内置了re模块,可以根据正则表达式处理字符串,对于一些问题,使用regex库可以更方便的解决。

安装:

sudo pip install regex

我使用的版本为python2.7,在处理unicode字符串时需要指定字符编码,python3需要进行相应修改。

载入文本:

f = codecs.open(PATH,'r','utf-8')
lines = f.readlines()

通过pandas载入文件:

df = pandas.read_csv(PATH,encoding='utf-8')

Unicode字符编码分为如下几类,具体的分类可以参考:https://www.cnblogs.com/qixuejia/p/4211428.html

P:标点字符;

L:字母; 

M:标记符号(一般不会单独出现);

Z:分隔符(比如空格、换行等);

S:符号(比如数学符号、货币符号等);

N:数字(比如阿拉伯数字、罗马数字等);

C:其他字符

使用如下代码可以将字符串text中的标点字符和数字全部替换为空格,可以根据情况自行修改。

import regex as re
text = re.sub(ur"\p{P}+|\p{N}+", u' ', text)