''' 天然語言處理(NLP) 詞袋模型:一句話的語義很大程度取決於某個單詞出現的次數,因此能夠把句子中全部可能出現的單詞做爲特徵名, 每個句子爲一個樣本,單詞在句子中出現的次數爲特徵值構建數學模型,稱爲詞袋模型。 例如: 1 The brown dog is running 2 The black dog is in the black room 3 Running in the room is forbidden the brown dog is running black in room forbidden 1 1 1 1 1 0 0 0 0 2 0 1 1 0 2 1 1 0 1 0 0 1 1 0 1 1 1 詞袋模型化相關API: import sklearn.feature_extraction.text as ft # 構建詞袋模型對象 cv = ft.CountVectorizer() # 訓練模型,把句子中全部可能出現的單詞做爲特徵名,每個句子爲一個樣本,單詞在句子中出現的次數爲特徵值。 bow = cv.fit_transform(sentences).toarray() print(bow) # 獲取全部特徵名 words = cv.get_feature_names() 詞頻(TF):單詞在句子中出現的次數除以句子的總詞數稱爲詞頻。即一個單詞在一個句子中出現的頻率。 詞頻相比單詞的出現次數能夠更加客觀的評估單詞對一句話的語義的貢獻度。詞頻越高, 對語義的貢獻度越大。對詞袋矩陣歸一化便可獲得詞頻。 文檔頻率(DF):含有某個單詞的文檔樣本數/總文檔樣本數。文檔頻率越高,對語義的貢獻度越低。 逆文檔頻率(IDF):總樣本數/含有某個單詞的樣本數。逆文檔頻率越高,對語義的貢獻度越高。 詞頻-逆文檔頻率(TF-IDF):詞頻矩陣中的每個元素乘以相應單詞的逆文檔頻率,其值越大說明該詞對樣本語義的貢獻越大, 根據每一個詞的貢獻力度,構建學習模型。 獲取詞頻逆文檔頻率(TF-IDF)矩陣相關API: # 獲取詞袋模型 cv = ft.CountVectorizer() bow = cv.fit_transform(sentences).toarray() # 獲取TF-IDF模型訓練器 tt = ft.TfidfTransformer() tfidf = tt.fit_transform(bow).toarray() ''' import nltk.tokenize as tk import sklearn.feature_extraction.text as ft import numpy as np doc = "The brown dog is running." \ "The black dog is in the black room." \ "Running in the room is forbidden." sents = tk.sent_tokenize(doc) print(sents) # 構建詞袋模型 cv = ft.CountVectorizer() bow = cv.fit_transform(sents) # 稀疏矩陣 bow = bow.toarray() # 正常矩陣 print(bow) # 打印特徵名稱 print(cv.get_feature_names()) # 獲取TFIDF矩陣 tt = ft.TfidfTransformer() tfidf = tt.fit_transform(bow) print(np.round(tfidf.toarray(), 2))
''' 文本分類(主體識別):使用給定的文本數據集進行主題識別訓練,自定義測試集測試模型準確性。 ''' import sklearn.datasets as sd import sklearn.feature_extraction.text as ft import sklearn.naive_bayes as nb import numpy as np train = sd.load_files('./ml_data/20news', encoding='latin1', shuffle=True, random_state=7) # 獲取訓練樣本 train_data = train.data # 獲取樣本輸出 train_y = train.target # 獲取類別標籤名 categories = train.target_names print(np.array(train_data).shape) print(np.array(train_y).shape) print(categories) # 構建TFIDF矩陣 cv = ft.CountVectorizer() bow = cv.fit_transform(train_data).toarray() tt = ft.TfidfTransformer() tfidf = tt.fit_transform(bow) # 模型訓練,使用MultinomialNB是由於tfidf矩陣中樣本的分佈更匹配多項式分佈 model = nb.MultinomialNB() model.fit(tfidf, train_y) # 測試 test_data = [ 'The curveballs of right handed pithers tend to curve to the left.', 'Caesar cipher is an ancient form of encryption.', 'This two-wheeler is really good on slipper' ] test_bow = cv.transform(test_data) test_tfidf = tt.transform(test_bow) pred_test_y = model.predict(test_tfidf) for sent, index in zip(test_data, pred_test_y): print(sent, '---->', categories[index])