1. 讀郵件數據集文件,提取郵件本身與標籤。
列表
numpy數組
""" @author Rakers""" import pandas as pd df = pd.read_csv('../data/SMSSpamCollection', '\t', encoding='utf-8') print(df.to_numpy())
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 編寫預處理函數
def preprocessing(text): sms_data.append(preprocessing(line[1])) #對每封郵件做預處理
import nltk import pandas as pd from nltk.corpus import stopwords from nltk.stem import WordNetLemmatizer nltk.download("punkt") nltk.download("stopwords") nltk.download("averaged_perceptron_tagger") nltk.download("wordnet") def preprocessing(text): # 進行分詞 tokens = [word for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)] # 去除停用詞 stops = stopwords.words('english') tokens = [token for token in tokens if token not in stops] # 把在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 # 返回處理完成後的文本 if __name__ == "__main__": df = pd.read_csv('../data/SMSSpamCollection', '\t', encoding='utf-8') data = df.to_numpy() sms_data = [] sms_label = [] for line in data: sms_label.append(line[0]) sms_data.append(preprocessing(line[1])) print("標題:", sms_label) print("內容:") for i in sms_data: print(i)