中文预处理流程(以搜狐语料全网新闻数据为例)

数据集

使用了搜狗实验室公开语料集-全网新闻数据(SogouCA),完整语料包含来自若干新闻站点2012年6月—7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据,提供URL和正文信息。
其格式为:

<doc>
<url>页面URL</url>
<docno>页面ID</docno>
<contenttitle>页面标题</contenttitle>
<content>页面内容</content>
</doc>

注意:content字段去除了HTML标签,保存的是新闻正文文本。

本文使用了其迷你版(样例数据, 101KB),下载地址

读取数据

编码错误

此数据集直接使用GBK编码读取会报错,原因是编码错误。

f = open('news_tensite_xml.smarty.dat','r',encoding='gbk')
try:
    f.readline()
except Exception as e:
    print(e)
f.close()
'gbk' codec can't decode byte 0xfd in position 440: illegal multibyte sequence

检测编码类型

因此需要对文件的编码进行分析,使用的工具是chardet库的detect函数。

f = open('news_tensite_xml.smarty.dat','rb')
import chardet
st = f.read()
print(chardet.detect(st))
f.close()
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

检测结果显示编码有百分之99是GB2312。

读取数据

使用GB2312编码依然会报编码错误,因此在读取过程中可以将其中的错误忽略,也就是设置参数errors='ignore'

f = open('news_tensite_xml.smarty.dat', 'r', encoding='gb2312', errors='ignore')
st = f.read()
f.close()
st[:1500]
'<doc>\n<url>http://news.sohu.com/20120612/n345428229.shtml</url>\n<docno>c172394d49da2142-69713306c0bb3300</docno>\n<contenttitle>公安机关销毁10余万非法枪支\u3000跨国武器走私渐起</contenttitle>\n<content>中广网唐山6月12日消息(记者汤一亮\u3000庄胜春)据中国之声《新闻晚高峰》报道,今天(12日)上午,公安机关2012年缉枪制爆专项行动“统一销毁非法枪爆物品活动”在河北唐山正式启动,10万余只非法枪支、250余吨炸药在全国150个城市被统一销毁。;泼鳎合衷谖倚布,全国缉枪制爆统一销毁行动开始!K孀殴安部副部长黄明一声令下,大量仿制式枪以及猎枪、火药枪、气枪在河北唐山钢铁厂被投入炼钢炉。与此同时,在全国各省区市150个城市,破案追缴和群众主动上缴的10万余支非法枪支被集中销毁,在全国各指定场所,250余吨炸药被分别销毁。公安部治安局局长刘绍武介绍,这次销毁的非法枪支来源于三个方面。A跎芪洌捍蚧髌瓢赴括涉黑、涉恶的团伙犯罪、毒品犯罪,还有从境外非法走私的枪支爆炸物。T谙毁现场,记者看到了被追缴和上缴的各式各样的枪支。A跎芪洌阂舶括制式枪,有的是军用枪、仿制的制式抢,还有猎枪、私制的火药枪等等。按照我国的枪支管理法,这些都是严厉禁止个人非法持有的。中国是世界上持枪犯罪的犯罪率最低的国家之一。V忻懒手破获特大跨国走私武器弹药案=日,中美执法部门联手成功破获特大跨国走私武器弹药案,在中国抓获犯罪嫌疑人23名,缴获各类枪支93支、子弹5万余发及大量枪支配件。在美国抓获犯罪嫌疑人3名,缴获各类枪支12支。这是公安部与美国移民海关执法局通过联合调查方式侦破重大跨国案件的又一成功案例。#玻埃保蹦辏冈拢玻等眨上海浦东国际机场海关在对美国纽约发往浙江台州,申报品名为扩音器(音箱)的快件进行查验时,发现货物内藏有手枪9支,枪支配件9件,长枪部件7件。经检验,这些都是具有杀伤力的制式枪支及其配件。这引起了公安部和海关总署的高度重视。9安部刑侦局局长刘安成:因为是从海关进口的货物中检查出来夹带,说明来源地是境外,或是说国外,这应该是一起特大跨国走私武器弹药的案件。I虾J泄安局和上海海关缉私局成立联合专案组,迅速开展案件侦查。专案组于8月26日在浙江台州UPS取件处将犯罪嫌疑人王挺(男,32岁,台州市人)抓获。王挺交代,他通过一境外网站上认识了上家林志富,2009年11月以来,林志富长期居住美国,他通过互联网组建了一个走私、贩卖、私藏枪支弹药的群体,通过网络在国内寻找枪支弹药买家,并通过美国UPS联邦速递公司将枪支弹药从纽约快递给多名类似王挺的中间人,再通过中间人发送给国内买家。4税钢校犯罪分子依托虚拟网络进行犯罪交易,隐蔽性强,涉案人员使用的身份、地址、联系方式都是虚构的,侦查难度很大。刘安成说,此案体现了是新型犯罪,特别是现代犯罪的新特点。A醢渤桑核不受距离的限制、经常是跨国跨境,甚至是跨一个、数个、甚至数十个国家。这种犯罪手法的改变和新型犯罪的特点,要求我们各国警方充分合作。W髡撸禾酪涣痢∽胜春</content>\n</doc>\n<doc>\n<url>http://news.sohu.com/20120607/n344998325.shtml</url>\n<docno>dbb4554e49da2142-69713306c0bb3300</docno>\n<contenttitle>张绍刚发道歉信网友不认可:他的问题是俯视他人(图)<'

经过手工尝试发现使用编码GB18030可以正确的解码整个文件。

f = open('news_tensite_xml.smarty.dat', 'r', encoding='gb18030 ')
st = f.read()
f.close()
st[:1500]
'<doc>\n<url>http://news.sohu.com/20120612/n345428229.shtml</url>\n<docno>c172394d49da2142-69713306c0bb3300</docno>\n<contenttitle>公安机关销毁10余万非法枪支\u3000跨国武器走私渐起</contenttitle>\n<content>中广网唐山6月12日消息(记者汤一亮\u3000庄胜春)据中国之声《新闻晚高峰》报道,今天(12日)上午,公安机关2012年缉枪制爆专项行动“统一销毁非法枪爆物品活动”在河北唐山正式启动,10万余只非法枪支、250余吨炸药在全国150个城市被统一销毁。\ue40c黄明:现在我宣布,全国缉枪制爆统一销毁行动开始!\ue40c随着公安部副部长黄明一声令下,大量仿制式枪以及猎枪、火药枪、气枪在河北唐山钢铁厂被投入炼钢炉。与此同时,在全国各省区市150个城市,破案追缴和群众主动上缴的10万余支非法枪支被集中销毁,在全国各指定场所,250余吨炸药被分别销毁。公安部治安局局长刘绍武介绍,这次销毁的非法枪支来源于三个方面。\ue40c刘绍武:打击破案包括涉黑、涉恶的团伙犯罪、毒品犯罪,还有从境外非法走私的枪支爆炸物。\ue40c在销毁现场,记者看到了被追缴和上缴的各式各样的枪支。\ue40c刘绍武:也包括制式枪,有的是军用枪、仿制的制式抢,还有猎枪、私制的火药枪等等。按照我国的枪支管理法,这些都是严厉禁止个人非法持有的。中国是世界上持枪犯罪的犯罪率最低的国家之一。\ue40c中美联手破获特大跨国走私武器弹药案\ue40c近日,中美执法部门联手成功破获特大跨国走私武器弹药案,在中国抓获犯罪嫌疑人23名,缴获各类枪支93支、子弹5万余发及大量枪支配件。在美国抓获犯罪嫌疑人3名,缴获各类枪支12支。这是公安部与美国移民海关执法局通过联合调查方式侦破重大跨国案件的又一成功案例。\ue40c2011年8月25日,上海浦东国际机场海关在对美国纽约发往浙江台州,申报品名为扩音器(音箱)的快件进行查验时,发现货物内藏有手枪9支,枪支配件9件,长枪部件7件。经检验,这些都是具有杀伤力的制式枪支及其配件。这引起了公安部和海关总署的高度重视。\ue40c公安部刑侦局局长刘安成:因为是从海关进口的货物中检查出来夹带,说明来源地是境外,或是说国外,这应该是一起特大跨国走私武器弹药的案件。\ue40c上海市公安局和上海海关缉私局成立联合专案组,迅速开展案件侦查。专案组于8月26日在浙江台州UPS取件处将犯罪嫌疑人王挺(男,32岁,台州市人)抓获。王挺交代,他通过一境外网站上认识了上家林志富,2009年11月以来,林志富长期居住美国,他通过互联网组建了一个走私、贩卖、私藏枪支弹药的群体,通过网络在国内寻找枪支弹药买家,并通过美国UPS联邦速递公司将枪支弹药从纽约快递给多名类似王挺的中间人,再通过中间人发送给国内买家。\ue40c此案中,犯罪分子依托虚拟网络进行犯罪交易,隐蔽性强,涉案人员使用的身份、地址、联系方式都是虚构的,侦查难度很大。刘安成说,此案体现了是新型犯罪,特别是现代犯罪的新特点。\ue40c刘安成:他不受距离的限制、经常是跨国跨境,甚至是跨一个、数个、甚至数十个国家。这种犯罪手法的改变和新型犯罪的特点,要求我们各国警方充分合作。\ue40c作者:汤一亮\u3000庄胜春</content>\n</doc>\n<doc>\n<url>http://news.sohu.com/20120607/n344998325.shtml</url>\n<docno>dbb4554e49da2142-69713306c0bb3300</docno>\n<contenttitle>张绍刚发道歉信网友不认可:'

提取url和content

import re
from collections import Counter
# 定义正则表达式
url_pattern = re.compile(r'<url>(.*?)</url>', re.S)
content_pattern = re.compile(r'<content>(.*?)</content>', re.S)

# 正则匹配出url和content
urls = url_pattern.findall(st)
contents = content_pattern.findall(st)

提取类别

使用正则表达式

可以使用正则表达式,提取url中文本的网址所在栏目信息,作为信息的分类。

classes = []
patternClass = re.compile(r'http://(.*?).com', re.S)
for i in range(urls.__len__()):
    classes.append(patternClass.findall(urls[i])[0])
Counter(classes)
Counter({'news.sohu': 16,
         'biz.cn.yahoo': 61,
         'club.news.sohu': 2,
         'news.cn.yahoo': 121})

这种提取方式需要url中网站的栏目信息按照固定规则编写,url不规范会导致提取结果不可用或者提取信息混乱,而且,不同网站的url需要选用不同的正则表达式提取。

Counter(classes)
Counter({'搜狐新闻': 16, '财经': 52, '雅虎新闻': 130, '搜狐社区': 2})

预定义类别字典

contents[87]
'网贴中附带的女子被杀现场图片。\ue40c大众网5月31日曲阜讯(记者\u3000刘国栋\u3000通讯员\u3000胡勇\u3000孔猛)\u3000近日,一淄博男青年因女友与其分手,追女友至曲阜,将女友杀死后逃之夭夭。案件发生后,曲阜市公安局仅用了50个小时将此案侦破,在深圳将该男青年抓获归案。\ue40c5月25日13时许,曲阜市公安局110指挥中心接群众报警称:在曲阜明故城北门外东空地间有一名青年女子倒在地上,身下有大量血迹。随后120赶到,证实该女子已经死亡。接警后,曲阜市公安局立即组织刑警大队、交警大队、巡警大队、北关派出所民警赶赴现场,并立即组成专案组开展侦破。\ue40c经初步调查,该女子系淄博市人邢某某,22岁,案发前在济南某教育设备有限责任公司实习,并于5月23日随公司其他人员到曲阜开展业务。专案组开展缜密侦查,确定邢某某的前男友陈龙为重大嫌疑人,并采取措施实施抓捕。抓捕民警分组前往淄博、济南、天津、深圳等地开展工作,并于5月27日15时许,在深圳市罗湖区警方的大力协助下,将陈龙抓获归案。\ue40c经审查:犯罪嫌疑人陈龙,男,24岁,淄博市淄川区太河镇人,因感情纠葛多次纠缠邢某某,5月24日从天津追至曲阜;25日13时许,窜至案发现场实施了杀人行为。\ue40c目前,陈龙已被刑事拘留,案件正在进一步审理中。'

预定义分类及其包含的类别信息。

