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)選擇算法模型進行訓練(機器學習、深度學習)
