python之NLP数据清洗

Posted ywjfx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

以上是关于python之NLP数据清洗的主要内容,如果未能解决你的问题,请参考以下文章

数据清洗之 聚合函数使用

Python第19课:数据清洗之去错、去空、去重

Python数据清洗之csv Reader zip匹配与组装

Python数据清洗之Numpy

数据清洗之 重复值处理

Python数据清洗之csv Reader lookup匹配缺失列