簡體   English   中英

文本預處理以進行分類-機器學習

[英]Text Preprocessing for classification - Machine Learning

預處理我們的Twitter文本以在二進制類之間進行分類的重要步驟是什么? 我所做的是刪除了標簽並保留了沒有標簽的功能,我還使用了一些正則表達式來刪除特殊字符,這是我使用的兩個函數。

def removeusername(tweet):
    return " ".join(word.strip() for word in re.split('@|_', tweet))
def removingSpecialchar(text):
    return ' '.join(re.sub("(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)"," ",text).split())

還有什么其他東西可以預處理文本數據。 我還使用了nltk停用詞語料庫來從標記化詞中刪除所有停用詞。

我在textblob中使用了NaiveBayes classifer來訓練數據,我在訓練數據上的准確性達到94%,在測試數據上達到82%。 我想知道是否還有其他方法可以取得良好的准確性。 順便說一下,我是這個機器學習領域的新手,我對這一切都只有有限的想法!

好了,您可以從詞匯量的大小入手。 您可能會排除一些數據中過於頻繁的詞(不被視為停用詞)。 對於僅出現在一條推文中的字詞(例如,拼寫錯誤的字詞),也是如此。 Sklearn CountVectorizer允許以簡單的方式查看min_dfmax_df參數。

由於您正在使用推文,因此您也可以考慮URL字符串。 嘗試從鏈接中獲取一些有價值的信息,有很多不同的選擇,從基於正則表達式的簡單內容(用於檢索頁面的域名)到更復雜的基於NLP的方法(用於研究鏈接內容)。 再一次取決於您!

我還會看看代詞(如果使用的是sklearn),因為默認情況下會將其全部替換為關鍵字-PRON-。 這是一種經典的解決方案,可以簡化事情,但最終可能會導致信息丟失。

對於預處理原始數據,您可以嘗試:

  • 停止單詞刪除。
  • 摘除或拔除。
  • 排除太常見或太少的術語。

然后可以進行第二步預處理:

  • 構造一個TFIDF矩陣。
  • 構造或加載預訓練的wordEmbedding(Word2Vec,Fasttext等)。

然后,您可以將第二步的結果加載到模型中。

這些只是最常見的“方法”,還存在許多其他方法。

我將讓您自己檢查每種方法,但這是一個很好的基礎。

沒有強制性步驟。 例如,刪除停用詞(也稱為功能詞)是很常見的,例如“ yes”,“ no”,“ with”。 但是-在我的一條管道中,我跳過了這一步,准確性沒有改變。 NLP是一個實驗領域,因此最重要的建議是建立一條盡快運行的管道,定義您的目標並使用不同的參數進行訓練。

在繼續之前,您需要確保訓練集正確。 你要訓練什么? 您的設備干凈嗎(例如,陽性只有陽性)? 您如何定義准確性?為什么?

現在,您描述的情況似乎是過度擬合的情況。 為什么? 因為您在訓練集上獲得94%的准確性,但在測試集上僅獲得82%的准確性。

當您具有許多功能但訓練數據集相對較小時,就會發生此問題-因此該模型最適合特定的訓練集,但無法推廣。

現在,您沒有指定數據集的大小,所以我猜測是在50到500條推文之間,考慮到英語詞匯量約為200k或更多,這太小了。 我會嘗試以下選項之一:(1)獲取更多訓練數據(至少2000個)(2)減少功能數量,例如,您可以刪除不常見的單詞,名稱-出現次數很少的任何單詞( 3)使用更好的分類器(對於NLP,貝葉斯相當弱)。 嘗試使用SVM或深度學習。 (4)嘗試正則化技術

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM