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

本文介绍了一个新闻数据集的预处理过程,包括识别编码问题、提取URL和内容、分类信息、去除特殊字符、全角半角转换、保留汉字、大写转小写、分词、停用词过滤、向量化操作。通过这些步骤,可以有效地清洗和标准化文本数据。
摘要由CSDN通过智能技术生成

数据集

使用了搜狗实验室公开语料集-全网新闻数据(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 +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.        ]]
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
本课程隶属于自然语言处理(NLP)实战系列。自然语言处理(NLP)是数据科学里的一个分支,它的主要覆盖的内容是:以一种智能与高效的方式,对文本数据进行系统化分析、理解与信息提取的过程。通过使用NLP以及它的组件,我们可以管理非常大块的文本数据,或者执行大量的自动化任务,并且解决各式各样的问题,如自动摘要,机器翻译,命名实体识别,关系提取,情感分析,语音识别,以及主题分割等等。一般情况下一个初级NLP工程师的工资从15万-35万不等,所以掌握NLP技术,对于人工智能学习者来讲是非常关键的一个环节。【超实用课程内容】 课程从自然语言处理的基本概念与基本任务出发,对目前主流的自然语言处理应用进行全面细致的讲解,包括文本分类,文本摘要提取,文本相似度,文本情感分析,文本特征提取等,同时算法方面包括经典算法与深度学习算法的结合,例如LSTM,BiLSTM等,并结合京东电商评论分类、豆瓣电影摘要提取、今日头条舆情挖掘、饿了么情感分析等过个案例,帮助大家熟悉自然语言处理工程师在工作中会接触到的常见应用的实施的基本实施流程,从0-1入门变成自然语言处理研发工程师。 【课程如何观看?】 PC端:https://edu.csdn.net/course/detail/25649 移动端:CSDN 学院APP(注意不是CSDN APP哦)本课程为录播课,课程2年有效观看时长,大家可以抓紧时间学习后一起讨论哦~【学员专享增值服务】 源码开放课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化下载方式:电脑登录https://edu.csdn.net/course/detail/25649,点击右下方课程资料、代码、课件等打包下载通过第二课时下载材料
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值