categories={
    
    '搜狐新闻':['http://news.sohu.com'],
            '财经':['http://biz.cn.yahoo.com/ypen'],
            '雅虎新闻':['http://biz.cn.yahoo.com/newspic','http://news.cn.yahoo.com/'],
            '搜狐社区':['http://club.news.sohu.com'],
            '社会':['http://news.cn.yahoo.com/newspic/society/']
            }
classes = []
class_dict = {
    
    }
for i,url in enumerate(urls):
    flag = False
    label = None
    for k, v in categories.items():
        for url_list in v:
            if url_list in url:
                flag = True
                label = k
#                 print(k)
                break
        if flag:
            break
    classes.append(label)
Counter(classes)
Counter({'搜狐新闻': 16, '财经': 52, '雅虎新闻': 130, '搜狐社区': 2})

这样允许用户可以灵活的定义类别,精确性也有一定的保证。

筛选长度大于l的数据

n=50
class_l=[]
contents_l=[]
for c,t in zip(classes,contents):
    if len(t)>n:
        class_l.append(c)
        contents_l.append(t)

去除指定无用的符号

首先查看下去除前,列表中的第二个文本:

contents_l[2]
'临沂(山东),2012年6月4日\u3000夫妻“麦客”忙麦收\u30006月4日,在山东省临沂市郯城县郯城街道米顶村麦田间,范加江驾驶收割机在收获小麦。\u3000三夏时节,山东小麦主产区处处可见“麦客”驾驶联合收割机在麦田中来回穿梭。生活在郯城县郯城街道东风村的范加江、赵琴兰夫妇就是众多“麦客”中的一对。小两口于2011年投资11万多元购买了一台大型小麦联合收割机,成为村里第一对夫妻“麦客”。麦收时节,天一刚亮,夫妻俩就开始为农户收割小麦,中午在田间地头凑合填饱肚子,晚上有时要干到十一、二点。夫妻俩各自分工,丈夫收割,妻子负责量地、看路、买油、替农户装粮袋等。忙的时候,一天能收割60多亩,一个麦季下来能挣2万多元。\u3000在郯城县,有200多对夫妻“麦客”驾驶联合收割机忙碌在田间地头。他们辛勤忙碌在麦收一线,为小麦及时归仓挥洒着辛勤的汗水,同时通过劳动也为自己带来了稳定的收入。\u3000新华社发(张春雷\u3000摄)'

使用replace

如果只移除一个字符可以使用replace。

# 去掉文本中的\u3000
def process(our_data):
    m1 = map(lambda s: s.replace('\u3000', ''), our_data)
    return list(m1)
content_rm_sign = process(contents_l)
content_rm_sign[2]
'临沂(山东),2012年6月4日夫妻“麦客”忙麦收6月4日,在山东省临沂市郯城县郯城街道米顶村麦田间,范加江驾驶收割机在收获小麦。三夏时节,山东小麦主产区处处可见“麦客”驾驶联合收割机在麦田中来回穿梭。生活在郯城县郯城街道东风村的范加江、赵琴兰夫妇就是众多“麦客”中的一对。小两口于2011年投资11万多元购买了一台大型小麦联合收割机,成为村里第一对夫妻“麦客”。麦收时节,天一刚亮,夫妻俩就开始为农户收割小麦,中午在田间地头凑合填饱肚子,晚上有时要干到十一、二点。夫妻俩各自分工,丈夫收割,妻子负责量地、看路、买油、替农户装粮袋等。忙的时候,一天能收割60多亩,一个麦季下来能挣2万多元。在郯城县,有200多对夫妻“麦客”驾驶联合收割机忙碌在田间地头。他们辛勤忙碌在麦收一线,为小麦及时归仓挥洒着辛勤的汗水,同时通过劳动也为自己带来了稳定的收入。新华社发(张春雷摄)'

由结果可见字符\u3000全部被移除。

使用正则公式

正则公式可以一次性移除多个字符。

import re
# 去掉文本中的\u3000以及、
pattern = '\u3000|、'
def process(our_data,pattern):
    m1 = map(lambda s: re.sub(pattern, '',s), our_data)
    return list(m1)
content_rm_sign = process(contents_l,pattern)
content_rm_sign[2]
'临沂(山东),2012年6月4日夫妻“麦客”忙麦收6月4日,在山东省临沂市郯城县郯城街道米顶村麦田间,范加江驾驶收割机在收获小麦。三夏时节,山东小麦主产区处处可见“麦客”驾驶联合收割机在麦田中来回穿梭。生活在郯城县郯城街道东风村的范加江赵琴兰夫妇就是众多“麦客”中的一对。小两口于2011年投资11万多元购买了一台大型小麦联合收割机,成为村里第一对夫妻“麦客”。麦收时节,天一刚亮,夫妻俩就开始为农户收割小麦,中午在田间地头凑合填饱肚子,晚上有时要干到十一二点。夫妻俩各自分工,丈夫收割,妻子负责量地看路买油替农户装粮袋等。忙的时候,一天能收割60多亩,一个麦季下来能挣2万多元。在郯城县,有200多对夫妻“麦客”驾驶联合收割机忙碌在田间地头。他们辛勤忙碌在麦收一线,为小麦及时归仓挥洒着辛勤的汗水,同时通过劳动也为自己带来了稳定的收入。新华社发(张春雷摄)'

结果显示,已经成功去除了/u3000和、,如果有其他需要去除的符号还可以在正则表达式pattern中添加,而使用replace实现的话需要多次循环迭代。

全角与半角的转化

#全角转半角
def full_to_half(sentence):      #输入为一个句子
    change_sentence=""
    for word in sentence:
        inside_code=ord(word)
        if inside_code==12288:    #全角空格直接转换
            inside_code=32
        elif inside_code>=65281 and inside_code<=65374:  #全角字符(除空格)根据关系转化
            inside_code-=65248
        change_sentence+=chr(inside_code)
    return change_sentence
