zoukankan      html  css  js  c++  java
  • Python3实现文本预处理

    1、数据集准备

          测试数据集下载:https://github.com/Asia-Lee/Vulnerability_classify/blob/master/testdata.xls

          停用词过滤表下载:https://github.com/Asia-Lee/Vulnerability_classify/blob/master/stopwords.txt

    2、数据预处理

    (1)简单分词

    # -*- coding: utf-8 -*-
    
    import pandas as pd
    import jieba
    """
    函数说明:简单分词
    Parameters:
         filename:数据文件
    Returns:
         list_word_split:分词后的数据集列表
         category_labels: 文本标签列表
    """
    def word_split(filename):
        read_data=pd.read_excel(filename)
        list_word_split=[]
        category_labels=[]
        for i in range(len(read_data)):
            row_data = read_data.iloc[i, 1]           # 读取单个漏洞描述文本
            list_row_data = list(jieba.cut(row_data)) # 对单个漏洞进行分词
            list_row_data=[x for x in list_row_data if x!=' '] #去除列表中的空格字符
            list_word_split.append(list_row_data)
    
            row_data_label=read_data.iloc[i,2]   #读取单个漏洞的类别标签
            category_labels.append(row_data_label) #将单个漏洞的类别标签加入列表
        return list_word_split, category_labels
    
    if __name__=='__main__':
        list_word_split, category_labels=word_split('testdata.xls') #获得每条文本的分词列表和标签列表
        print(list_word_split)
        print(category_labels)
        print('分词成功')
    

      分词结果:

    (2)词性还原

    # -*- coding: utf-8 -*-
    
    import pandas as pd
    import jieba
    from nltk.stem import WordNetLemmatizer
    
    
    """
    函数说明:词性还原
    Parameters:
         list_words:数据列表
    Returns:
         list_words_lemmatizer:词性还原后的数据集列表
    """
    def word_lemmatizer(list_words):
        wordnet_lemmatizer = WordNetLemmatizer()
        list_words_lemmatizer = []
        for word_list in list_words:
            lemmatizer_word = []
            for i in word_list:
                lemmatizer_word.append(wordnet_lemmatizer.lemmatize(i))
            list_words_lemmatizer.append(lemmatizer_word)
        return list_words_lemmatizer
    
    
    if __name__=='__main__':
        list_word_split, category_labels=word_split('testdata.xls') #获得每条文本的分词列表和标签列表
        print('分词成功')
        list_words_lemmatizer=word_lemmatizer(list_word_split)  #词性还原
        print('词性还原成功')
    

      

    (3)停用词过滤

    # -*- coding: utf-8 -*-
    
    import pandas as pd
    import jieba
    from nltk.stem import WordNetLemmatizer
    
    """
    函数说明:停用词过滤
    Parameters:
         filename:停用词文件
         list_words_lemmatizer:词列表
    Returns:
         list_filter_stopwords:停用词过滤后的词列表
    """
    def stopwords_filter(filename,list_words_lemmatizer):
        list_filter_stopwords=[]  #声明一个停用词过滤后的词列表
        with open(filename,'r') as fr:
            stop_words=list(fr.read().split('
    ')) #将停用词读取到列表里
            for i in range(len(list_words_lemmatizer)):
                word_list = []
                for j in list_words_lemmatizer[i]:
                    if j not in stop_words:
                        word_list.append(j.lower()) #将词变为小写加入词列表
                list_filter_stopwords.append(word_list)
            return list_filter_stopwords
    
    if __name__=='__main__':
        list_word_split, category_labels=word_split('testdata.xls') #获得每条文本的分词列表和标签列表
        print('分词成功')
        list_words_lemmatizer=word_lemmatizer(list_word_split)  #词性还原
        print('词性还原成功')
        list_filter_stopwords=stopwords_filter('stopwords.txt',list_words_lemmatizer) #获得停用词过滤后的列表
        print("停用词过滤成功")
    

      

    (4)特征选择

             对于处理这类文本数据,常用的特征选择方法有: TF-IDF(词频-逆向文档频率),信息增益卡方检验互信息N-Gram

    (5)文本标签向量化

    """
    函数说明:文本向量化,标签向量化   one-hot编码
    Parameters:
         feature_words:特征词集
         doc_words:文本列表
         doc_category_labels:文本类别标签
    Returns:
         docvec_list:文本向量列表
         labelvec_list:标签向量列表
    """
    def words2vec(feature_words,doc_words,doc_category_labels):
        #文本列表转向量列表
        docvec_list=[]
        for words in doc_words:
            docvec = [0] * len(feature_words)
            for j in words:
                if j in feature_words:
                    docvec[feature_words.index(j)]=1
            docvec_list.append(docvec)
        #标签列表转向量列表
        labelvec_list = []
        labelset=list(set(doc_category_labels))
        for label in doc_category_labels:
            doclabel = [0] * len(labelset)
            doclabel[labelset.index(label)]=1
            labelvec_list.append(doclabel)
        return docvec_list,labelvec_list
    

      

    (6)选择算法模型进行训练(机器学习、深度学习)

            

  • 相关阅读:
    理解javascript中的Array类型
    解决EF 4.0 中数据缓存机制
    vim学习之旅01-文本搜索并高亮显示
    Quartz.Net 学习之路02 初探Quartz.Net
    Quartz.Net 学习之路01 安装Quartz.Net
    EasyUI这个框架用了好久了,总结一下遇到的问题和解决方法
    记录剪切板
    如何将Unicode字符转换成简体字
    ass字幕转换成文本文件
    Change WORDS
  • 原文地址:https://www.cnblogs.com/asialee/p/9604597.html
Copyright © 2011-2022 走看看