数据集
使用了搜狗实验室公开语料集-全网新闻数据(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('\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 + i
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', '摄', ')']
停用词
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'yl':u'一楼',
u'CCTV':u'中央电视台',
u'cctv':u'中央电视台',
u'qq':u'腾讯聊天账号',
u'QQ':u'腾讯聊天账号',
u'PM2.5':u'细颗粒物',
u'pm2.5':u'细颗粒物',
u'13亿':u'十三亿',
u'苏24':u'苏两四',
u'苏27':u'苏两七',
u'1楼':u'一楼',
u'2楼':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)]]
保存文本
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. ]]