contents_half = list(map(lambda s: full_to_half(s), contents_l))
contents_half[2]
'临沂(山东),2012年6月4日 夫妻“麦客”忙麦收 6月4日,在山东省临沂市郯城县郯城街道米顶村麦田间,范加江驾驶收割机在收获小麦。 三夏时节,山东小麦主产区处处可见“麦客”驾驶联合收割机在麦田中来回穿梭。生活在郯城县郯城街道东风村的范加江、赵琴兰夫妇就是众多“麦客”中的一对。小两口于2011年投资11万多元购买了一台大型小麦联合收割机,成为村里第一对夫妻“麦客”。麦收时节,天一刚亮,夫妻俩就开始为农户收割小麦,中午在田间地头凑合填饱肚子,晚上有时要干到十一、二点。夫妻俩各自分工,丈夫收割,妻子负责量地、看路、买油、替农户装粮袋等。忙的时候,一天能收割60多亩,一个麦季下来能挣2万多元。 在郯城县,有200多对夫妻“麦客”驾驶联合收割机忙碌在田间地头。他们辛勤忙碌在麦收一线,为小麦及时归仓挥洒着辛勤的汗水,同时通过劳动也为自己带来了稳定的收入。 新华社发(张春雷 摄)'

可以看到结果中的标点符号由全角变换为半角。

#半角转全角
def half_to_full(sentence):      #输入为一个句子
    change_sentence=""
    for word in sentence:
        inside_code=ord(word)
        if inside_code==32:    #半角空格直接转换
            inside_code=12288
        elif inside_code>=32 and inside_code<=126:  #半角字符(除空格)根据关系转化
            inside_code+=65248
        change_sentence+=chr(inside_code)
    return change_sentence
contents_full = list(map(lambda s: half_to_full(s), contents_half))
contents_full[2]
'临沂(山东),2012年6月4日\u3000夫妻“麦客”忙麦收\u30006月4日,在山东省临沂市郯城县郯城街道米顶村麦田间,范加江驾驶收割机在收获小麦。\u3000三夏时节,山东小麦主产区处处可见“麦客”驾驶联合收割机在麦田中来回穿梭。生活在郯城县郯城街道东风村的范加江、赵琴兰夫妇就是众多“麦客”中的一对。小两口于2011年投资11万多元购买了一台大型小麦联合收割机,成为村里第一对夫妻“麦客”。麦收时节,天一刚亮,夫妻俩就开始为农户收割小麦,中午在田间地头凑合填饱肚子,晚上有时要干到十一、二点。夫妻俩各自分工,丈夫收割,妻子负责量地、看路、买油、替农户装粮袋等。忙的时候,一天能收割60多亩,一个麦季下来能挣2万多元。\u3000在郯城县,有200多对夫妻“麦客”驾驶联合收割机忙碌在田间地头。他们辛勤忙碌在麦收一线,为小麦及时归仓挥洒着辛勤的汗水,同时通过劳动也为自己带来了稳定的收入。\u3000新华社发(张春雷\u3000摄)'

由结果可以看到文本中的标点符号占位由半角转换为全角。

让文本只保留汉字

方法一:for循环

# 让文本只保留汉字
def is_chinese(uchar):
    if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
        return True
    else:
        return False

def format_str(content):
    content_str = ''
    for i in content:
        if is_chinese(i):
            content_str = content_str +return content_str
# 参函数传入的是每一句话
contents_chinese = list(map(lambda s: format_str(s), contents))
contents_chinese[2]
'临沂山东年月日夫妻麦客忙麦收月日在山东省临沂市郯城县郯城街道米顶村麦田间范加江驾驶收割机在收获小麦三夏时节山东小麦主产区处处可见麦客驾驶联合收割机在麦田中来回穿梭生活在郯城县郯城街道东风村的范加江赵琴兰夫妇就是众多麦客中的一对小两口于年投资万多元购买了一台大型小麦联合收割机成为村里第一对夫妻麦客麦收时节天一刚亮夫妻俩就开始为农户收割小麦中午在田间地头凑合填饱肚子晚上有时要干到十一二点夫妻俩各自分工丈夫收割妻子负责量地看路买油替农户装粮袋等忙的时候一天能收割多亩一个麦季下来能挣万多元在郯城县有多对夫妻麦客驾驶联合收割机忙碌在田间地头他们辛勤忙碌在麦收一线为小麦及时归仓挥洒着辛勤的汗水同时通过劳动也为自己带来了稳定的收入新华社发张春雷摄'

方法二:正则公式保留汉字

import re
def Chinese_word_extraction(content_raw):
    chinese_pattern = u"([\u4e00-\u9fa5]+)"
    chi_pattern = re.compile(chinese_pattern)
    re_data = chi_pattern.findall(content_raw)
    content_clean  = ''.join(re_data)
    return content_clean
contents_chinese = list(map(lambda s: Chinese_word_extraction(s), contents))
contents_chinese[2]
'临沂山东年月日夫妻麦客忙麦收月日在山东省临沂市郯城县郯城街道米顶村麦田间范加江驾驶收割机在收获小麦三夏时节山东小麦主产区处处可见麦客驾驶联合收割机在麦田中来回穿梭生活在郯城县郯城街道东风村的范加江赵琴兰夫妇就是众多麦客中的一对小两口于年投资万多元购买了一台大型小麦联合收割机成为村里第一对夫妻麦客麦收时节天一刚亮夫妻俩就开始为农户收割小麦中午在田间地头凑合填饱肚子晚上有时要干到十一二点夫妻俩各自分工丈夫收割妻子负责量地看路买油替农户装粮袋等忙的时候一天能收割多亩一个麦季下来能挣万多元在郯城县有多对夫妻麦客驾驶联合收割机忙碌在田间地头他们辛勤忙碌在麦收一线为小麦及时归仓挥洒着辛勤的汗水同时通过劳动也为自己带来了稳定的收入新华社发张春雷摄'

正则公式去除其他字符

#去除字母数字表情和其它字符
def clear_character(sentence):
    pattern1='[a-zA-Z0-9]'
    pattern2 = '\[.*?\]'
    pattern3 = re.compile(u'[^\s1234567890::' + '\u4e00-\u9fa5]+')
    pattern4='[’!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]+'
    line1=re.sub(pattern1,'',sentence)   #去除英文字母和数字
    line2=re.sub(pattern2,'',line1)   #去除表情
    line3=re.sub(pattern3,'',line2)   #去除其它字符
    line4=re.sub(pattern4, '', line3) #去掉残留的冒号及其它符号
    new_sentence=''.join(line4.split()) #去除空白
    return new_sentence
contents_chinese = list(map(lambda s: clear_character(s), contents))
contents_chinese[2]
'临沂山东年月日夫妻麦客忙麦收月日在山东省临沂市郯城县郯城街道米顶村麦田间范加江驾驶收割机在收获小麦三夏时节山东小麦主产区处处可见麦客驾驶联合收割机在麦田中来回穿梭生活在郯城县郯城街道东风村的范加江赵琴兰夫妇就是众多麦客中的一对小两口于年投资万多元购买了一台大型小麦联合收割机成为村里第一对夫妻麦客麦收时节天一刚亮夫妻俩就开始为农户收割小麦中午在田间地头凑合填饱肚子晚上有时要干到十一二点夫妻俩各自分工丈夫收割妻子负责量地看路买油替农户装粮袋等忙的时候一天能收割多亩一个麦季下来能挣万多元在郯城县有多对夫妻麦客驾驶联合收割机忙碌在田间地头他们辛勤忙碌在麦收一线为小麦及时归仓挥洒着辛勤的汗水同时通过劳动也为自己带来了稳定的收入新华社发张春雷摄'

文本中的表情符号去除

#去除文本中的表情字符(只保留中英文和数字)
def clear_character1(sentence):
    pattern1= '\[.*?\]'     
    pattern2 = re.compile('[^\u4e00-\u9fa5^a-z^A-Z^0-9]')   
    line1=re.sub(pattern1,'',sentence)
    line2=re.sub(pattern2,'',line1)   
    new_sentence=''.join(line2.split()) #去除空白
    return new_sentence
list(map(lambda s: clear_character1(s), contents))[2]
'临沂山东年月日夫妻麦客忙麦收月日在山东省临沂市郯城县郯城街道米顶村麦田间范加江驾驶收割机在收获小麦三夏时节山东小麦主产区处处可见麦客驾驶联合收割机在麦田中来回穿梭生活在郯城县郯城街道东风村的范加江赵琴兰夫妇就是众多麦客中的一对小两口于年投资万多元购买了一台大型小麦联合收割机成为村里第一对夫妻麦客麦收时节天一刚亮夫妻俩就开始为农户收割小麦中午在田间地头凑合填饱肚子晚上有时要干到十一二点夫妻俩各自分工丈夫收割妻子负责量地看路买油替农户装粮袋等忙的时候一天能收割多亩一个麦季下来能挣万多元在郯城县有多对夫妻麦客驾驶联合收割机忙碌在田间地头他们辛勤忙碌在麦收一线为小麦及时归仓挥洒着辛勤的汗水同时通过劳动也为自己带来了稳定的收入新华社发张春雷摄'

繁简转换

langconv

使用的工具是langconv,其可以对汉字进行繁体和简体之间的转换。

from langconv import *
# 转为简体
def Traditional2Simplified(sentence):
    sentence = Converter('zh-hans').convert(sentence)
    return sentence
# 转为繁体
def Simplified2Traditional(sentence):
    sentence = Converter('zh-hant').convert(sentence)
    return sentence
contents_trad = list(map(lambda s: Simplified2Traditional(s), contents))
contents_trad[2]
'臨沂(山東),2012年6月4日\u3000夫妻“麥客”忙麥收\u30006月4日,在山東省臨沂市郯城縣郯城街道米頂村麥田間,範加江駕駛收割機在收穫小麥。\u3000三夏時節,山東小麥主產區處處可見“麥客”駕駛聯合收割機在麥田中來回穿梭。生活在郯城縣郯城街道東風村的範加江、趙琴蘭夫婦就是眾多“麥客”中的一對。小兩口於2011年投資11萬多元購買了一臺大型小麥聯合收割機,成為村裡第一對夫妻“麥客”。麥收時節,天一剛亮,夫妻倆就開始為農戶收割小麥,中午在田間地頭湊合填飽肚子,晚上有時要乾到十一、二點。夫妻倆各自分工,丈夫收割,妻子負責量地、看路、買油、替農戶裝糧袋等。忙的時候,一天能收割60多畝,一個麥季下來能掙2萬多元。\u3000在郯城縣,有200多對夫妻“麥客”駕駛聯合收割機忙碌在田間地頭。他們辛勤忙碌在麥收一線,為小麥及時歸倉揮灑著辛勤的汗水,同時通過勞動也為自己帶來了穩定的收入。\u3000新華社發(張春雷\u3000攝)'

hanziconv

# 繁体转简体
from hanziconv import HanziConv
def tra2sim(content):
    content = HanziConv.toSimplified(content)
    return content
contents_simp = list(map(lambda s: tra2sim(s), contents_trad))
contents_simp[2]
'临沂(山东),2012年6月4日\u3000夫妻“麦客”忙麦收\u30006月4日,在山东省临沂市郯城县郯城街道米顶村麦田间,范加江驾驶收割机在收获小麦。\u3000三夏时节,山东小麦主产区处处可见“麦客”驾驶联合收割机在麦田中来回穿梭。生活在郯城县郯城街道东风村的范加江、赵琴兰夫妇就是众多“麦客”中的一对。小两口于2011年投资11万多元购买了一台大型小麦联合收割机,成为村里第一对夫妻“麦客”。麦收时节,天一刚亮,夫妻俩就开始为农户收割小麦,中午在田间地头凑合填饱肚子,晚上有时要干到十一、二点。夫妻俩各自分工,丈夫收割,妻子负责量地、看路、买油、替农户装粮袋等。忙的时候,一天能收割60多亩,一个麦季下来能挣2万多元。\u3000在郯城县,有200多对夫妻“麦客”驾驶联合收割机忙碌在田间地头。他们辛勤忙碌在麦收一线,为小麦及时归仓挥洒着辛勤的汗水,同时通过劳动也为自己带来了稳定的收入。\u3000新华社发(张春雷\u3000摄)'

opencc

注意,直接使用pip安装opencc会报错,安装指令:pip install opencc-python-reimplemented

from opencc import OpenCC
s2t = OpenCC('s2t')

转换代码

