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('\n')) #將停用詞讀取到列表里
        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)選擇算法模型進行訓練(機器學習、深度學習)

        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM