1. 讀郵件數據集文件,提取郵件本身與標籤。
列表
numpy數組
import csv file_path = r"SMSSpamCollection" sms = open(file_path, 'r', encoding='utf-8') data = csv.reader(sms, delimiter="\t") for r in data: print(r) sms.close()
2.郵件預處理
- 郵件分句
- 名子分詞
- 去掉過短的單詞
- 詞性還原
- 連接成字符串
- 傳統方法來實現
- nltk庫的安裝與使用
pip install nltk import nltk
nltk.download() # sever地址改成 http://www.nltk.org/nltk_data/
或
https://github.com/nltk/nltk_data下載gh-pages分支,裏面的Packages就是我們要的資源。
將Packages文件夾改名爲nltk_data。
或
網盤鏈接:https://pan.baidu.com/s/1iJGCrz4fW3uYpuquB5jbew 提取碼:o5ea
放在用戶目錄。
----------------------------------
安裝完成,通過下述命令可查看nltk版本:
import nltk print nltk.__doc__
2.1 nltk庫 分詞
nltk.sent_tokenize(text) #對文本按照句子進行分割
nltk.word_tokenize(sent) #對句子進行分詞
2.2 punkt 停用詞
from nltk.corpus import stopwords
stops=stopwords.words('english')
*如果提示需要下載punkt
nltk.download(‘punkt’)
或 下載punkt.zip
https://pan.baidu.com/s/1OwLB0O8fBWkdLx8VJ-9uNQ 密碼:mema
複製到對應的失敗的目錄C:\Users\Administrator\AppData\Roaming\nltk_data\tokenizers並解壓。
2.3 NLTK 詞性標註
nltk.pos_tag(tokens)
2.4 Lemmatisation(詞性還原)
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize('leaves') #缺省名詞
lemmatizer.lemmatize('best',pos='a')
lemmatizer.lemmatize('made',pos='v')
一般先要分詞、詞性標註,再按詞性做詞性還原。
2.5 編寫預處理函數
1. def preprocessing(text):
2. sms_data.append(preprocessing(line[1])) #對每封郵件做預處理
3. 訓練集與測試集
4. 詞向量
5. 模型
# 導入庫 import nltk from nltk.corpus import stopwords from nltk.stem import WordNetLemmatizer import csv def preprocessing(text): tokens = [] # 對錄入的文本按照句子進行分割; for sent in nltk.sent_tokenize(text): # 對句子進行分詞; for word in nltk.word_tokenize(sent): tokens.append(word) # 去除停用詞 stops = stopwords.words("english") tokens = [token for token in tokens if token not in stops] # 詞性標註 nltk.pos_tag(tokens) # 詞性還原 lemmatizer = WordNetLemmatizer() # 定義還原對象 tokens = [lemmatizer.lemmatize(token, pos='n') for token in tokens] # 名詞 tokens = [lemmatizer.lemmatize(token, pos='v') for token in tokens] # 動詞 tokens = [lemmatizer.lemmatize(token, pos='a') for token in tokens] # 形容詞 return tokens # 加載數據 sms = open("SMSSpamCollection", 'r', encoding='utf-8') sms_data = [] sms_label = [] csv_reader = csv.reader(sms, delimiter='\t') # 預處理 for line in csv_reader: sms_label.append(line[0]) sms_data.append(preprocessing(line[1])) sms.close() print("郵件標題:", sms_label) print("郵件處理後內容:") for line in sms_data: print(line)