hk2s: 繁体中文(香港标准)转简体中文
s2hk: 简体中文转繁体中文(香港标准)
s2t: 简体中文转繁体中文
s2tw: 简体中文转换成繁体中文(台湾标准)
s2twp: 简体中文转繁体中文(带短语)
t2hk: 繁体中文转繁体(香港标准)
t2s: 繁体中文转简体
t2tw: 繁体中文转繁体(台湾标准)
tw2s: 繁体中文(台湾标准)转简体中文
tw2sp:繁体中文(台湾标准)转简体中文(带短语)
contents_trad = list(map(lambda s: s2t.convert(s), contents))
contents_trad[2]
'臨沂(山東),2012年6月4日\u3000夫妻“麥客”忙麥收\u30006月4日,在山東省臨沂市郯城縣郯城街道米頂村麥田間,範加江駕駛收割機在收穫小麥。\u3000三夏時節,山東小麥主產區處處可見“麥客”駕駛聯合收割機在麥田中來回穿梭。生活在郯城縣郯城街道東風村的範加江、趙琴蘭夫婦就是衆多“麥客”中的一對。小兩口於2011年投資11萬多元購買了一臺大型小麥聯合收割機,成爲村裏第一對夫妻“麥客”。麥收時節,天一剛亮,夫妻倆就開始爲農戶收割小麥,中午在田間地頭湊合填飽肚子,晚上有時要幹到十一、二點。夫妻倆各自分工,丈夫收割,妻子負責量地、看路、買油、替農戶裝糧袋等。忙的時候,一天能收割60多畝,一個麥季下來能掙2萬多元。\u3000在郯城縣,有200多對夫妻“麥客”駕駛聯合收割機忙碌在田間地頭。他們辛勤忙碌在麥收一線,爲小麥及時歸倉揮灑着辛勤的汗水,同時通過勞動也爲自己帶來了穩定的收入。\u3000新華社發(張春雷\u3000攝)'
t2s = OpenCC('t2s')
contents_trad = list(map(lambda s: t2s.convert(s), contents))
contents_trad[2]
'临沂(山东),2012年6月4日\u3000夫妻“麦客”忙麦收\u30006月4日,在山东省临沂市郯城县郯城街道米顶村麦田间,范加江驾驶收割机在收获小麦。\u3000三夏时节,山东小麦主产区处处可见“麦客”驾驶联合收割机在麦田中来回穿梭。生活在郯城县郯城街道东风村的范加江、赵琴兰夫妇就是众多“麦客”中的一对。小两口于2011年投资11万多元购买了一台大型小麦联合收割机,成为村里第一对夫妻“麦客”。麦收时节,天一刚亮,夫妻俩就开始为农户收割小麦,中午在田间地头凑合填饱肚子,晚上有时要干到十一、二点。夫妻俩各自分工,丈夫收割,妻子负责量地、看路、买油、替农户装粮袋等。忙的时候,一天能收割60多亩,一个麦季下来能挣2万多元。\u3000在郯城县,有200多对夫妻“麦客”驾驶联合收割机忙碌在田间地头。他们辛勤忙碌在麦收一线,为小麦及时归仓挥洒着辛勤的汗水,同时通过劳动也为自己带来了稳定的收入。\u3000新华社发(张春雷\u3000摄)'

大写数字转换为小写数字

#大写数字转换为小写数字
def big2small_num(sentence):
    numlist = {
    
    "一":"1","二":"2","三":"3","四":"4","五":"5","六":"6","七":"7","八":"8","九":"9","零":"0"}
    for item in numlist:
        sentence = sentence.replace(item, numlist[item])
    return sentence
list(map(lambda s: big2small_num(s), contents))[2]
'临沂(山东),2012年6月4日\u3000夫妻“麦客”忙麦收\u30006月4日,在山东省临沂市郯城县郯城街道米顶村麦田间,范加江驾驶收割机在收获小麦。\u30003夏时节,山东小麦主产区处处可见“麦客”驾驶联合收割机在麦田中来回穿梭。生活在郯城县郯城街道东风村的范加江、赵琴兰夫妇就是众多“麦客”中的1对。小两口于2011年投资11万多元购买了1台大型小麦联合收割机,成为村里第1对夫妻“麦客”。麦收时节,天1刚亮,夫妻俩就开始为农户收割小麦,中午在田间地头凑合填饱肚子,晚上有时要干到十1、2点。夫妻俩各自分工,丈夫收割,妻子负责量地、看路、买油、替农户装粮袋等。忙的时候,1天能收割60多亩,1个麦季下来能挣2万多元。\u3000在郯城县,有200多对夫妻“麦客”驾驶联合收割机忙碌在田间地头。他们辛勤忙碌在麦收1线,为小麦及时归仓挥洒着辛勤的汗水,同时通过劳动也为自己带来了稳定的收入。\u3000新华社发(张春雷\u3000摄)'

字母大小写转换

大写字母转为小写字母

#大写字母转为小写字母
def upper2lower(sentence):
    new_sentence=sentence.lower()
    return new_sentence
upper2lower('ABcDEF')
'abcdef'

小写字母转为大写字母

#小写字母转为大写字母
def lower2upper(sentence):
    new_sentence=sentence.upper()
    return new_sentence
lower2upper('abcDE')
'ABCDE'

分词

结巴分词

chinese_list = ['如果这篇文章对你有所帮助那就点个赞呗', '如果想联系炼己者的话那就打电话', '想学习那就来关注呀']

# 对文本进行jieba分词
import jieba
def fenci(datas):
    cut_words = map(lambda s: list(jieba.cut(s)), datas)
    return list(cut_words)

