数据集
使用了搜狗实验室公开语料集-全网新闻数据(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[:150]
经过手工尝试发现使用编码GB18030可以正确的解码整个文件。
f = open('news_tensite_xml.smarty.dat', 'r', encoding='gb18030 ')
st = f.read()
f.close()
st[:150]
提取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})
预定义类别字典
预定义分类及其包含的类别信息。
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

本文介绍了一个新闻数据集的预处理过程,包括识别编码问题、提取URL和内容、分类信息、去除特殊字符、全角半角转换、保留汉字、大写转小写、分词、停用词过滤、向量化操作。通过这些步骤,可以有效地清洗和标准化文本数据。
&spm=1001.2101.3001.5002&articleId=112387835&d=1&t=3&u=29634831cb934427a78a1f6eadeb0727)

被折叠的 条评论
为什么被折叠?



