搜狗实验室新闻数据-分词

910 阅读2分钟

搜狗实验室新闻数据可以用于文本分类、新词发现、命名实体识别、自动摘要等。在解码和分词时遇到了几个问题,这里总结一下。

解码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