• python之NLP数据清洗


    1、知识点

    """
    安装模块:bs4 nltk gensim
    nltk:处理英文
        1、安装
        2、nltk.download() 下载相应的模块
    
    英文数据处理:
        1、去掉html标签  example = BeautifulSoup(df['review'][1000],'html.parser').get_text()
        2、移除标点      example_letter = re.sub(r'[^a-zA-Z]',' ',example)
        3、切分成词/token      words = example_letter.lower().split()
        4、去掉停用词  例如:the  a  an  it's
                    stopwords = {}.fromkeys([line.rstrip() for line in open('./stopwords.txt')])
                    words_nostop = [w for w in words if w not in stopwords]
        5、重组为新的句子
    
    词向量解决方案:
        1、one-hot编码
            缺点:这种方案浪费存储空间还是次要的,更重要的是词与词(向量与向量)之间没有相关性,计算机完全无法进行哪怕一丁点的理解和处理
        2、基于奇异值分解(SVD)的方法
            步骤:a)第一步是通过大量已有文档统计形成词空间矩阵X,有两种办法。
                    一种是统计出某篇文档中各个词出现的次数,假设词的数目是W、文档篇数是M,则此时X的维度是W*M;
                    第二种方法是针对某个特定词,统计其前后文中其它词的出现频次,从而形成W*W的X矩阵。
                  b)第二步是针对X矩阵进行SVD分解,得到特征值,根据需要截取前k个特征值及对应的前k个特征向量,
                    那么前k个特征向量构成的矩阵维度是W*k,这就构成了所有W个词的k维表示向量
            缺点:
                1、需要维护一个极大的词空间稀疏矩阵X,而且随着新词的出现还会经常发生变化;
                2、SVD运算量大,而且每增减一个词或文档之后,都需要重新计算
        3、构建一个word2vec模型:通过大量文档迭代学习其中的参数及已有词的编码结果,这样每新来一篇文档都不用修改已有模型,只需要再次迭代计算参数和词向量即可
                举例:我爱python和java
                a)CBOW算法: 输入:我爱, 目标值:python和java
                       CBOW算法使用上下文窗口内词向量作为输入,将这些向量求和(或取均值)后,求得与输出词空间的相关性分布,
                       进而使用softmax函数得到在整个输出词空间上的命中概率,与目标词one-hot编码的交叉熵即为loss值,
                       通过loss针对输入和输出词向量的梯度,即可使用梯度下降(gradient descent)法得到一次针对输入和输出词向量的迭代调整。
    
                b)Skip-Gram算法: 输入:python和java, 目标值:我爱
                        Skip-Gram算法使用目标词向量作为输入,求得其与输出词空间的相关性分布,
                        进而使用softmax函数得到在整个输出词空间上的命中概率,与one-hot编码的上下文词逐一计算交叉熵,
                        求和后即为loss值,通过loss针对输入和输出词向量的梯度,
                        即可使用梯度下降(gradient descent)法得到一次针对输入和输出词向量的迭代调整
    """

    2、中文数据清洗(使用停用词)

    import os
    import re
    import numpy as np
    import pandas as pd
    from bs4 import BeautifulSoup
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.metrics import confusion_matrix
    from sklearn.linear_model import LogisticRegression
    import nltk
    from nltk.corpus import stopwords
    import  jieba
    def clean_chineses_text(text):
        """
        中文数据清洗  stopwords_chineses.txt存放在博客园文件中
        :param text:
        :return:
        """
        text = BeautifulSoup(text, 'html.parser').get_text() #去掉html标签
        text =jieba.lcut(text);
        stopwords = {}.fromkeys([line.rstrip() for line in open('./stopwords_chineses.txt')]) #加载停用词(中文)
        eng_stopwords = set(stopwords) #去掉重复的词
        words = [w for w in text if w not in eng_stopwords] #去除文本中的停用词
        return ' '.join(words)

    3、英文数据清洗(使用停用词)

    import os
    import re
    import numpy as np
    import pandas as pd
    from bs4 import BeautifulSoup
    from sklearn.feature_extraction.text import CountVectorizer
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.metrics import confusion_matrix
    from sklearn.linear_model import LogisticRegression
    import nltk
    from nltk.corpus import stopwords
    import  jieba
    def clean_english_text(text):
        """
        英文数据清洗  stopwords_english.txt存放在博客园文件中
        :param text:
        :return:
        """
        text = BeautifulSoup(text, 'html.parser').get_text() #去掉html标签
        text = re.sub(r'[^a-zA-Z]', ' ', text)  #只保留英文字母
        words = text.lower().split()  #全部小写
        stopwords = {}.fromkeys([line.rstrip() for line in open('./stopwords_english.txt')]) #加载停用词(中文)
        eng_stopwords = set(stopwords) #去掉重复的词
        words = [w for w in words if w not in eng_stopwords] #去除文本中的停用词
        print(words)
        return ' '.join(words)
    
    if __name__ == '__main__':
        text = "ni hao ma ,hello ! my name is haha'. ,<br/> "
        a = clean_english_text(text)
        print(a)
    
        test1 = "你在干嘛啊,怎么不回复我消息!,对了“你妈在找你”。"
        b = clean_chineses_text(test1)
        print(b)

     4、nltk的停用词进行数据清洗

    def clean_english_text_from_nltk(text):
        """
        使用nltk的停用词对英文数据进行清洗
        :param text: 
        :return: 
        """
        text = BeautifulSoup(text,'html.parser').get_text() #去掉html标签
        text = re.sub(r'[^a-zA-Z]',' ',text) #除去标点符号
        words = text.lower().split() #转为小写并切分
        stopwords = nltk.corpus.stopwords.words('english') #使用nltk的停用词
        wordList =[word for word in words if word not in stopwords]
        return ' '.join(wordList)
  • 相关阅读:
    提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
    五维偏序模板(bitset+分块)
    【BZOJ5328】【SDOI2018】—物理实验(扫描线+双指针)
    【VIOLET3】【BZOJ2716】天使玩偶(cdq分治)
    【BZOJ3295】【CQOI2011】—动态逆序对(cdq分治)
    【BZOJ1492】【NOI2007】—Cash(cdq分治维护凸包优化斜率dp)
    【BJOI2018】【BZOJ2591】—链上二次求和(线段树维护二次函数)
    【COGS2479】【HZOI2016】偏序(cdq套cdq)
    【BZOJ5293】【BJOI2018】—求和
    【BZOJ4009】【HNOI2015】—接水果(整体二分+扫描线)
  • 原文地址:https://www.cnblogs.com/ywjfx/p/11019689.html
Copyright © 2020-2023  润新知