搜狗实验室新闻数据可以用于文本分类、新词发现、命名实体识别、自动摘要等。在解码和分词时遇到了几个问题,这里总结一下。
解码GB18030
import chardet
file = open('.../....','r').read()
chardet.detect(data)
#{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
虽然解析为GB2312,但是用GB2312和GBK解码都存在乱码问题,需要用GB18030解码。关系是GB18030兼容GBK,GBK兼容GB2312,GB2312兼容ASCII。GB18030和GBK都是四个字节,GB2312两个字节,ASCII一个字节。可以兼容的原因是前两字节没有重叠,具体编码可以不用理会。GBK不兼容的字符是。
file = open(path,'r',encoding='gb18030')
提取标题和内容
因为内容是中文且格式比较固定,去掉标题内容行头尾的格式的字符就可以。用的简单的方法strip,如下
line = line.strip('</contenttitle>\n')+'\n' #句子以\n结尾,不加\n用strip的话,句尾的格式符号去不掉
全角数字字母jieba分词
分词用了StanfordCoreNLP和jieba分词,jieba分词中数字及英文词分错。发现其中的数字英文字母及标点都是全角形式,因此如果想用jieba继续处理的话需要转为半角。
ord('1') # 49
ord('1') # 65297
def Q2B_09az(char): #这个只转换0-9 a-z A-Z
if (char >= u'\uff10' and char <= u'\uff19') or (char >= u'\uff21' and char <= u'\uff3a') or (char >= u'\uff41' and char <= u'\uff5a'):
char = ord(char)
char -=0xfee0
char = chr(char)
return char
def Q2B(uchar): #网上查到的方法,标点符号有英文表示的也转换了,例如,到, 另外。《等没有变化
inside_code = ord(uchar)
if inside_code == 0x3000:
inside_code = 0x0020
else:
inside_code -= 0xfee0
if inside_code < 0x0020 or inside_code > 0x7e:
return uchar
return chr(inside_code)
具体细节不再描述,完整代码见 github