精华内容
下载资源
问答
  • 2020-05-12 09:33:15

    在数据挖掘过程中,数据清洗主要根据探索性分析后得到的一些结论入手,然后主要对四类异常数据进行处理;分别是缺失值(missing value),异常值(离群点),去重处理(Duplicate Data)以及噪音数据的处理。

    1. 探索性分析

    探索性分析部分,对于整个数据来讲是获得对数据一个初步的认识以及对先验知识的一个探索分析过程,在我做相关数据挖掘的过程中,主要是利用python相关的科学计算库进行数据初步的探索,例如数据类型,缺失值,数据集规模,各特征下的数据分布情况等,并利用第三方绘图库进行直观的观察,以获取数据的基本属性与分布情况,另外,通过单变量分析与多变量分析,可以初步探索数据集中各特征之间的关系,以验证在业务分析阶段所提出的假设。

    2. 缺失值

    数据集中缺失值的获取方法可以直接通过pandas的自带的多种方法获取,在大多数数据集中缺失值都普遍会存在,因此,对于缺失值的处理好坏会直接影响到模型的最终结果。如何处理缺失值,主要依据在缺失值所在属性的重要程度以及缺失值的分布情况。

    ①.在缺失率少且属性重要程度低的情况下,若属性为数值型数据则根据数据分布情况简单的填充即可,例如:若数据分布均匀,则使用均值对数据进行填充即可;若数据分布倾斜,使用中位数填充即可。若属性为类别属性,则可以用一个全局常量‘Unknow’填充,但是,这样做往往效果很差,因为算法可能会将其识别为一个全新的类别,因此很少使用。
    ②.当缺失率高(>95%)且属性重要程度低时,直接删除该属性即可。然而在缺失值高且属性程度较高时,直接删除该属性对于算法的结果会造成很不好的影响。
    ③.缺失值高,属性重要程度高:主要使用的方法有插补法与建模法

    (1)插补法主要有随机插补法,多重插补法,热平台插补法,以及拉格朗日插值法与牛顿插值法

    1>随机插补法–从总体中随机抽取某几个样本代替缺失样本

    2>多重插补法–通过变量之间的关系对缺失数据进行预测,利用蒙特卡洛方法生成多个完整的数据集,在对这些数据集进行分析,最后对分析结果进行汇总处理

    3>热平台插补----指在非缺失数据集中找到一个与缺失值所在样本相似的样本(匹配样本),利用其中的观测值对缺失值进行插补。

    优点:简单易行,准确率较高

    缺点:变量数量较多时,通常很难找到与需要插补样本完全相同的样本。但我们可以按照某些变量将数据分层,在层中对缺失值实用均值插补

    4>拉格朗日差值法和牛顿插值法

    (2)建模法

    可以用回归、贝叶斯、随机森林、决策树等模型对缺失数据进行预测。例如:利用数据集中其他数据的属性,可以构造一棵判定树,来预测缺失值的值。

    一般而言,数据缺失值的处理没有统一的流程,必须根据实际数据的分布情况,倾斜程度,缺失值所占比例等来选择方法。在我做数据预处理过程中,除了使用简单的填充法外与删除外,更多情况下采用建模法进行填充,主要在于建模法根据已有的值去预测未知值,准确率较高。但建模法也可能造成属性之间的相关性变大,可能影响最终模型的训练。

    3. 异常值(离群点)

    判断离群点除了可视化分析外(一般箱线图),还有很多基于统计背景下的方法,且可视化观察不适合用数据量较多的情况。

    3.1 简单的统计分析

    这一步在EDA中完成,只需要利用pandas的describe方法就可以实现,通过数据集描述性统计,发现是否存在不合理的值,即异常值

    3.2 3∂原则–基于正态分布的离群点检测

    如果数据服从正态分布,在3∂原则下,异常值为一组测定值中与平均值的偏差超过3倍标准差的值。如果数据服从正态分布,距离平均值3∂之外的值出现的概率为P(|x-u| > 3∂) <= 0.003,属于极个别的小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。

    3.3 基于模型检测

    首先建立一个数据模型,异常是那些同模型不能完美拟合的对象;如果模型是簇的集合,则异常是不显著属于任何簇的对象;在使用回归模型时,异常是相对远离预测值的对象

    3.4 基于距离

    通过在对象之间定义临近性度量,异常对象是那些远离其它对象的对象

    优点:简单易操作

    缺点:时间复杂度为O(m^2),不适用于大数据集情况,参数选择较为敏感,不能处理具有不同密度区域的数据集,因为它使用全局阈值,不能考虑这种密度的变化

    3.5 基于密度

    当一个点的局部密度显著低于它的大部分近邻时才将其分类为离群点。适合非均匀分布的数据。

    优点:给出了对象是离群点的定量度量,并且即使数据具有不同的区域也能够很好的处理

    缺点:时间复杂度O(m^2);参数选择困难,虽然算法通过观察不同的k值,取得最大离群点得分来处理该问题,但是,仍然需要选择这些值的上下界。

    3.6 基于聚类

    基于聚类的离群点:一个对象是基于聚类的离群点,如果该对象不强属于任何簇。离群点对初始聚类的影响:如果通过聚类检测离群点,则由于离群点影响聚类,存在一个问题:结构是否有效。为了处理该问题,可以使用如下方法:对象聚类,删除离群点,对象再次聚类。

    优点:

    ① 基于线性和接近线性复杂度(k均值)的聚类技术来发现离群点可能是高度有效的 ② 簇的定义通常是离群点的补,因此可能同时发现簇和离群点

    缺点:

    ③ 产生的离群点集和它们的得分可能非常依赖所用的簇的个数和数据中离群点的存在性

    ④ 聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大

    处理异常点的方法:

    1>删除异常值----明显看出是异常且数量较少可以直接删除

    2>不处理—如果算法对异常值不敏感则可以不处理,但如果算法对异常值敏感,则最好不要用这种方法,如基于距离计算的一些算法,包括kmeans,knn之类的。

    3>平均值替代----损失信息小,简单高效。

    4>视为缺失值----可以按照处理缺失值的方法来处理

    4. 去重处理

    对于重复项的判断,基本思想是“排序与合并”,先将数据集中的记录按一定规则排序,然后通过比较邻近记录是否相似来检测记录是否重复。这里面其实包含了两个操作,一是排序,二是计算相似度。目前在做竞赛过程中主要是用duplicated方法进行判断,然后将重复的样本进行简单的删除处理。

    这块目前看到的博客与国外一些比赛的案例基本都采用直接删除进行处理,没有看到过比较有新意的方法。

    5. 噪音处理

    噪音是被测变量的随机误差或者方差,主要区别于离群点。由公式:观测量(Measurement) = 真实数据(True Data) + 噪声 (Noise)。离群点属于观测量,既有可能是真实数据产生的,也有可能是噪声带来的,但是总的来说是和大部分观测量之间有明显不同的观测值。噪音包括错误值或偏离期望的孤立点值,但也不能说噪声点包含离群点,虽然大部分数据挖掘方法都将离群点视为噪声或异常而丢弃。然而,在一些应用(例如:欺诈检测),会针对离群点做离群点分析或异常挖掘。而且有些点在局部是属于离群点,但从全局看是正常的。

    对于噪音的处理主要采用分箱法于回归法进行处理:

    (1) 分箱法:

    分箱方法通过考察数据的“近邻”来光滑有序数据值。这些有序的值被分布到一些“桶”或箱中。由于分箱方法考察近邻的值,因此它进行局部光滑。

    l 用箱均值光滑:箱中每一个值被箱中的平均值替换。

    l 用箱中位数平滑:箱中的每一个值被箱中的中位数替换。

    l 用箱边界平滑:箱中的最大和最小值同样被视为边界。箱中的每一个值被最近的边界值替换。

    一般而言,宽度越大,光滑效果越明显。箱也可以是等宽的,其中每个箱值的区间范围是个常量。分箱也可以作为一种离散化技术使用.

    (2) 回归法

    可以用一个函数拟合数据来光滑数据。线性回归涉及找出拟合两个属性(或变量)的“最佳”直线,使得一个属性能够预测另一个。多线性回归是线性回归的扩展,它涉及多于两个属性,并且数据拟合到一个多维面。使用回归,找出适合数据的数学方程式,能够帮助消除噪声。

    更多相关内容
  • 文本挖掘(超详细) 工具:八爪鱼采集器 + Python + JavaScript 例如:数据获取 - 数据清洗 - 中文分词 - 去除停用词 - 词频统计 - 词云图 - 情感分析 数据获取 工具:八爪鱼采集器 链接:下载 使用: 1、 下载...

    文本挖掘(超详细)

    工具:八爪鱼采集器 + Python + JavaScript
    例如:数据获取 - 数据清洗 - 中文分词 - 去除停用词 - 词频统计 - 词云图 - 情感分析

    数据获取

    工具:八爪鱼采集器
    链接:下载

    使用:
    1、 下载压缩包并解压
    2、 点击 .exe 文件安装
    3、 使用模板采集数据/自定义配置采集数据

    示例:
    1、 选择模板
    2、打开商品详情页并复制网址 3、启动采集(共 1000 条数据) 4、采集结果(只保留了 4 列)

    数据清洗

    简单的数据清洗:把评论内容复制放到一个 Word 文档中,通过文本的 查找与替换 功能去除京东的评论模板文本。

    Before:
    After:

    中文分词

    工具:Python + VS Code 软件

    VS Code 配置 Python 环境:自行搜索

    代码:
    import jieba
    import jieba.analyse
    
    # 待分词的文本路径
    sourceTxt = 'comment_1.txt'
    # 分好词后的文本路径
    targetTxt = 'comment_1_fenci.txt'
    
    # 对文本进行操作
    with open(sourceTxt, 'r', encoding = 'utf-8') as sourceFile, open(targetTxt, 'a+', encoding = 'utf-8') as targetFile:
        for line in sourceFile:
            seg = jieba.cut(line.strip(), cut_all = False)
            # 分好词之后之间用空格隔断
            output = ' '.join(seg)
            targetFile.write(output)
            targetFile.write('\n')
        prinf('写入成功!')
    
    # 提取关键词
    with open(targetTxt, 'r', encoding = 'utf-8') as file:
        text = file.readlines()
        """
        几个参数解释:
            * text : 待提取的字符串类型文本
            * topK : 返回TF-IDF权重最大的关键词的个数,默认为20个
            * withWeight : 是否返回关键词的权重值,默认为False
            * allowPOS : 包含指定词性的词,默认为空
        """
        keywords = jieba.analyse.extract_tags(str(text), topK = 10, withWeight=True, allowPOS=())
        print(keywords)
    	print('提取完毕!')
    
    注意:
    1、 导入 jieba 包:pip install jieba(命令行操作,需要转到当前目录)

    After:

    去除停用词

    工具:Python + VS Code 软件

    代码:
    import jieba
    
    # jieba.load_userdict('userdict.txt')
    # 创建停用词list
    def stopwordslist(filepath):
        stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
        return stopwords
    
    def seg_sentence(sentence):
        sentence_seged = jieba.cut(sentence.strip())
        stopwords = stopwordslist('cn_stopwords.txt')  # 这里加载停用词的路径
        outstr = ''
        for word in sentence_seged:
            if word not in stopwords:
                if word != '\t':
                    outstr += word
                    outstr += " "
        return outstr
    
    inputs = open('comment_1.txt', 'r', encoding='utf-8')
    
    outputs = open('comment_1_fenci_qutingyongci.txt', 'w',encoding='utf-8')
    for line in inputs:
        line_seg = seg_sentence(line)  # 这里的返回值是字符串
        outputs.write(line_seg + '\n')
    outputs.close()
    inputs.close()
    
    After:

    词频统计

    工具:Python + VS Code 软件

    代码:
    import jieba
    import re
    
    #打开要处理的文章
    reader = open("comment_1_fenci_qutingyongci.txt",'r',encoding='utf8')
    strs =reader.read()
    result = open("comment_1_fenci_qutingyongci_cipin.txt","w")
    
    # 分词,去重,列表
    word_list = jieba.cut(strs,cut_all=True)
    # 正则表达式去除数字,符号,单个字
    new_words = []
    for i in word_list:
        m = re.search("\d+",i)
        n = re.search("\W+",i)
        if not m and  not n and len(i)>1:
            new_words.append(i)
    
    # 统计词频
    word_count = {} # 创建字典
    for i in set(new_words): # 用set去除list中的重复项
        word_count[i] = new_words.count(i)
    
    # 格式整理
    list_count = sorted(word_count.items(),key=lambda co:co[1],reverse=True)
    
    # 打印结果
    for i in range(300):
        print(list_count[i],file=result)
    
    #关闭文件
    reader.close()
    result.close()
    
    After:

    词云图

    工具:JavaScript + Sublime Text 软件
    链接:下载 Sublime Text
    代码:下载完整代码

    词频处理:
    通过 Word 的 文本与替换 和 Excel 的 分列 可得 词频转 json 格式:链接(该不会把词一个一个敲进去吧 [doge])

    图片转码:转码

    After:

    情感分析

    工具:Python + VS Code 软件

    代码:
    #加载情感分析模块
    from snownlp import SnowNLP
    #from snownlp import sentiment
    import pandas as pd
    import matplotlib.pyplot as plt
    #导入样例数据
    aa ='comments.xlsx'
    #读取文本数据
    df=pd.read_excel(aa)
    #提取所有数据
    df1=df.iloc[:,3]
    print('将提取的数据打印出来:\n',df1)
    #遍历每条评论进行预测
    values=[SnowNLP(i).sentiments for i in df1]
    #输出积极的概率,大于0.5积极的,小于0.5消极的
    #myval保存预测值
    myval=[]
    good=0
    bad=0
    for i in values:
       if (i>=0.5):
           myval.append("正面")
           good=good+1
       else:
           myval.append("负面")
           bad=bad+1
    df['预测值']=values
    df['评价类别']=myval
    #将结果输出到Excel
    df.to_excel('comments_qinggan.xlsx')
    rate=good/(good+bad)
    print('好评率','%.f%%' % (rate * 100)) #格式化为百分比
    #作图
    y=values
    plt.rc('font', family='SimHei', size=10)
    plt.plot(y, marker='o', mec='r', mfc='w',label=u'评价分值')
    plt.xlabel('用户')
    plt.ylabel('评价分值')
    # 让图例生效
    plt.legend()
    #添加标题
    plt.title('IQOO5 评论情感分析',family='SimHei',size=14,color='blue')
    plt.show()
    
    注意:
    1、 导入 SnowNLP 包:下载 SnowNLP 的 Github 源码并解压,在解压目录,通过下面命令安装
    python setup.py install 
    
    2、导入 pandas 包:链接 下载之后,可以将文件改为 zip 格式的,然后解压,将解压之后的文件夹中的两个文件放到 Python 的安装目录 –> Lib –> site-packages
    Before:
    After:

    展开全文
  • [1] 为什么要清洗文本   这里涉及到文本分类任务中:词典、词向量两个概念。   首先明确我们做的是“英文文本分类”,所以是不需要像中文那样分词的,只用按照空格截取英文单词就行。   假设训练集train.csv...

    ·请参考本系列目录:【英文文本分类实战】之一——实战项目总览
    ·下载本实战项目资源:神经网络实现英文文本分类.zip(pytorch)

    [1] 为什么要清洗文本

      这里涉及到文本分类任务中:词典、词向量两个概念。

      首先明确我们做的是“英文文本分类”,所以是不需要像中文那样分词的,只用按照空格截取英文单词就行。

      假设训练集train.csv中有10w个文本,我们以空格为分隔符截取英文单词,一共截下来2w个单词,我们把这些单词从0到2w依次编号,称为“词典”。

    【注】:这样的词典是不能接受的。从机器学习的角度看,词典中的某些词只出现一两次,对分类完全没有影响,反而徒增算法计算量(可以去加了解一下TF-IDF的思想)。同样,在神经网络模型中,也需要把每个词表示成一个n维的词向量,所以我们可能只去前1w个频率最高的词,放入“词典”。

      要知道,我们只以空格为分隔符截取英文单词肯定不行,因为文本中不缺乏特殊字符、标点符号、开头单词大小写等等问题,所以我们要进行数据清洗。

      那么我们如何评判清洗后的词典的优劣呢?

      由于我们会使用预训练的词向量,可以以预训练词向量中的词典覆盖率作为参考。

    【注】:使用预训练词向量是常用操作,需要仔细了解。

      总结:由于文本中有特殊字符、标点符号、开头单词大小写等等问题,会干扰到提取的词典,所以需要清洗文本数据。我们计算提取的词典与预训练词向量中的词典的覆盖率作为提取的词典的好坏标准。

    [2] 提取数据集词典

      vocab字典,建立单词与其出现频次的映射,代码如下:

    # ## 创建英文词典
    def build_vocab(sentences, verbose=True):
        vocab = {}
        for sentence in tqdm(sentences, disable=(not verbose)):
            for word in sentence:
                try:
                    vocab[word] += 1
                except KeyError:
                    vocab[word] = 1
        return vocab
    
    # ## 进度条初始化
    tqdm.pandas()
    # ## 加载数据集
    df = pd.read_csv("../@_数据集/TLND/data/labelled_newscatcher_dataset.csv", encoding='utf-8', sep=';')
    
    # ## 创建词典
    sentences = df['title'].progress_apply(lambda x: x.split()).values
    vocab = build_vocab(sentences)
    

      我们来看一下建立好的vocab字典是什么样子,任取几个单词看一下:

    {'Insulated': 3, 'Mergers': 9, 'Acquisitions': 9}
    

    [3] 加载预训练embeddings

      词向量是指用一组数值来表示一个汉字或者词语,这也是因为计算机只能进行数值计算。最简单的方法是one-hot,假如总的有一万个词,那词向量就一万维,词对应的那维为1,其他为0,但这样的表示维度太高也太稀疏了。

      所以后来就开始用一个维度小的稠密向量来表示,词向量一般都50,100,200或者300维。预训练指提前训练好这种词向量,对应的是一些任务可以输入词id,然后在做具体的任务内部训练词向量,这样出来的词向量不具有通用性,而预训练的词向量,是在极大样本上训练的结果,有很好的通用性,无论什么任务都可以直接拿来用具体的训练方法。

      从最开始的word2vec,elmo到现在的bert。

      一些预训练词向量下载地址为:

       glove

       网址:https://nlp.stanford.edu/projects/glove/

       GLOVE的工作原理类似于Word2Vec。上面可以看到Word2Vec是一个“预测”模型,它预测给定单词的上下文,GLOVE通过构造一个共现矩阵(words X context)来学习,该矩阵主要计算单词在上下文中出现的频率。因为它是一个巨大的矩阵,我们分解这个矩阵来得到一个低维的表示。有很多细节是相互配合的,但这只是粗略的想法。

    在这里插入图片描述
       fasttext

       网址:https://fasttext.cc/

       ​ FastText与上面的两个嵌入有很大的不同。Word2Vec和GLOVE将每个单词作为最小的训练单元,而FastText使用n-gram字符作为最小的单元。例如,单词vector,“apple”,可以分解为单词vector的不同单位,如“ap”,“app”,“ple”。使用FastText的最大好处是,它可以为罕见的单词,甚至是在训练过程中没有看到的单词生成更好的嵌入,因为n-gram字符向量与其他单词共享。这是Word2Vec和GLOVE无法做到的。

    在这里插入图片描述
       下载好预训练词向量后,尝试加载词向量,代码如下:

    # ## 加载预训练词向量
    def load_embed(file):
        def get_coefs(word, *arr):
            return word, np.asarray(arr, dtype='float32')
    
        if file == '../@_词向量/fasttext/wiki-news-300d-1M.vec':
            embeddings_index = dict(get_coefs(*o.split(" ")) for o in open(file,encoding='utf-8') if len(o) > 100)
        else:
            embeddings_index = dict(get_coefs(*o.split(" ")) for o in open(file, encoding='latin'))
    
        return embeddings_index
    
    # ## 加载词向量
    glove = '../@_词向量/glove/glove.6B.50d.txt'
    fasttext = '../@_词向量/fasttext/wiki-news-300d-1M.vec'
    embed_glove = load_embed(glove)
    embed_fasttext = load_embed(fasttext)
    

    [4] 检查预训练embeddings和vocab的覆盖情况

      创建了词典后并且加载了预训练词向量后,我们编写代码来查看覆盖情况:

    # ## 检查预训练embeddings和vocab的覆盖情况
    def check_coverage(vocab, embeddings_index):
        known_words = {}  # 两者都有的单词
        unknown_words = {}  # embeddings不能覆盖的单词
        nb_known_words = 0  # 对应的数量
        nb_unknown_words = 0
        #     for word in vocab.keys():
        for word in tqdm(vocab):
            try:
                known_words[word] = embeddings_index[word]
                nb_known_words += vocab[word]
            except:
                unknown_words[word] = vocab[word]
                nb_unknown_words += vocab[word]
                pass
    
        print('Found embeddings for {:.2%} of vocab'.format(len(known_words) / len(vocab)))  # 覆盖单词的百分比
        print('Found embeddings for  {:.2%} of all text'.format(
            nb_known_words / (nb_known_words + nb_unknown_words)))  # 覆盖文本的百分比,与上一个指标的区别的原因在于单词在文本中是重复出现的。
        unknown_words = sorted(unknown_words.items(), key=operator.itemgetter(1))[::-1]
        print("unknown words : ", unknown_words[:30])
        return unknown_words
    
    oov_glove = check_coverage(vocab, embed_glove)
    oov_fasttext = check_coverage(vocab, embed_fasttext)
    

      查看输出:

    100%|██████████| 108774/108774 [00:00<00:00, 343998.85it/s]
    100%|██████████| 108774/108774 [00:00<00:00, 313406.97it/s]
    100%|██████████| 123225/123225 [00:00<00:00, 882523.98it/s]
    Found embeddings for 18.88% of vocab
    Found embeddings for  51.99% of all text
    unknown words :  [('COVID-19', 6245), ('The', 5522), ('New', 3488), ('Market', 2932), ('Covid-19', 2621), ('–', 2521), ('To', 2458), ('US', 2184), ('Coronavirus', 2122), ('How', 2041), ('A', 2029), ('In', 1904), ('Global', 1786), ('Is', 1720), ('With', 1583), ('Of', 1460), ('For', 1450), ('Trump', 1440), ('And', 1361), ('Man', 1340), ('August', 1310), ('Apple', 1148), ('UK', 1132), ('On', 1122), ('What', 1113), ('Coronavirus:', 1077), ('Google', 1054), ('League', 1044), ('Why', 1032), ('China', 987)]
    
    100%|██████████| 123225/123225 [00:00<00:00, 786827.09it/s]
    Found embeddings for 50.42% of vocab
    Found embeddings for  87.50% of all text
    unknown words :  [('COVID-19', 6245), ('Covid-19', 2621), ('Coronavirus:', 1077), ('Covid', 824), ('2020:', 736), ('COVID', 670), ('TikTok', 525), ('cases,', 470), ("Here's", 414), ('LIVE:', 345), ('Size,', 318), ('Share,', 312), ('COVID-19:', 297), ('news:', 280), ('Trends,', 270), ('TheHill', 263), ('coronavirus:', 259), ('Report:', 256), ('Analysis,', 247), ('Fortnite', 245), ("won't", 242), ('Growth,', 234), ("It's", 234), ('Covid-19:', 229), ("it's", 224), ("Trump's", 223), ('English.news.cn', 203), ('COVID-19,', 196), ('Here’s', 196), ('updates:', 177)]
    

       分析上面的输出:

      大写的问题很严重,我们先把数据集的文本中,大写字母转小写。

    [5] 文本单词全部小写

    # ## 词典全部小写
    print("=========转化小写后")
    sentences = df['title'].apply(lambda x: x.lower())
    sentences = sentences.progress_apply(lambda x: x.split()).values
    vocab_low = build_vocab(sentences)
    oov_glove = check_coverage(vocab_low, embed_glove)
    oov_fasttext = check_coverage(vocab_low, embed_fasttext)
    

      查看输出:

    =========转化小写后
    100%|██████████| 108774/108774 [00:00<00:00, 354067.79it/s]
    100%|██████████| 108774/108774 [00:00<00:00, 317075.17it/s]
    100%|██████████| 102482/102482 [00:00<00:00, 1007395.77it/s]
    Found embeddings for 42.97% of vocab
    Found embeddings for  86.47% of all text
    unknown words :  [('covid-19', 8897), ('–', 2521), ('covid', 1543), ('coronavirus:', 1338), ('2020:', 736), ('—', 626), ('tiktok', 529), ('covid-19:', 526), ("here's", 525), ('cases,', 502), ('live:', 464), ("it's", 459), ('news:', 363), ('size,', 326), ('updates:', 325), ('share,', 316), ("won't", 310), ("don't", 297), ('report:', 295), ("'the", 291), ('review:', 287), ('trends,', 280), ('covid-19,', 269), ('thehill', 263), ('update:', 260), ('analysis,', 253), ('here’s', 252), ("'i", 249), ('fortnite', 245), ('growth,', 244)]
    
    100%|██████████| 102482/102482 [00:00<00:00, 778784.32it/s]
    Found embeddings for 37.95% of vocab
    Found embeddings for  85.17% of all text
    unknown words :  [('covid-19', 8897), ('covid', 1543), ('coronavirus:', 1338), ('2020:', 736), ('tiktok', 529), ('covid-19:', 526), ("here's", 525), ('cases,', 502), ('live:', 464), ("it's", 459), ('meghan', 401), ('news:', 363), ('size,', 326), ('updates:', 325), ('share,', 316), ("won't", 310), ("don't", 297), ('huawei', 297), ('report:', 295), ('sushant', 292), ('review:', 287), ('trends,', 280), ('covid-19,', 269), ('thehill', 263), ('update:', 260), ('analysis,', 253), ('here’s', 252), ('fortnite', 245), ('growth,', 244), ('xiaomi', 237)]
    

      可以看到,转化为小写后,覆盖率有了极大的提升,但是85%左右的覆盖率还远远不够。我们尝试再去除特殊字符。

    [6] 去除特殊字符

    # ## 去除特殊字符
    def clean_special_chars(text, punct, mapping):
        for p in mapping:
            text = text.replace(p, mapping[p])
        for p in punct:
            text = text.replace(p, f' {p} ')
        specials = {'\u200b': ' ', '…': ' ... ', '\ufeff': '', 'करना': '', 'है': ''}  # Other special characters that I have to deal with in last
        for s in specials:
            text = text.replace(s, specials[s])
        return text
    
    # ## 去除特殊字符
    print("=========去除特殊字符后")
    punct = "/-'?!.,#$%\'()*+-/:;<=>@[\\]^_`{|}~" + '""“”’' + '∞θ÷α•à−β∅³π‘₹´°£€\×™√²—–&'
    punct_mapping = {"‘": "'", "₹": "e", "´": "'", "°": "", "€": "e", "™": "tm", "√": " sqrt ", "×": "x", "²": "2", "—": "-", "–": "-", "’": "'", "_": "-", "`": "'", '“': '"', '”': '"', '“': '"', "£": "e", '∞': 'infinity', 'θ': 'theta', '÷': '/', 'α': 'alpha', '•': '.', 'à': 'a', '−': '-', 'β': 'beta', '∅': '', '³': '3', 'π': 'pi', }
    sentences = df['title'].apply(lambda x: clean_special_chars(x, punct, punct_mapping))
    sentences = sentences.apply(lambda x: x.lower()).progress_apply(lambda x: x.split()).values
    vocab_punct = build_vocab(sentences)
    oov_glove = check_coverage(vocab_punct, embed_glove)
    oov_fasttext = check_coverage(vocab_punct, embed_fasttext)
    

      查看输出:

    =========去除特殊字符后
    100%|██████████| 108774/108774 [00:00<00:00, 359101.46it/s]
    100%|██████████| 108774/108774 [00:00<00:00, 368426.97it/s]
    100%|██████████| 55420/55420 [00:00<00:00, 1182299.35it/s]
    Found embeddings for 80.79% of vocab
    Found embeddings for  97.48% of all text
    unknown words :  [('covid', 11852), ('tiktok', 680), ('fortnite', 372), ('bbnaija', 288), ('thehill', 263), ('ps5', 260), ('oneplus', 212), ('jadon', 168), ('havertz', 144), ('wechat', 135), ('researchandmarkets', 132), ('redmi', 129), ('realme', 116), ('brexit', 108), ('xcloud', 94), ('valorant', 84), ('note20', 69), ('airpods', 68), ('nengi', 67), ('vaping', 64), ('fiancé', 62), ('selfie', 62), ('pokémon', 60), ('1000xm4', 59), ('sarri', 55), ('iqoo', 52), ('miui', 52), ('wassce', 51), ('beyoncé', 50), ('kiddwaya', 49)]
    
    100%|██████████| 55420/55420 [00:00<00:00, 1066584.97it/s]
    Found embeddings for 67.35% of vocab
    Found embeddings for  95.61% of all text
    unknown words :  [('covid', 11852), ('tiktok', 680), ('meghan', 435), ('fortnite', 372), ('huawei', 364), ('sushant', 326), ('markle', 302), ('bbnaija', 288), ('xiaomi', 276), ('thehill', 263), ('ps5', 260), ('oneplus', 212), ('degeneres', 176), ('jadon', 168), ('buhari', 164), ('cagr', 162), ('solskjaer', 150), ('havertz', 144), ('perseid', 140), ('wechat', 135), ('researchandmarkets', 132), ('redmi', 129), ('fauci', 98), ('xcloud', 94), ('ardern', 93), ('valorant', 84), ('rtx', 83), ('akufo', 82), ('sadc', 82), ('kildare', 82)]
    

      可以看到,去除特殊字符后,覆盖率达到了97.5%,已经够用了。观察生词,这些都是最近几年出的新词,如‘covid’、'tiktok’等,这是无法改变的。

    【注】:因为预训练词向量是在大规模语料库上训练出的,我们使用了预训练词向量后,可以选择在反向传播时不去修改嵌入层的参数(固定下来),也可以选择在使用预训练词向量后,在反向传播时继续修改嵌入层的参数(这叫微调,微调随着Bert的提出越来越流行)。

    [7] 进行下一篇实战

      【英文文本分类实战】之四——词典提取与词向量提取

    展开全文
  • 数据挖掘数据清洗——数据不平衡处理 一、什么是数据不平衡? 不平衡数据集指的是数据集各个类别的样本数目相差巨大,也叫数据倾斜。以二分类问题为例,即正类的样本数量远大于负类的样本数量。严格地讲,任何...
  • 大数据-算法-数据清洗技术在文本挖掘中的应用.pdf
  • 本文将详细讲解数据预处理、Jieba分词和文本聚类知识,这篇文章可以说是文本挖掘和自然语言处理的入门文章。两万字基础文章,希望对您有所帮助。欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列...

    欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

    前一篇文章讲述了分类算法的原理知识级案例,包括决策树、KNN、SVM,并通过详细的分类对比实验和可视化边界分析与大家总结。本文将详细讲解数据预处理、Jieba分词和文本聚类知识,这篇文章可以说是文本挖掘和自然语言处理的入门文章。两万字基础文章,希望对您有所帮助。

    下载地址:

    前文赏析:

    第一部分 基础语法

    第二部分 网络爬虫

    第三部分 数据分析和机器学习

    作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。


    前文第一部分详细介绍了各种Python网络数据爬取方法,但所爬取的语料都是中文知识,在第二部分前面的章节也讲述了常用的数据分析模型及实例。这些实例都是针对数组或矩阵语料进行分析的,那么如何对中文文本语料进行数据分析呢?在本章作者将带领大家走进文本聚类分析领域,讲解文本预处理和文本聚类等实例内容。

    一.数据预处理概述

    在数据分析和数据挖掘中,通常需要经历前期准备、数据爬取、数据预处理、数据分析、数据可视化、评估分析等步骤,而数据分析之前的工作几乎要花费数据工程师近一半的工作时间,其中的数据预处理也将直接影响后续模型分析的好坏。

    数据预处理(Data Preprocessing)是指在进行数据分析之前,对数据进行的一些初步处理,包括缺失值填写、噪声处理、不一致数据修正、中文分词等,其目标是得到更标准、高质量的数据,纠正错误异常数据,从而提升分析的结果。

    图1是数据预处理的基本步骤,包括中文分词、词性标注、数据清洗、特征提取(向量空间模型存储)、权重计算(TF-IDF)等。

    在这里插入图片描述

    1.中文分词技术及Jieba工具
    在得到语料之后,首先需要做的就是对中文语料进行分词。由于中文词语之间是紧密联系的,一个汉语句子是由一串前后连续的汉字组成,词与词之间没有明显的分界标志,所以需要通过一定的分词技术把句子分割成空格连接的词序列。本章介绍了中文常用的分词技术,同时着重讲解了Python常用分词工具Jieba进行分词的实例。

    2.数据清洗及停用词过滤
    在使用Jieba中文分词技术得到分完词的语料后,可能会存在脏数据和停用词等现象。为了得到更好的数据分析结果,需要对这些数据集进行数据清洗和停用词过滤等操作,这里利用Jieba库进行清洗数据。

    3.词性标注
    词性标注是指为分词结果中的每个单词或词组标注一个正确的词性,即确定每个词是名词、动词、形容词或其他词性的过程。通过词性标注可以确定词在上下文中的作用,通常词性标注是自然语言处理和数据预处理的基础步骤,Python也提供了相关库进行词性标注。

    在这里插入图片描述

    4.特征提取
    特征提取是指将原始特征转换为一组具有明显物理意义或者统计意义的核心特征,所提取的这组特征可以尽可能地表示这个原始语料,提取的特征通常会存储至向量空间模型中。向量空间模型是用向量来表征一个文本,它将中文文本转化为数值特征。本章介绍了特征提取、向量空间模型和余弦相似性的基本知识,同时结合实例进行深入讲解。

    5.权重计算及TFIDF
    在建立向量空间模型过程中,权重的表示尤为重要,常用方法包括布尔权重、词频权重、TF-IDF权重、熵权重方法等。本章讲述了常用的权重计算方法,并详细讲解了TF-IDF的计算方法和实例。

    现在假设存在表1所示的数据集,并存储至本地test.txt文件中,整章内容都将围绕该数据集进行讲解,数据集共分为9行数据,包括3个主题,即:贵州旅游、大数据和爱情。接下来依次对数据预处理的各个步骤进行分析讲解。

    在这里插入图片描述

    贵州省位于中国的西南地区,简称“黔”或“贵”。
    走遍神州大地,醉美多彩贵州。
    贵阳市是贵州省的省会,有“林城”之美誉。
    数据分析是数学与计算机科学相结合的产物。
    回归、聚类和分类算法被广泛应用于数据分析。
    数据爬取、数据存储和数据分析是紧密相关的过程。
    最甜美的是爱情,最苦涩的也是爱情。
    一只鸡蛋可以画无数次,一场爱情能吗?
    真爱往往珍藏于最平凡、普通的生活中。
    

    二.中文分词

    当读者使用Python爬取了中文数据集之后,首先需要对数据集进行中文分词处理。由于英文中的词与词之间是采用空格关联的,按照空格可以直接划分词组,所以不需要进行分词处理,而中文汉字之间是紧密相连的,并且存在语义,词与词之间没有明显的分隔点,所以需要借助中文分词技术将语料中的句子按空格分割,变成一段段词序列。下面开始详细介绍中文分词技术及Jiaba中文分词工具。

    1.中文分词技术

    中文分词(Chinese Word Segmentation)指将汉字序列切分成一个个单独的词或词串序列,它能够在没有词边界的中文字符串中建立分隔标志,通常采用空格分隔。中文分词是数据分析预处理、数据挖掘、文本挖掘、搜索引擎、知识图谱、自然语言处理等领域中非常基础的知识点,只有经过中文分词后的语料才能转换为数学向量的形式,继续进行后面的分析。同时,由于中文数据集涉及到语义、歧义等知识,划分难度较大,比英文复杂很多。下面举个简单示例,对句子“我是程序员”进行分词操作。

    输入:我是程序员
    输出1:我\是\程\序\员
    输出2:我是\是程\程序\序员
    输出3:我\是\程序员
    

    这里分别采用了三种方法介绍中文分词。

    • “我\是\程\序\员”采用的是一元分词法,将中文字符串分隔为单个汉字;
    • “我是\是程\程序\序员”采用二元分词法,将中文汉字两两分隔;
    • “我\是\程序员”是比较复杂但更实用的分词方法,它根据中文语义来进行分词的,其分词结果更准确。

    中文分词方法有很多,常见的包括:

    • 基于字符串匹配的分词方法
    • 基于统计的分词方法
    • 基于语义的分词方法

    这里介绍比较经典的基于字符串匹配的分词方法。

    基于字符串匹配的分词方法又称为基于字典的分词方法,它按照一定策略将待分析的中文字符串与机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功,并识别出对应的词语。该方法的匹配原则包括最大匹配法(MM)、逆向最大匹配法(RMM)、逐词遍历法、最佳匹配法(OM)、并行分词法等。

    正向最大匹配法的步骤如下,假设自动分词词典中的最长词条所含汉字的个数为n。

    • ① 从被处理文本中选取当前中文字符串中的前n个中文汉字作为匹配字段,查找分词词典,若词典中存在这样一个n字词,则匹配成功,匹配字段作为一个词被切分出来。
    • ② 若分词词典中找不到这样的一个n字词,则匹配失败,匹配字段去掉最后一个汉字,剩下的中文字符作为新的匹配字段,继续进行匹配。
    • ③ 循环步骤进行匹配,直到匹配成功为止。

    例如,现在存在一个句子“北京理工大学生前来应聘”,使用正向最大匹配方法进行中文分词的过程如下所示。

    分词算法:正向最大匹配法
    输入字符:北京理工大学生前来应聘
    分词词典:北京、北京理工、理工、大学、大学生、生前、前来、应聘
    最大长度:6
    

    匹配过程:

    • (1)选取最大长度为6的字段匹配,即“北京理工大学”匹配词典“北京理工大学”在词典中没有匹配字段,则去除一个汉字,剩余“北京理工大”继续匹配,该词也没有匹配字段,继续去除一个汉字,即“北京理工”,分词词典中存在该词,则匹配成功。结果:匹配“北京理工”

    • (2)接着选取长度为6的字符串进行匹配,即“大学生前来应” “大学生前来应”在词典中没有匹配字段,继续从后去除汉字,“大学生” 三个汉字在词典中匹配成功。结果:匹配“大学生”

    • (3)剩余字符串“前来应聘”继续匹配“前来应聘”在词典中没有匹配字段,继续从后去除汉字,直到“前来”。结果:匹配“前来”

    • (4)最后的字符串“应聘”进行匹配。结果:匹配“应聘”

    • 分词结果:北京理工 \ 大学生 \ 前来 \ 应聘

    随着中文数据分析越来越流行、应用越来越广,针对其语义特点也开发出了各种各样的中文分词工具,常见的分词工具包括:

    • Stanford汉语分词工具
    • 哈工大语言云(LTP -cloud)
    • 中国科学院汉语词法分析系统(ICTCLAS)
    • IKAnalyzer分词
    • 盘古分词
    • 庖丁解牛分词

    同时针对Python语言的常见中文分词工具包括:盘古分词、Yaha分词、Jieba分词等,它们的用法都相差不大,由于结巴分词速度较快,可以导入词典如“颐和园”、“黄果树瀑布”等专有名词再进行中文分词等特点,本文主要介绍结巴(Jieba)分词工具讲解中文分词。


    2.Jieba中文分词用法

    (1) 安装过程
    作者推荐大家使用PIP工具来安装Jieba中文分词包。安装语句如下:

    pip install jieba
    

    调用命令“pip install jieba”安装jieba中文分词包如图所示。

    在这里插入图片描述

    安装过程中的会显示安装配置相关包和文件的百分比,直到出现“Successfully installed jieba”命令,表示安装成功。注意,在安装过程中会遇到各种问题,大家一定要学会独立搜索答案解决这些问题,才能提升您独立解决问题的能力。

    同时,如果您使用Anaconda Spyder集成环境,则调用“Anaconda Prompt”命令行模式输入“pip install jieba”命令进行安装。如果您的Python开发环境已经安装了该扩展包,则会提示已经存在Jieba中文分词包,如图所示。

    在这里插入图片描述


    (2) 基础用法
    首先读者看一段简单的结巴分词代码。

    • jieba.cut(text,cut_all=True)
      分词函数,第一个参数是需要分词的字符串,第二个参数表示是否为全模式。分词返回的结果是一个可迭代的生成器(generator),可使用for循环来获取分词后的每个词语,更推荐读者转换为list列表再使用。
    • jieba.cut_for_search(text)
      搜索引擎模式分词,参数为分词的字符串,该方法适合用于搜索引擎构造倒排索引的分词,粒度比较细。
    #coding=utf-8
    #By:Eastmount CSDN
    import jieba  
      
    text = "小杨毕业于北京理工大学,从事Python人工智能相关工作。"  
    
    #全模式
    data = jieba.cut(text,cut_all=True)
    print(type(data))
    print(u"[全模式]: ", "/".join(data))
    
    #精确模式  
    data = jieba.cut(text,cut_all=False)
    print(u"[精确模式]: ", "/".join(data))
    
    #默认是精确模式 
    data = jieba.cut(text)  
    print(u"[默认模式]: ", "/".join(data))
    
    #搜索引擎模式 
    data = jieba.cut_for_search(text)    
    print(u"[搜索引擎模式]: ", "/".join(data))
    
    #返回列表
    seg_list = jieba.lcut(text, cut_all=False)
    print("[返回列表]: {0}".format(seg_list))
    

    输出结果如下所示。

    在这里插入图片描述

    最终的分词结果比较理想,其中精确模式输出的“小/杨/毕业/于/北京理工大学/,/从事/Python/人工智能/相关/工作/。”比较精准。下面简单叙述结巴中文分词的三种分词模式。

    全模式
    该模式将语料中所有可以组合成词的词语都构建出来,其优点是速度非常快,缺点是不能解决歧义问题,并且分词结果不太准确。其分词结果为“小/杨/毕业/于/北京/北京理工/北京理工大学/理工/理工大/理工大学/工大/大学///从事/Python/人工/人工智能/智能/相关/工作//”。

    精确模式
    该模式利用其算法将句子最精确地分隔开,适合文本分析,通常采用这种模式进行中文分词。其分词结果为“小/杨/毕业/于/北京理工大学/,/从事/Python/人工智能/相关/工作/。”,其中“北京理工大学”、“人工智能”这些完整的名词被精准识别,但也有部分词未被识别,后续导入词典可以实现专有词汇识别。

    搜索引擎模式
    该模式是在精确模式基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。其结果为“小/杨/毕业/于/北京/理工/工大/大学/理工大/北京理工大学/,/从事/Python/人工/智能/人工智能/相关/工作/。”。

    Python提供的结巴(Jieba)中文分词包主要利用基于Trie树结构实现高效的词图扫描(构建有向无环图DAG)、动态规划查找最大概率路径(找出基于词频的最大切分组合)、基于汉字成词能力的HMM模型等算法,这里不进行详细叙述,本书更侧重于应用案例。同时结巴分词支持繁体分词和自定义字典方法。

    • ==load_userdict(f) ==

    (3) 中文分词实例
    下面对表1中的语料进行中文分词。代码为依次读取文件中的内容,并调用结巴分词包进行中文分词,然后存储至本地文件中。

    #coding=utf-8
    #By:Eastmount CSDN
    import os  
    import codecs
    import jieba  
    import jieba.analyse
    
    source = open("test.txt", 'r')
    line = source.readline().rstrip('\n')
    content = []
    while line!="":
        seglist = jieba.cut(line,cut_all=False)  #精确模式  
        output = ' '.join(list(seglist))         #空格拼接  
        print(output)
        content.append(output)
        line = source.readline().rstrip('\n')
    else:
        source.close() 
    

    输出如图所示,可以看到分词后的语料。

    在这里插入图片描述


    三.数据清洗

    在分析语料的过程中,通常会存在一些脏数据或噪声词组干扰我们的实验结果,这就需要对分词后的语料进行数据清洗(Data Cleaning)。比如前面使用Jieba工具进行中文分词,它可能存在一些脏数据或停用词,如“我们”、“的”、“吗”等。这些词降低了数据质量,为了得到更好的分析结果,需要对数据集进行数据清洗或停用词过滤等操作。本节主要介绍数据清洗概念、中文数据清洗技术及停用词过滤,并利用Jieba分词工具进行停用词和标点符号的清洗。

    1.数据清洗概述

    脏数据通常是指数据质量不高、不一致或不准确的数据,以及人为造成的错误数据等。作者将常见的脏数据分为四类:

    • 残缺数据
      该类数据是指信息存在缺失的数据,通常需要补齐数据集再写入数据库或文件中。比如统计9月份30天的销售数据,但期间某几天数据出现丢失,此时需要对数据进行补全操作。
    • 重复数据
      数据集中可能存在重复数据,此时需要将重复数据导出让客户确认并修正数据,从而保证数据的准确性。在清洗转换阶段,对于重复数据项尽量不要轻易做出删除决策,尤其不能将重要的或有业务意义的数据过滤掉,校验和重复确认的工作是必不可少的。
    • 错误数据
      该类脏数据常常出现在网站数据库中,是指由于业务系统不够健全,在接收输入后没有进行判断或错误操作直接写入后台数据库造成的,比如字符串数据后紧跟一个回车符、不正确的日期格式等。这类错误可以通过去业务系统数据库用SQL语句进行挑选,再交给业务部门修正。
    • 停用词
      分词后的语料并不是所有的词都与文档内容相关,往往存在一些表意能力很差的辅助性词语,比如中文词组“我们”、“的”、“可以”等,英文词汇“a”、“the”等。这类词在自然语言处理或数据挖掘中被称为停用词(Stop Words),它们是需要进行过滤的。通常借用停用词表或停用词字典进行过滤。

    数据清洗主要解决脏数据,从而提升数据质量,它主要应用于数据仓库、数据挖掘、数据质量管理等领域。读者可以简单将数据清洗定位为:只要是有助于解决数据质量问题的处理过程就被认为是数据清洗,不同领域的数据清洗定义有所不同。总之,数据清洗的目的是保证数据质量,提供准确数据,其任务是通过过滤或者修改那些不符合要求的数据,从而更好地为后面的数据分析作铺垫。

    在这里插入图片描述

    为了解决上述问题,将数据清洗方法划分为:

    • 解决残缺数据
      对于空值或缺失数据,需要采用估算填充方法解决,常见的估算方法包括样本均值、中位数、众数、最大值、最小值等填充,比如选取所有数据的平均值来填充缺失数据。这些方法会存在一定的误差,如果空值数据较多,则会对结果造成影响,偏离实际情况。
    • 解决重复数据
      简单的重复数据需要人为识别,而计算机解决重复数据的方法较为复杂。其方法通常会涉及到实体识别技术,采用有效的技术识别处相似的数据,这些相似数据指向同一实体,再对这些重复数据进行修正。
    • 解决错误数据
      对于错误数据,通常采用统计方法进行识别,如偏差分析、回归方程、正态分布等,也可以用简单的规则库检测数值范围,使用属性间的约束关系来校对这些数据。
    • 解决停用词
      停用词概念由Hans Peter Luhn提出,并为信息处理做出了巨大的贡献。通常存在一个存放停用词的集合,叫做停用词表,停用词往往由人工根据经验知识加入,具有通用性。解决停用词的方法即利用停用词词典或停用词表进行过滤。比如“并”、“当”、“地”、“啊”等字都没有具体的含义,需要过滤,还存在一些如“我们”、“但是”、“别说”、“而且”等词组也需要过滤。

    2.中文语料清洗

    前面已将Python爬取的中文文本语料进行了分词处理,接下来 需要对其进行数据清洗操作,通常包括停用词过滤和特殊标点符号去除等,而对于空值数据、重复数据,作者更建议大家在数据爬取过程中就进行简单的判断或补充缺失值。下面对表1所提供的中文语料(包括贵州、大数据和爱情三个主题)进行数据清洗实例操作。

    (1) 停用词过滤
    上图是使用结巴工具中文分词后的结果,但它存在一些出现频率高却不影响文本主题的停用词,比如“数据分析是数学与计算机科学相结合的产物”句子中的“是”、“与”、“的”等词,这些词在预处理时是需要进行过滤的。

    这里作者定义一个符合该数据集的常用停用词表的数组,然后将分词后的序列,每一个字或词组与停用词表进行比对,如果重复则删除该词语,最后保留的文本能尽可能地反应每行语料的主题。代码如下:

    #coding=utf-8
    #By:Eastmount CSDN
    import os  
    import codecs
    import jieba  
    import jieba.analyse
    
    #停用词表
    stopwords = {}.fromkeys(['的', '或', '等', '是', '有', '之', '与',
                             '和', '也', '被', '吗', '于', '中', '最'])
    
    source = open("test.txt", 'r')
    line = source.readline().rstrip('\n')
    content = []                                 #完整文本
    
    while line!="":
        seglist = jieba.cut(line,cut_all=False)  #精确模式
        final = []                               #存储去除停用词内容
        for seg in seglist: 
            if seg not in stopwords:  
                final.append(seg)
        output = ' '.join(list(final))           #空格拼接
        print(output)
        content.append(output)
        line = source.readline().rstrip('\n')
    else:
        source.close()
    

    其中stopwords变量定义了停用词表,这里只列举了与我们test.txt语料相关的常用停用词,而在真实的预处理中,通常会从文件中导入常见的停用词表,包含了各式各样的停用词,读者可以去网上搜索查看。

    核心代码是for循环判断分词后的语料是否在停用词表中,如果不在则添加到新的数组final中,最后保留的就是过滤后文本,如图所示。

    在这里插入图片描述


    (2) 去除标点符号
    在做文本分析时,标点符号通常也会被算成一个特征,从而影响分析的结果,所以我们需要把标点符号也进行过滤。其过滤方法和前面过滤停用词的方法一致,建立一个标点符号的数组或放到停用词stopwords中,停用词数组如下:

    stopwords = {}.fromkeys(['的', '或', '等', '是', '有', '之', '与',
                             '和', '也', '被', '吗', '于', '中', '最',
                             '“', '”', '。', ',', '?', '、', ';'])
    

    同时将文本内容存储至本地result.txt文件中,完整代码如下:

    # coding=utf-8
    #By:Eastmount CSDN
    import os  
    import codecs
    import jieba  
    import jieba.analyse
    
    #停用词表
    stopwords = {}.fromkeys(['的', '或', '等', '是', '有', '之', '与',
                             '和', '也', '被', '吗', '于', '中', '最',
                             '“', '”', '。', ',', '?', '、', ';'])
    
    source = open("test.txt", 'r')
    result = codecs.open("result.txt", 'w', 'utf-8')
    line = source.readline().rstrip('\n')
    content = []                                 #完整文本
    
    while line!="":
        seglist = jieba.cut(line,cut_all=False)  #精确模式
        final = []                               #存储去除停用词内容
        for seg in seglist:   
            if seg not in stopwords:  
                final.append(seg)
        output = ' '.join(list(final))           #空格拼接
        print(output)
        content.append(output)
        result.write(output + '\r\n')
        line = source.readline().rstrip('\n')
    else:
        source.close()
        result.close()
    

    输出结果如图7所示,得到的语料非常精炼,尽可能的反应了文本主题,其中1-3行为贵州旅游主题、4-6为大数据主题、7-9位爱情主题。

    在这里插入图片描述


    四.特征提取及向量空间模型

    本小节主要介绍特征提取、向量空间模型和余弦相似性的基础知识,并用表21.1所提供的语料进行基于向量空间模型的余弦相似度计算。

    1.特征规约

    经过网络爬取、中文分词、数据清洗后的语料通常称为初始特征集,而初始特征集通常都是由高维数据组成,并且不是所有的特征都很重要。高维数据中可能包含不相关的信息,这会降低算法的性能,甚至高维数据会造成维数灾难,影响数据分析的结果。

    研究发现,减少数据的冗余维度(弱相关维度)或提取更有价值的特征能够有效地加快计算速度,提高效率,也能够确保实验结果的准确性,学术上称为特征规约。

    特征规约是指选择与数据分析应用相关的特征,以获取最佳性能,并且处理的工作量更小。特征规约包含两个任务:特征选择和特征提取。它们都是从原始特征中找出最有效的特征,并且这些特征能尽可能地表征原始数据集。

    (1) 特征提取
    特征提取是将原始特征转换为一组具有明显物理意义或者统计意义的核心特征,所提取的这组特征可以尽可能地表示这个原始语料。特征提取分为线性特征提取和非线性特征提取,其中线性特征提取常见的方法包括:

    • PCA主成分分析方法。该方法寻找表示数据分布的最优子空间,将原始数据降维并提取不相关的部分,常用于降维,参考前面聚类那篇文章。
    • LDA线性判别分析方法。该方法寻找可分性判据最大的子空间。
    • ICA独立成分分析方法。该方法将原始数据降维并提取出相互独立的属性,寻找一个线性变换。

    非线性特征提取常见方法包括Kernel PCA、Kernel FDA等。

    (2) 特征选择
    特征选择是从特征集合中挑选一组最具统计意义的特征,从而实现降维,通常包括产生过程、评价函数、停止准则、验证过程四个部分。传统方法包括信息增益(Information Gain,简称IG)法、随机产生序列选择算法、遗传算法( Genetic Algorithms,简称GA )等。

    下图是图像处理应用中提取Lena图的边缘线条特征的实例,可以利用一定量的特征尽可能的描述整个人的轮廓,它和数据分析中的应用也是相同的原理。

    在这里插入图片描述


    2.向量空间模型

    向量空间模型(Vector Space Model,简称VSM)是通过向量的形式来表征一个文档,它能够将中文文本转化为数值特征,从而进行数据分析。作为目前最为成熟和应用最广的文本表示模型之一,向量空间模型已经广泛应用于数据分析、自然语言处理、中文信息检索、数据挖掘、文本聚类等领域,并取得了一定成果。

    采用向量空间模型来表示一篇文本语料,它将一个文档(Document)或一篇网页语料(Web Dataset)转换为一系列的关键词(Key)或特征项(Term)的向量。

    • 特征项(Trem)
      特征项是指文档所表达的内容由它所含的基本语言单位(字、词、词组或短语)组成,在文本表示模型中,基本语言单位即称为文本的特征项。例如文本Doc中包含n个特征项,表示为:

    在这里插入图片描述

    • 特征权重(Trem Weight)
      特征权重是指为文档中的某个特征项ti(1≤ i ≤n)赋予权重wi,以表示该特征项对于文档内容的重要程度,权重越高的特征项越能反应其在文档中的重要性。文本Doc中存在n个特征项,即:{t1, t2, t3, … , tn-1, tn},它是一个n维坐标,接着需要计算出各特征项ti在文本中的权重wi,为对应特征的坐标值。按特征权重文本表示如下,其中,WDoc称为文本Doc的特征向量。

    在这里插入图片描述

    • 文档表示
      得到了特征项和特征权重后,需要表示一篇文档,则利用下面这个公式。其中,文档Doc共包含n个特征词和n个权重。ti是一系列相互之间不同的特征词,i=1,2,…,n。wi(d)是特征词ti在文档d中的权重,它通常可以被表达为ti在d中呈现的频率。

    在这里插入图片描述

    特征项权重W有很多种不同的计算方法,最简单的方法是以特征项在文本中的出现次数作为该特征项的权重,第五部分将详细叙述。

    在这里插入图片描述

    从上图可以看到,将文档存储为词频向量的过程,转换为{1,0,1,0,…,1,1,0}形式。特征项的选取和特征项权重的计算是向量空间模型的两个核心问题,为了使特征向量更能体现文本内容的含义,要为文本选择合理的特征项,并且在给特征项赋权重时遵循对文本内容特征影响越大的特征项的权值越大的原则。


    3.余弦相似度计算

    当使用上面的向量空间模型计算得到两篇文章的向量后,则可以计算两篇文章的相似程度,两篇文章间的相似度通过两个向量的余弦夹角Cos来描述。文本D1和D2的相似度计算公式如下:

    在这里插入图片描述

    其中,分子表示两个向量的点乘积,分母表示两个向量的模的乘积。通过余弦相似性计算后,得到了任意两篇文章的相似程度,可以将相似程度越高的文档归类到同一主题,也可以设定阈值进行聚类分析。该方法的原理是将语言问题转换为数学问题来解决实际问题。

    下图是向量空间模型图,它展示了文档Term1、Term2、…、TermN之间的余弦相似度计算方法,如果两篇文档越相似,则其夹角θ越小,Cos值越接近于1,当两篇文档完全相似时,此时的夹角为0°,Cos值为1。这也展示了余弦相似性的原理知识。

    在这里插入图片描述

    下面我们借用两个句子来计算其与“北京理工大学生前来应聘”的余弦相似程度。假设存在三个句子,需要看哪一个句子和“北京理工大学生前来应聘”相似程度更高,则认为主题更为类似。那么,如何计算句子A和句子B的相似性呢?

    句子1:北京理工大学生前来应聘
    
    句子2:清华大学大学生也前来应聘
    
    句子3: 我喜欢写代码
    

    下面采用向量空间模型、词频及余弦相似性计算句子2和句子3分别与句子1的相似性。

    第一步:中文分词。

    句子1:北京理工 / 大学生 / 前来 / 应聘
    
    句子2:清华大学 / 大学生 // 前来 / 应聘
    
    句子3: 我 / 喜欢 // 代码
    

    第二步:列出所有词语,按照词出现的先后顺序。

    北京理工 / 大学生 / 前来 / 应聘 / 清华大学 /// 喜欢 // 代码
    

    第三步:计算词频。如表所示。

    在这里插入图片描述

    第四步:写出词频向量。

    句子1[1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
    
    句子2[0, 1, 1, 1, 1, 1, 0, 0, 0, 0]
    
    句子3[0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
    

    第五步:计算余弦相似度。

    在这里插入图片描述

    在这里插入图片描述

    其结果显示句子1和句子2的相似度为0.67,存在一定的相似主题;而句子1和句子3的相似度为0,完全不相似。

    总之,余弦相似度是一种非常有用的算法,只要是计算两个向量的相似程度,都可用它。当余弦值越接近1时,表明两个向量的夹角越接近0度,两个向量越相似。但余弦相似性作为最简单的相似度计算方法,也存在一些缺点,如计算量太大、词之间的关联性没考虑等。


    五.权重计算

    前面讲述的词频权重计算的方法过于简单,下面就给大家介绍下其他权重计算方法。

    权重计算是指通过特征权重来衡量特征项在文档表示中的重要程度,给特征词赋予一定的权重来衡量统计文本特征词。常用的权重计算方法包括:布尔权重、绝对词频、倒文档词频、TF-IDF、TFC、熵权重等。

    1.常用权重计算方法

    (1) 布尔权重
    布尔权重是比较简单的权重计算方法,设定的权重要么是1,要么是0。如果在文本中出现了该特征词,则文本向量对应该特征词的分量赋值为1;如果该特征词没有在文本中出现,则分量为0。公式如下所示,其中wij表示特征词ti在文本Dj中的权重。

    在这里插入图片描述

    假设特征向量为:

    • {北京理工,大学生,前来,应聘,清华大学,也,我,喜欢,写,代码}

    现在需要计算句子“北京理工大学生前来应聘”的权重,则特征词在特征向量中存在的,对应分量为1,不存在的对应分量为0,最终特征向量结果为:

    • {1,1,1,1,0,0,0,0,0,0}

    但是实际应用中,布尔权重0-1值是无法体现特征词在文本中的重要程度,那就衍生出了词频这种方法。


    (2) 绝对词频
    词频方法又称为绝对词频(Term Frequency,简称TF),它首先计算特征词在文档中出现的频率,再来表征文本。通常使用tfij表示,即特征词ti在训练文本Dj中出现的频率。

    在这里插入图片描述

    假设句子为“北京理工大学的大学生和清华大学的大学生前来应聘”,而对应的特征词为:{北京理工,大学生,前来,应聘,清华大学,也,我,喜欢,写,代码,的,和},对应词频向量为:

    • {1,2,1,1,1,0,0,0,0,0,2,1}

    前面所采用的向量空间模型计算文本余弦相似性的例子也使用的是词频,这是权重计算方法中最简单、有效的方法之一。


    (3) 倒文档频率
    由于词频方法无法体现低频特征项的区分能力,往往存在某些特征项频率很高,却在文本中起到很低影响程度的现象,如“我们”、“但是”、“的”等词语;同时,有的特征项虽然出现的频率很低,但表达着整个文本的核心思想,起着至关重要的作用。

    倒文档频率(Inverse Document Frequency,简称IDF)方法是Spark Jones在1972年提出的,用于计算词与文献相关权重的经典方法。公式如下:

    在这里插入图片描述

    其中,参数|D|表示语料的文本总数,表示文本所包含特征词ti的数量。

    在倒文档频率方法中,权重是随着特征词的文档数量的变化呈反向变化。如某些常用词“我们”、“但是”、“的”等,在所有文档中出现频率很高,但它的IDF值却非常低。甚至如果它每篇文档都出现,则log1的计算结果为0,从而降低了这些常用词的作用;相反,如果某篇介绍“Python”的词,仅仅在该篇文档中出现,它的作用就非常高。

    同样还有很多权重计算方法,包括TF-IDF、熵权重、TF-IWF、基于错误驱动的特征权重算法等,读者可以自行研究,这里仅仅简单引入了最基础的几种方法。


    2.TF-IDF

    TF-IDF(Term Frequency-Invers Document Frequency)是近年来用于数据分析和信息处理经典的权重计算技术。该技术根据特征词在文本中出现的次数和在整个语料中出现的文档频率来计算该特征词在整个语料中的重要程度,其优点是能过滤掉一些常见却无关紧要的词语,尽可能多的保留影响程度高的特征词。

    其中,TF(Term Frequency)表示某个关键词在整篇文章中出现的频率或次数。IDF(Invers Document Frequency)表示倒文本频率,又称为逆文档频率,它是文档频率的倒数,主要用于降低所有文档中一些常见却对文档影响不大的词语的作用。TF-IDF的完整公式如下:

    在这里插入图片描述

    式中tfidfi,j表示词频tfi,j和倒文本词频idfi的乘积,TF-IDF中权重与特征项在文档中出现的频率成正比,与在整个语料中出现该特征项的文档数成反比。tfidfi,j值越大则该特征词对这个文本的重要程度越高。

    TF词频的计算公式如下:

    在这里插入图片描述

    其中,ni,j为特征词ti在训练文本Dj中出现的次数,是文本Dj中所有特征词的个数,计算的结果即为某个特征词的词频。

    TF-IDF公式推导如下所示:

    在这里插入图片描述

    TF-IDF技术的核心思想是如果某个特征词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来做权重计算。TF-IDF算法简单快速,结果也符合实际情况,其缺点是单纯以词频衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多,并且该算法无法体现词的位置信息。


    3.Sklearn计算TF-IDF

    Scikit-Learn是基于Python的机器学习模块,基本功能主要分为六个部分:分类、回归、聚类、数据降维、模型选择和数据预处理,具体可以参考官方网站上的文档。本书前面详细介绍了Scikit-Learn的安装及使用方法。这里主要使用Scikit-Learn中的两个类CountVectorizer和TfidfTransformer,用来计算词频和TF-IDF值。

    • CountVectorizer
      该类是将文本词转换为词频矩阵的形式。比如“I am a teacher”文本共包含四个单词,它们对应单词的词频均为1,“I”、“am”、“a”、“teacher”分别出现一次。CountVectorizer将生成一个矩阵a[M][N],共M个文本语料,N个单词,比如a[i][j]表示单词j在i类文本下的词频。再调用fit_transform()函数计算各个词语出现的次数,get_feature_names()函数获取词库中的所有文本关键词。

    计算result.txt文本的词频代码如下,下表是表1数据集被中文分词、数据清洗后的结果,如下所示。

    在这里插入图片描述

    贵州省 位于 中国 西南地区 简称 黔 贵
    走遍 神州大地 醉美 多彩 贵州
    贵阳市 是 贵州省 省会 有 林城 美誉
    数据分析 是 数学 计算机科学 相结合 产物 
    回归 聚类 分类 算法 广泛应用 数据分析
    数据 爬取 数据 存储 数据分析 紧密 相关 过程
    最 甜美 爱情 最 苦涩 爱情
    一只 鸡蛋 可以 画 无数次 一场 爱情
    真爱 往往 珍藏 最 平凡 普通 生活
    

    代码如下:

    #coding:utf-8
    #By:Eastmount CSDN
    from sklearn.feature_extraction.text import CountVectorizer  
      
    #存储读取语料 一行预料为一个文档
    corpus = []  
    for line in open('result.txt', 'r', encoding="utf-8").readlines():  
        corpus.append(line.strip())
        
    #将文本中的词语转换为词频矩阵  
    vectorizer = CountVectorizer()
    
    #计算个词语出现的次数  
    X = vectorizer.fit_transform(corpus)
    
    #获取词袋中所有文本关键词  
    word = vectorizer.get_feature_names()  
    for n in range(len(word)):  
        print(word[n],end=" ")
    print('')
        
    #查看词频结果  
    print(X.toarray())
    

    输出如下图所示。

    在这里插入图片描述

    • TfidTransformer
      当使用CountVectorizer类计算得到词频矩阵后,接下来通过TfidfTransformer类实现统计vectorizer变量中每个词语的TF-IDF值,代码补充如下。
    #coding:utf-8
    #By:Eastmount CSDN
    from sklearn.feature_extraction.text import CountVectorizer  
    from sklearn.feature_extraction.text import TfidfTransformer
    
    #存储读取语料
    corpus = []  
    for line in open('result.txt', 'r', encoding="utf-8").readlines():  
        corpus.append(line.strip())
    vectorizer = CountVectorizer()        #将文本中的词语转换为词频矩阵 
    X = vectorizer.fit_transform(corpus)  #计算个词语出现的次数  
    word = vectorizer.get_feature_names() #获取词袋中所有文本关键词   
    for n in range(len(word)):  
        print(word[n],end=" ")
    print('')  
    print(X.toarray())                    #查看词频结果 
    
    #计算TF-IDF值
    transformer = TfidfTransformer()  
    print(transformer)
    tfidf = transformer.fit_transform(X) #将词频矩阵X统计成TF-IDF值  
    #查看数据结构 
    print(tfidf.toarray())               #tfidf[i][j]表示i类文本中的tf-idf权重
    

    运行部分结果如下图所示。

    在这里插入图片描述

    TF-IDF值采用矩阵数组的形式存储,每一行数据代表一个文本语料,每一行的每一列都代表其中一个特征对应的权重,得到TF-IDF后就可以运用各种数据分析算法进行分析,比如聚类分析、LDA主题分布、舆情分析等等。


    六.文本聚类

    获取文本TF-IDF值之后,本小节简单讲解使用TF-IDF值进行文本聚类的过程,主要包括如下五个步骤:

    • 第一步,对中文分词和数据清洗后的语料进行词频矩阵生成操作。主要调用CountVectorizer类计算词频矩阵,生成的矩阵为X。
    • 第二步,调用TfidfTransformer类计算词频矩阵X的TF-IDF值,得到Weight权重矩阵。
    • 第三步,调用Sklearn机器学习包的KMeans类执行聚类操作,设置的类簇数n_clusters为3,对应语料贵州、数据分析和爱情的三个主题。然后调用fit()函数训练,并将预测的类标赋值给y_pred数组。
    • 第四步,调用Sklearn库PCA()函数进行降维操作。由于TF-IDF是多维数组,是9行文本所有特征对应的权重,而在绘图之前需要将这些特征降低为二维,对应X和Y轴。
    • 第五步,调用Matplotlib函数进行可视化操作,绘制聚类图形,并设置图形参数、标题、坐标轴内容等。

    代码如下。

    # coding:utf-8
    #By:Eastmount CSDN
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.feature_extraction.text import TfidfTransformer  
      
    #第一步 生成词频矩阵
    corpus = []  
    for line in open('result.txt', 'r', encoding="utf-8").readlines():  
        corpus.append(line.strip())
    vectorizer = CountVectorizer() 
    X = vectorizer.fit_transform(corpus) 
    word = vectorizer.get_feature_names()    
    for n in range(len(word)):  
        print(word[n],end=" ")
    print('')  
    print(X.toarray())
    
    #第二步 计算TF-IDF值
    transformer = TfidfTransformer()  
    print(transformer)
    tfidf = transformer.fit_transform(X)
    print(tfidf.toarray())
    weight = tfidf.toarray()
    
    #第三步 KMeans聚类
    from sklearn.cluster import KMeans  
    clf = KMeans(n_clusters=3)  
    s = clf.fit(weight) 
    y_pred = clf.fit_predict(weight)
    print(clf)
    print(clf.cluster_centers_) #类簇中心
    print(clf.inertia_)         #距离:用来评估簇的个数是否合适 越小说明簇分的越好
    print(y_pred)               #预测类标
    
    #第四步 降维处理
    from sklearn.decomposition import PCA  
    pca = PCA(n_components=2)   #降低成两维绘图 
    newData = pca.fit_transform(weight)  
    print(newData)
    x = [n[0] for n in newData]  
    y = [n[1] for n in newData]  
    
    #第五步 可视化
    import numpy as np  
    import matplotlib.pyplot as plt   
    plt.scatter(x, y, c=y_pred, s=100, marker='s')  
    plt.title("Kmeans")    
    plt.xlabel("x")  
    plt.ylabel("y")    
    plt.show() 
    

    聚类输出如图所示。

    请添加图片描述

    图中共绘制了6个点,将数据聚集为三类,对应不同的颜色。其中对应的类标为:

    • [2 0 2 0 0 0 1 1 0]

    它将第1、3行语料聚集在一起,类标为2;第2、4、5、6、9行聚集为一组,类标为0;第7、8行语料聚集为最后一组,类标为1。而真实数据集中,第1、2、3行表示贵州主题,第4、5、6行表示数据分析主题,第7、8、9行表示爱情主题,所以数据分析预测结果会存在一定误差,我们需要将误差尽可能的降低,类似于深度学习,也是在不断学习中进步。

    您可能会疑惑为什么9行数据,却只绘制了6个点呢?下面是9行数据进行降维处理生成的X和Y坐标,可以看到部分数据是一样的,这是因为这9行语料所包含的词较少,出现的频率基本都是1次,在生成词频矩阵和TF-IDF后再经降维处理可能出现相同的现象,而真实分析中语料所包含词语较多,聚类分析更多的散点更能直观地反应分析的结果。

    [[-0.19851936  0.594503  ]
     [-0.07537261  0.03666604]
     [-0.19851936  0.594503  ]
     [-0.2836149  -0.40631642]
     [-0.27797826 -0.39614944]
     [-0.25516435 -0.35198914]
     [ 0.68227073 -0.05394154]
     [ 0.68227073 -0.05394154]
     [-0.07537261  0.03666604]]
    

    研究生期间,作者在研究知识图谱、实体对齐知识时,曾采用过KMeans聚类算法对所爬取的四个主题百科数据集进行文本聚类分析,其聚类结果如图所示。

    在这里插入图片描述

    图中红色表示旅游景点主题文本、绿色表示保护动物主题文本、蓝色表示人物明星主题文本、黑色表示国家地理主题文本。从图中可以发现四类主题分别聚集成四个类簇。这是文本分析的一个简单示例,希望读者能根据本章的知识点,分析自己所研究的文本知识。


    七.总结

    前面讲述的数据分析内容几乎都是基于数字、矩阵的,而也有一部分数据分析会涉及文本处理分析,尤其是中文文本数据,它们究竟怎么处理呢?当我们通过网络爬虫得到中文语料之后,我们究竟能不能进行数据分析呢?答案肯定是能的。

    但是不同于之前的数据分析,它还需要经历中文分词、数据清洗、特征提取、向量空间模型、权重计算等步骤,将中文数据转换为数学向量的形式,这些向量就是对应的数值特征,然后才能进行相应的数据分析。本章讲解贯穿着自定义的数据集,它包含了贵州、数据分析、爱情三个主题的语料,采用KMeans聚类算法进行实例讲解,希望读者认真学习,掌握中文语料分析的方法,如何将自己的中文数据集转换成向量矩阵,再进行相关的分析。

    在这里插入图片描述

    最后希望读者能复现每一行代码,只有实践才能进步。同时更多聚类算法和原理知识,希望读者下来自行深入学习研究,也推荐大家结合Sklearn官网和开源网站学习更多的机器学习知识。

    该系列所有代码下载地址:

    感谢在求学路上的同行者,不负遇见,勿忘初心。这周的留言感慨~

    在这里插入图片描述

    (By:娜璋之家 Eastmount 2021-08-06 夜于武汉 https://blog.csdn.net/Eastmount )


    参考文献:

    • [1] 杨秀璋. 专栏:知识图谱、web数据挖掘及NLP - CSDN博客[EB/OL]. (2016-09-19)[2017-11-07]. http://blog.csdn.net/column/details/eastmount-kgdmnlp.html.
    • [2] 杨秀璋. [python] LDA处理文档主题分布及分词、词频、tfidf计算[EB/OL]. (2016-03-15)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50891162.
    • [3] 杨秀璋. [python] 使用scikit-learn工具计算文本TF-IDF值[EB/OL]. (2016-08-08)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50323063.
    • [4] 杨秀璋. [python] 基于k-means和tfidf的文本聚类代码简单实现[EB\OL]. (2016-01-16)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50473675.
    • [5] 杨秀璋. [python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像[EB/OL]. (2016-01-20)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50545937.
    • [6] 张良均,王路,谭立云,苏剑林. Python数据分析与挖掘实战[M]. 北京:机械工业出版社,2016.
    • [7] (美)Wes McKinney著. 唐学韬等译. 利用Python进行数据分析[M]. 北京:机械工业出版社,2013.
    • [8] Jiawei Han,Micheline Kamber著. 范明,孟小峰译. 数据挖掘概念与技术. 北京:机械工业出版社,2007.
    展开全文
  • 在开始进行NLP的相关任务时,首先需要做一些预备工作,比如说数据清洗、提取等,接下来就让我们来看一下具体有哪些操作吧。 一、Linux的一些常用命令? wc -l file: 看文件一共有多少行 more file: 观察部分文件 ...
  • 数据清洗之微博内容清洗

    千次阅读 2019-10-02 19:52:34
    获取文字加表情(alt标签的属性) #!/usr/bin/env python # encoding: utf-8 from functools import reduce from lxml import html from bs4 import BeautifulSoup ...<div>...span class="url-icon">...i...
  • 数据挖掘 NLP 之 文本挖掘 文本处理 通用流程  数据挖掘中的文本挖掘不论是对于企业应用,还是研究者工作,或者是参与数据竞赛项目,都是基础的工作。通过前面的一些实践工作,现总结出文本挖掘文本处理的...
  • 大众点评评论文本挖掘[TOC]一、爬虫整体思路爬取大众点评十大热门糖水店的评论,爬取网页后从html页面中把需要的字段信息(顾客id、评论时间、评分、评论内容、口味、环境、服务、店铺ID)提取出来并存储到MYSQL数据库...
  • 大众点评评论文本挖掘,包括点评数据爬取、数据清洗入库、数据分析、评论情感分析等的完整挖掘项目
  • 涵盖8大场景的数据清洗代码这些数据清洗代码,一共涵盖8个场景,分别是:删除多列、更改数据类型、将分类变量转换为数字变量、检查缺失数据、删除列中的字符串、删除列中的空格、用字符串连接两列(带条件)、转换...
  • 读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇...
  • 文本数据挖掘一般步骤

    千次阅读 2020-01-24 11:06:52
    转载自潇一:简要的谈谈文本数据挖掘的一般步骤 原文 一、获取文本 一般来说网络文本的获取,主要是网页的形式。我们要把网络中的文本获取形成一个文本数据库(数据集)。利用一个爬虫(这是另外一个知识点),...
  • 文本大数据读取 Go SDK 1.13.5 package main import ( "bufio" "fmt" "io" "io/ioutil" "os" "strings" ) //一次性将全部数据读入内存 func main1() { contentBytes,err := ioutil.ReadFile("d:/...
  • python数据挖掘-文本挖掘(词频统计)

    千次阅读 2019-05-11 21:06:21
    有些无用却频繁出现的分词,像“的”、“得”、“地”、“是”等,我们并不希望这些分词也被进行词频统计,因为统计这些分词没有什么意义,所以事先建立一个停分词文件,等会代码中利用这些停分词进行数据清洗 ...
  • 对于文本挖掘,半结构化和非结构化文档是最主要的数据集。文本挖掘有几个主要的类型,比如聚类、文档检索与表示,以及异常检测,文本挖掘的应用包括,但不局限于,话题追踪、文本总结与分类。对于网络挖掘,网络...
  • 近年来,随着互联网的广泛应用和电子商务的迅速发展,网络文本及用户评论分析意义日益凸显,因此网络文本挖掘及网络文本情感分析技术应运而生,通过对文本或者用户评论的情感分析,企业能够进行更有效的管理等。...
  • 文本处理,将原文件中出现的停用词去除4.根据用户web 表单输入,检索出包含用户输入参数的句子代码实现:1.文件读取,分词,源文件词频统计python 读取 西班牙语文本编码:encoding='ISO-8859-1'1 #csv 文件读取,...
  • LDA中文文本挖掘代码分享

    千次阅读 2021-12-14 15:46:43
    1、文本数据保存的时候记得要选择utf-8否则会报错 2、中文停词表自己去网上找就OK啦,网上有很多 3、可以选择读单个文件or文件夹的所有文件,默认的是单个文件,如果要用所有文件,把注释那部分删掉#就可以了 # ...
  • 大众点评评论文本挖掘[TOC]一、爬虫整体思路爬取大众点评十大热门糖水店的评论,爬取网页后从html页面中把需要的字段信息(顾客id、评论时间、评分、评论内容、口味、环境、服务、店铺ID)提取出来并存储到MYSQL数据库...
  • 文本挖掘是一门交叉性学科,涉及数据挖掘、机器学习、模式识别、人工智能、统计学、计算机语言学、计算机网络技术、信息学等多个领域。文本挖掘就是从大量的文档中发现隐含知识和模式的一种方法和工具,它从数据挖掘...
  • 数据挖掘数据清洗——缺失值处理

    千次阅读 多人点赞 2020-02-17 16:15:02
    数据挖掘数据预处理——缺失值处理 一、什么是缺失值 缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类、分组、删失或截断。它指的是现有数据集中某个或某些属性的值是不完全的。 而在数据处理的过程中,缺失...
  • 各大电商竞争越来激烈,为了提升客户服务质量,除了打价格战外,了解客户的需求点,对消费者的文本评论进行数据挖掘,倾听客户的心声越来越重要。 工具 1、贝壳采集器 2、Google浏览器 3、Python3.7 + Pycharm 数据...
  • 一款能实时进行文本挖掘的软件,不占用多余的存储空间,直接将采集后的数据集中存储在本地txt中,运用本软件无需进行大量的手动翻页操作,输入对应的店铺链接即可对民宿进行分析包含接结构化数据的可视化和非结构化...
  • 本文是刊载于《经济学(季刊)》2019年第4期《文本数据分析在经济学和金融学中的应用:一个文献综述》和《经济学动态》2020年第4期《金融学文本数据挖掘方法与研究进展》的阅读笔记 在金融学领域的传统实证研究...
  • 本分析中很多的工作都是基于评论数据来进行的,比如:滴滴出行的评价数据、租房的评价数据、电影的评论数据等等,从这些语料数据中能够挖掘出来客户群体对于某种事物或者事情的看法,较为常见的工作有:舆情分析、...
  • 基于文本内容的垃圾短信分类总体流程数据展示数据抽取数据预处理数据清洗去除空格x序列x序列文本去重分词中文分词添词典去停用词去停用词绘制词云文本向量的表示One-Hot表达TF-IDF权重策略文本分类实例模型训练及...
  • 温馨提示:图片显示毛糙和不清楚,是分辨率过高的缘故,点击图片,即可看到高清大图。之前在八月份写过一篇针对外部数据分析的文章,《作为一个合格的“增长黑客”,你还得重视外部数据的分析!》,一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,959
精华内容 3,583
关键字:

文本挖掘数据清洗