print(fenci(contents)[2])
['临沂', '(', '山东', ')', ',', '2', '0', '1', '2', '年', '6', '月', '4', '日', '\u3000', '夫妻', '“', '麦客', '”', '忙', '麦收', '\u3000', '6', '月', '4', '日', ',', '在', '山东省', '临沂市', '郯城县', '郯城', '街道', '米', '顶村', '麦田', '间', ',', '范加江', '驾驶', '收割机', '在', '收获', '小麦', '。', '\u3000', '三夏', '时节', ',', '山东', '小麦', '主产区', '处处', '可见', '“', '麦客', '”', '驾驶', '联合', '收割机', '在', '麦田', '中', '来回', '穿梭', '。', '生活', '在', '郯城县', '郯城', '街道', '东风村', '的', '范加江', '、', '赵琴兰', '夫妇', '就是', '众多', '“', '麦客', '”', '中', '的', '一对', '。', '小两口', '于', '2', '0', '1', '1', '年', '投资', '1', '1', '万多元', '购买', '了', '一台', '大型', '小麦', '联合', '收割机', ',', '成为', '村里', '第一', '对', '夫妻', '“', '麦客', '”', '。', '麦收', '时节', ',', '天一', '刚亮', ',', '夫妻俩', '就', '开始', '为', '农户', '收割', '小麦', ',', '中午', '在', '田间', '地头', '凑合', '填饱', '肚子', ',', '晚上', '有时', '要', '干到', '十一', '、', '二点', '。', '夫妻俩', '各自', '分工', ',', '丈夫', '收割', ',', '妻子', '负责', '量', '地', '、', '看路', '、', '买油', '、', '替', '农户', '装', '粮袋', '等', '。', '忙', '的', '时候', ',', '一天', '能', '收割', '6', '0', '多亩', ',', '一个', '麦季', '下来', '能', '挣', '2', '万多元', '。', '\u3000', '在', '郯城县', ',', '有', '2', '0', '0', '多', '对', '夫妻', '“', '麦客', '”', '驾驶', '联合', '收割机', '忙碌', '在', '田间', '地头', '。', '他们', '辛勤', '忙碌', '在', '麦收', '一线', ',', '为', '小麦', '及时', '归仓', '挥洒', '着', '辛勤', '的', '汗水', ',', '同时', '通过', '劳动', '也', '为', '自己', '带来', '了', '稳定', '的', '收入', '。', '\u3000', '新华社', '发', '(', '张', '春雷', '\u3000', '摄', ')']

分词带词性标注过滤词性

https://www.cnblogs.com/baiboy/p/7676251.html

停用词

https://github.com/foowaa/Chinese_from_dongxiexidian

def get_stop_words():
    path = "stop_words"
    file = open(path, 'rb').read().decode('utf-8').split('\r\n')
    return set(file)
# 分好词的数据
fenci_list = [['如果', '这', '篇文章', '对', '你', '有所', '帮助', '那', '就', '点个', '赞', '呗'],
 ['如果', '想', '联系', '炼己', '者', '的话', '那', '就', '打电话'],
 ['想', '学习', '那', '就', '来', '关注', '呀']]

# 停用词表
stopwords = ['的','呀','这','那','就','的话','如果']

# 去掉文本中的停用词
def drop_stopwords(contents, stopwords):
    contents_clean = []
    for line in contents:
        line_clean = []
        for word in line:
            if word in stopwords:
                continue
            line_clean.append(word)
        contents_clean.append(line_clean)
    return contents_clean

print(drop_stopwords(fenci_list,stopwords))
[['篇文章', '对', '你', '有所', '帮助', '点个', '赞', '呗'], ['想', '联系', '炼己', '者', '打电话'], ['想', '学习', '来', '关注']]
#去除停用词,返回去除停用词后的文本列表
def clean_stopwords(contents):
    contents_list=[]
    stopwords = {
    
    }.fromkeys([line.rstrip() for line in open('data/stopwords.txt', encoding="utf-8")]) #读取停用词表
    stopwords_list = set(stopwords)
    for row in contents:      #循环去除停用词
        words_list = jieba.lcut(row)
        words = [w for w in words_list if w not in stopwords_list]
        sentence=''.join(words)   #去除停用词后组成新的句子
        contents_list.append(sentence)
    return contents_list

去低频词

def rm_word_freq_so_little(dictionary, freq_thred):
    small_freq_ids = [tokenid for tokenid, docfreq in dictionary.dfs.items() if docfreq < freq_thred ]
    dictionary.filter_tokens(small_freq_ids)
    dictionary.compactify()

