NLP之詞袋模型和TF-IDF模型
導語:
NLP是AI安全領域的一個重要支撐技術。本文講介紹NLP中的詞袋和TF-IDF模型。
詞袋模型
文本特徵提取有兩個非常重要的模型:
詞集模型:單詞構成的集合,集合自然每個元素都只有一個,也即詞集中的每個單詞都只有一個。
詞袋模型:在詞集的基礎上如果一個單詞在文檔中出現不止一次,統計其出現的次數(頻數)。
兩者本質上的區別,詞袋是在詞集的基礎上增加了頻率的維度,詞集只關注有和沒有,詞袋還要關注有幾個。
假設我們要對一篇文章進行特徵化,最常見的方式就是詞袋。
導入相關的函數庫:
>>> from sklearn.feature_extraction.text import CountVectorizer
實例化分詞對象:
>>> vectorizer = CountVectorizer(min_df=1)
>>> vectorizer
CountVectorizer(analyzer=..."word", binary=False, decode_error=..."strict",
dtype=, encoding=..."utf-8", input=..."content",
lowercase=True, max_df=1.0, max_features=None, min_df=1,
ngram_range=(1, 1), preprocessor=None, stop_words=None,
strip_accents=None, token_pattern=..."(?u)\b\w\w+\b",
tokenizer=None, vocabulary=None)
將文本進行詞袋處理:
>>> corpus = [
... "This is the first document.",
... "This is the second second document.",
... "And the third one.",
... "Is this the first document?",
... ]
>>> X = vectorizer.fit_transform(corpus)
>>> X
"
with 19 stored elements in Compressed Sparse ... format>
獲取對應的特徵名稱:
>>> vectorizer.get_feature_names() == (
... ["and", "document", "first", "is", "one",
... "second", "the", "third", "this"])
True
獲取詞袋數據,至此我們已經完成了詞袋化:
>>> X.toarray()
array([[0, 1, 1, 1, 0, 0, 1, 0, 1],
[0, 1, 0, 1, 0, 2, 1, 0, 1],
[1, 0, 0, 0, 1, 0, 1, 1, 0],
[0, 1, 1, 1, 0, 0, 1, 0, 1]]...)
但是如何可以使用現有的詞袋的特徵,對其他文本進行特徵提取呢?我們定義詞袋的特徵空間叫做辭彙表vocabulary:
vocabulary=vectorizer.vocabulary_
針對其他文本進行詞袋處理時,可以直接使用現有的辭彙表:
>>> new_vectorizer = CountVectorizer(min_df=1, vocabulary=vocabulary)
CountVectorize函數比較重要的幾個參數為:
decode_error,處理解碼失敗的方式,分為『strict』、『ignore』、『replace』三種方式。
strip_accents,在預處理步驟中移除重音的方式。
max_features,詞袋特徵個數的最大值。
stop_words,判斷word結束的方式。
max_df,df最大值。
min_df,df最小值。
binary,默認為False,當與TF-IDF結合使用時需要設置為True。
本例中處理的數據集均為英文,所以針對解碼失敗直接忽略,使用ignore方式,stop_words的方式使用english,strip_accents方式為ascii方式。
TF-IDF模型
文本處理領域還有一種特徵提取方法,叫做TF-IDF模型(term frequency–inverse document frequency,詞頻與逆向文件頻率)。TF-IDF是一種統計方法,用以評估某一字詞對於一個文件集或一個語料庫的重要程度。字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。TF-IDF加權的各種形式常被搜索引擎應用,作為文件與用戶查詢之間相關程度的度量或評級。
TF-IDF的主要思想是,如果某個詞或短語在一篇文章中出現的頻率TF(Term Frequency,詞頻),詞頻高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。TF-IDF實際上是:TF * IDF。TF表示詞條在文檔d中出現的頻率。IDF(inverse document frequency,逆向文件頻率)的主要思想是:如果包含詞條t的文檔越少,也就是n越小,IDF越大,則說明詞條t具有很好的類別區分能力。如果某一類文檔C中包含詞條t的文檔數為m,而其他類包含t的文檔總數為k,顯然所有包含t的文檔數n=m+k,當m大的時候,n也大,按照IDF公式得到的IDF的值會小,就說明該詞條t類別區分能力不強。但是實際上,如果一個詞條在一個類的文檔中頻繁出現,則說明該詞條能夠很好代表這個類的文本的特徵,這樣的詞條應該給它們賦予較高的權重,並選來作為該類文本的特徵詞以區別與其他類文檔。
在Scikit-Learn中實現了TF-IDF演算法,實例化TfidfTransformer即可:
>>> from sklearn.feature_extraction.text import TfidfTransformer
>>> transformer = TfidfTransformer(smooth_idf=False)
>>> transformer
TfidfTransformer(norm=..."l2", smooth_idf=False, sublinear_tf=False, use_idf=True)
TF-IDF模型通常和詞袋模型配合使用,對詞袋模型生成的數組進一步處理:
>>> counts = [[3, 0, 1],
... [2, 0, 0],
... [3, 0, 0],
... [4, 0, 0],
... [3, 2, 0],
... [3, 0, 2]]
...
>>> tfidf = transformer.fit_transform(counts)
>>> tfidf
" with 9 stored elements in Compressed Sparse ... format>
>>> tfidf.toarray()
array([[ 0.81940995, 0. , 0.57320793],
[ 1. , 0. , 0. ],
[ 1. , 0. , 0. ],
[ 1. , 0. , 0. ],
[ 0.47330339, 0.88089948, 0. ],
[ 0.58149261, 0. , 0.81355169]])
辭彙表模型
詞袋模型可以很好的表現文本由哪些單片語成,但是卻無法表達出單詞之間的前後關係,於是人們借鑒了詞袋模型的思想,使用生成的辭彙表對原有句子按照單詞逐個進行編碼。TensorFlow默認支持了這種模型:
max_document_length,
min_frequency=0,
vocabulary=None,
tokenizer_fn=None)
其中各個參數的含義為:
max_document_length:,文檔的最大長度。如果文本的長度大於最大長度,那麼它會被剪切,反之則用填充。
min_frequency,詞頻的最小值,出現次數小於最小詞頻則不會被收錄到詞表中。
vocabulary,CategoricalVocabulary對象。
tokenizer_fn,分詞函數。
假設有如下句子需要處理:
x_text =[
"i love you",
"me too"
]
基於以上句子生成辭彙表,並對"i me too"這句話進行編碼:
vocab_processor = learn.preprocessing.VocabularyProcessor(max_document_length)
vocab_processor.fit(x_text)
print next(vocab_processor.transform(["i me too"])).tolist()
x = np.array(list(vocab_processor.fit_transform(x_text)))
print x
運行程序,x_text使用辭彙表編碼後的數據為:
[[1 2 3 0]
[4 5 0 0]]
"i me too"這句話編碼的結果為:
[1, 4, 5, 0]
整個過程如下圖所示。
機器學習入門
主要以機器學習常見演算法為主線,利用生活中的例子和具體安全場景來介紹機器學習常見演算法,是機器學習入門書籍,便於讀者可以快速上手。
深度學習實戰
本書將重點介紹深度學習,並以具體的11個案例介紹機器學習的應用,定位是面向具有一定機器學習基礎或者致力於使用機器學習解決工作中問題的讀者。
強化學習與GAN
重點介紹強化學習和生成對抗網路的基礎知識和實際應用,從AI攻防的基礎知識,到智能工具的打造,全面介紹如何使用AI做建設的方法。
TAG:兜哥帶你學安全 |