一、知識點html
""" 安裝模塊:bs4 nltk gensim nltk:處理英文 一、安裝 二、nltk.download() 下載相應的模塊 英文數據處理: 一、去掉html標籤 example = BeautifulSoup(df['review'][1000],'html.parser').get_text() 二、移除標點 example_letter = re.sub(r'[^a-zA-Z]',' ',example) 三、切分紅詞/token words = example_letter.lower().split() 四、去掉停用詞 例如:the a an it's stopwords = {}.fromkeys([line.rstrip() for line in open('./stopwords.txt')]) words_nostop = [w for w in words if w not in stopwords] 五、重組爲新的句子 詞向量解決方案: 一、one-hot編碼 缺點:這種方案浪費存儲空間仍是次要的,更重要的是詞與詞(向量與向量)之間沒有相關性,計算機徹底沒法進行哪怕一丁點的理解和處理 二、基於奇異值分解(SVD)的方法 步驟:a)第一步是經過大量已有文檔統計造成詞空間矩陣X,有兩種辦法。 一種是統計出某篇文檔中各個詞出現的次數,假設詞的數目是W、文檔篇數是M,則此時X的維度是W*M; 第二種方法是針對某個特定詞,統計其先後文中其它詞的出現頻次,從而造成W*W的X矩陣。 b)第二步是針對X矩陣進行SVD分解,獲得特徵值,根據須要截取前k個特徵值及對應的前k個特徵向量, 那麼前k個特徵向量構成的矩陣維度是W*k,這就構成了全部W個詞的k維表示向量 缺點: 一、須要維護一個極大的詞空間稀疏矩陣X,並且隨着新詞的出現還會常常發生變化; 二、SVD運算量大,並且每增減一個詞或文檔以後,都須要從新計算 三、構建一個word2vec模型:經過大量文檔迭代學習其中的參數及已有詞的編碼結果,這樣每新來一篇文檔都不用修改已有模型,只須要再次迭代計算參數和詞向量便可 舉例:我愛python和java a)CBOW算法: 輸入:我愛, 目標值:python和java CBOW算法使用上下文窗口內詞向量做爲輸入,將這些向量求和(或取均值)後,求得與輸出詞空間的相關性分佈, 進而使用softmax函數獲得在整個輸出詞空間上的命中機率,與目標詞one-hot編碼的交叉熵即爲loss值, 經過loss針對輸入和輸出詞向量的梯度,便可使用梯度降低(gradient descent)法獲得一次針對輸入和輸出詞向量的迭代調整。 b)Skip-Gram算法: 輸入:python和java, 目標值:我愛 Skip-Gram算法使用目標詞向量做爲輸入,求得其與輸出詞空間的相關性分佈, 進而使用softmax函數獲得在整個輸出詞空間上的命中機率,與one-hot編碼的上下文詞逐一計算交叉熵, 求和後即爲loss值,經過loss針對輸入和輸出詞向量的梯度, 便可使用梯度降低(gradient descent)法獲得一次針對輸入和輸出詞向量的迭代調整 """
二、中文數據清洗(使用停用詞)java
import os import re import numpy as np import pandas as pd from bs4 import BeautifulSoup from sklearn.feature_extraction.text import CountVectorizer from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import confusion_matrix from sklearn.linear_model import LogisticRegression import nltk from nltk.corpus import stopwords import jieba def clean_chineses_text(text): """ 中文數據清洗 stopwords_chineses.txt存放在博客園文件中 :param text: :return: """ text = BeautifulSoup(text, 'html.parser').get_text() #去掉html標籤 text =jieba.lcut(text); stopwords = {}.fromkeys([line.rstrip() for line in open('./stopwords_chineses.txt')]) #加載停用詞(中文) eng_stopwords = set(stopwords) #去掉重複的詞 words = [w for w in text if w not in eng_stopwords] #去除文本中的停用詞 return ' '.join(words)
三、英文數據清洗(使用停用詞)python
import os import re import numpy as np import pandas as pd from bs4 import BeautifulSoup from sklearn.feature_extraction.text import CountVectorizer from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import confusion_matrix from sklearn.linear_model import LogisticRegression import nltk from nltk.corpus import stopwords import jieba def clean_english_text(text): """ 英文數據清洗 stopwords_english.txt存放在博客園文件中 :param text: :return: """ text = BeautifulSoup(text, 'html.parser').get_text() #去掉html標籤 text = re.sub(r'[^a-zA-Z]', ' ', text) #只保留英文字母 words = text.lower().split() #所有小寫 stopwords = {}.fromkeys([line.rstrip() for line in open('./stopwords_english.txt')]) #加載停用詞(中文) eng_stopwords = set(stopwords) #去掉重複的詞 words = [w for w in words if w not in eng_stopwords] #去除文本中的停用詞 print(words) return ' '.join(words) if __name__ == '__main__': text = "ni hao ma ,hello ! my name is haha'. ,<br/> " a = clean_english_text(text) print(a) test1 = "你在幹嗎啊,怎麼不回覆我消息!,對了「你媽在找你」。" b = clean_chineses_text(test1) print(b)
四、nltk的停用詞進行數據清洗算法
def clean_english_text_from_nltk(text): """ 使用nltk的停用詞對英文數據進行清洗 :param text: :return: """ text = BeautifulSoup(text,'html.parser').get_text() #去掉html標籤 text = re.sub(r'[^a-zA-Z]',' ',text) #除去標點符號 words = text.lower().split() #轉爲小寫並切分 stopwords = nltk.corpus.stopwords.words('english') #使用nltk的停用詞 wordList =[word for word in words if word not in stopwords] return ' '.join(wordList)