有趣的同义词

 replace_dict = {
    
    
 	u'吻腚':u'稳定',
 	u'弓虽':u'强',
 	u'女干':u'奸',
 	u'示土':u'社',
 	u'禾口':u'和',
 	u'言皆':u'谐',
 	u'释永性':u'释永信',
 	u'大菊观':u'大局观',
 	u'yl':u'一楼',
 	u'cnm':u'草泥马',
 	u'CCTV':u'中央电视台',
 	u'CCAV':u'中央电视台',
 	u'ccav':u'中央电视台',
 	u'cctv':u'中央电视台',
 	u'qq':u'腾讯聊天账号',
 	u'QQ':u'腾讯聊天账号',
 	u'cctv':u'中央电视台',
 	u'CEO':u'首席执行官',
 	u'克宫':u'克里姆林宫',
 	u'PM2.5':u'细颗粒物',
 	u'pm2.5':u'细颗粒物',
 	u'SDR':u'特别提款权',
 	u'装13':u'装逼',
 	u'213':u'二逼',
 	u'13亿':u'十三亿',
 	u'巭':u'功夫',
 	u'孬':u'不好',
 	u'嫑':u'不要',
 	u'夯':u'大力',
 	u'芘':u'操逼',
 	u'烎':u'开火',
 	u'菌堆':u'军队',
 	u'sb':u'傻逼',
 	u'SB':u'傻逼',
 	u'Sb':u'傻逼',
 	u'sB':u'傻逼',
 	u'is':u'伊斯兰国',
 	u'isis':u'伊斯兰国',
 	u'ISIS':u'伊斯兰国',
 	u'ko':u'打晕',
 	u'你M':u'你妹',
 	u'你m':u'你妹',
 	u'震精':u'震惊',
 	u'返工分子':u'反共',
 	u'黄皮鹅狗':u'黄皮肤俄罗斯狗腿',
 	u'苏祸姨':u'苏霍伊',
 	u'混球屎报':u'环球时报',
 	u'屎报':u'时报',
 	u'jb':u'鸡巴',
 	u'j巴':u'鸡巴',
 	u'j8':u'鸡巴',
 	u'J8':u'鸡巴',
 	u'JB':u'鸡巴',
 	u'瞎BB':u'瞎说',
 	u'nb':u'牛逼',
 	u'牛b':u'牛逼',
 	u'牛B':u'牛逼',
 	u'牛bi':u'牛逼',
 	u'牛掰':u'牛逼',
 	u'苏24':u'苏两四',
 	u'苏27':u'苏两七',
 	u'痰腐集团':u'贪腐集团',
 	u'痰腐':u'贪腐',
 	u'反hua':u'反华',
 	u'<br>':u' ',
 	u'屋猫':u'五毛',
 	u'5毛':u'五毛',
 	u'傻大姆':u'萨达姆',
 	u'霉狗':u'美狗',
 	u'TMD':u'他妈的',
 	u'tmd':u'他妈的',
 	u'japan':u'日本',
 	u'P民':u'屁民',
 	u'八离开烩':u'巴黎开会',
 	u'傻比':u'傻逼',
 	u'潶鬼':u'黑鬼',
 	u'cao':u'操',
 	u'爱龟':u'爱国',
 	u'天草':u'天朝',
 	u'灰机':u'飞机',
 	u'张将军':u'张召忠',
 	u'大裤衩':u'中央电视台总部大楼',
 	u'枪毕':u'枪毙',
 	u'环球屎报':u'环球时报',
 	u'环球屎包':u'环球时报',
 	u'混球报':u'环球时报',
 	u'还球时报':u'环球时报',
 	u'人X日报':u'人民日报',
 	u'人x日报':u'人民日报',
 	u'清只县':u'清知县',
 	u'PM值':u'颗粒物值',
 	u'TM':u'他妈',
 	u'首毒':u'首都',
 	u'gdp':u'国内生产总值',
 	u'GDP':u'国内生产总值',
 	u'鸡的屁':u'国内生产总值',
 	u'999':u'红十字会',
 	u'霉里贱':u'美利坚',
 	u'毛子':u'俄罗斯人',
 	u'ZF':u'政府',
 	u'zf':u'政府',
 	u'蒸腐':u'政府',
 	u'霉国':u'美国',
 	u'狗熊':u'俄罗斯',
 	u'恶罗斯':u'俄罗斯',
 	u'我x':u'我操',
 	u'x你妈':u'操你妈',
 	u'p用':u'屁用',
 	u'胎毒':u'台独',
 	u'DT':u'蛋疼',
 	u'dt':u'蛋疼',
 	u'IT':u'信息技术',
 	u'1楼':u'一楼',
 	u'2楼':u'二楼',
 	u'2逼':u'二逼',
 	u'二b':u'二逼',
 	u'二B':u'二逼',
 	u'晚9':u'晚九',
 	u'朝5':u'朝五',
 	u'黄易':u'黄色网易',
 	u'艹':u'操',
 	u'滚下抬':u'滚下台',
 	u'灵道':u'领导',
 	u'煳':u'糊',
 	u'跟贴被火星网友带走啦':u'',
 	u'猿们':u'公务员们',
 	u'棺猿':u'官员',
 	u'贯猿':u'官员',
 	u'每只猿':u'每个公务员',
 	u'巢县':u'朝鲜',
 	u'死大林':u'斯大林',
 	u'无毛们':u'五毛们',
 	u'天巢':u'天朝',
 	u'普特勒':u'普京',
 	u'依拉克':u'伊拉克',
 	u'歼20':u'歼二零',
 	u'歼10':u'歼十',
 	u'歼8':u'歼八',
 	u'f22':u'猛禽',
 	u'p民':u'屁民',
 	u'钟殃':u'中央'
 }

tfidf向量

word_list = [['篇文章', '对', '你', '有所', '帮助', '点个', '赞', '呗'],
 ['想', '联系', '炼己', '者', '打电话'],
 ['想', '学习', '来', '关注']]

from gensim import corpora,models
dictionary = corpora.Dictionary(word_list)
new_corpus = [dictionary.doc2bow(text) for text in word_list]
tfidf = models.TfidfModel(new_corpus)
words = [' '.join(words) for words in word_list]
tfidf_vec = []
for i in range(len(words)):
    string = words[i]
    string_bow = dictionary.doc2bow(string.split())
    string_tfidf = tfidf[string_bow]
    tfidf_vec.append(string_tfidf)
print(tfidf_vec)
[[(0, 0.35355339059327373), (1, 0.35355339059327373), (2, 0.35355339059327373), (3, 0.35355339059327373), (4, 0.35355339059327373), (5, 0.35355339059327373), (6, 0.35355339059327373), (7, 0.35355339059327373)], [(8, 0.18147115159841573), (9, 0.49169813431045906), (10, 0.49169813431045906), (11, 0.49169813431045906), (12, 0.49169813431045906)], [(8, 0.2084041054460164), (13, 0.5646732768699807), (14, 0.5646732768699807), (15, 0.5646732768699807)]]
dictionary
<gensim.corpora.dictionary.Dictionary at 0x7f8cdeda12d0>

保存文本

def after_clean2csv(contents, labels): #输入为文本列表和标签列表
    columns = ['contents', 'labels']
    save_file = pd.DataFrame(columns=columns, data=list(zip(contents, labels)))
    save_file.to_csv('data/clean_data.csv', index=False, encoding="utf-8")

获取向量

# num_topics参数可以用来指定维度
lsi_model = models.LsiModel(corpus = tfidf_vec,id2word = dictionary,num_topics=2)

lsi_vec = []
for i in range(len(words)):
    string = words[i]
    string_bow = dictionary.doc2bow(string.split())
    string_lsi = lsi_model[string_bow]
    lsi_vec.append(string_lsi)
print(lsi_vec)
[[(1, 2.8284271247461907)], [(0, 1.6357709481422196)], [(0, 1.446438505938713)]]
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vec = TfidfVectorizer()
tfidf_matrix = tfidf_vec.fit_transform(words)

# 得到语料库所有不重复的词
print(tfidf_vec.get_feature_names())

# 得到每个单词对应的id值
print(tfidf_vec.vocabulary_)

# 得到每个句子所对应的向量
# 向量里数字的顺序是按照词语的id顺序来的
print(tfidf_matrix.toarray())
['关注', '学习', '帮助', '打电话', '有所', '点个', '炼己', '篇文章', '联系']
{'篇文章': 7, '有所': 4, '帮助': 2, '点个': 5, '联系': 8, '炼己': 6, '打电话': 3, '学习': 1, '关注': 0}
[[0.         0.         0.5        0.         0.5        0.5
  0.         0.5        0.        ]
 [0.         0.         0.         0.57735027 0.         0.
  0.57735027 0.         0.57735027]
 [0.70710678 0.70710678 0.         0.         0.         0.
  0.         0.         0.        ]]

猜你喜欢

转载自blog.csdn.net/wmq104/article/details/112387835