sklearn.feature_extraction.text.CountVectorizer 學習


CountVectorizer: 

  CountVectorizer可以將文本文檔集合轉換為token計數矩陣。(token可以理解成詞)
  此實現通過使用scipy.sparse.csr_matrix產生了計數的稀疏表示。
  如果不提供一個先驗字典,並且不使用進行某種特征選擇的分析器,那么特征的數量將與通過分析數據得到的詞匯表的大小一致。
  參數:
  input:

    默認content 可選 filename、file、content
    如果是filename,傳給fit的參數必須是文件名列表
    如果是file,傳給fit的參數必須是文件對象,有read方法
    如果是content,這是字符串序列或者是字節序列
  encoding:

    默認是utf-8。如果需要分析的文本是bytes 字節碼 或者是 文件(文件列表),就使用這個encoding參數來對文件或者bytes進行解碼。
  decode_error:
    默認是strict。當用來分析的字節序列中包含encoding指定的編碼集中沒有的字符時的指令。strict的意思是直接報錯UnicodeDecodeError。ignore是忽視。replace是替換。
  strip_accents:
    默認是None。在文本預處理的過程去除掉重音(音調). ascii方法較快,僅作用於ASCII碼。unicode碼稍慢,適合任意字符。None就是不做這個操作。
  analyzer:
    默認是word。一般使用默認,可設置為string類型,如'word', 'char', 'char_wb',還可設置為callable類型,比如函數是一個callable類型
  preprocessor: 默認是None,可傳入callable
    重寫預處理(字符串轉換)階段,同時保留標記化和N-gram生成步驟
  tokenizer:
    在保留預處理和N-gram生成步驟的同時重寫字符串標記化步驟。僅適用於anlayzer = "word".
  ngram_range:tuple (min_n, max_n) 默認 (1, 1)
    N值的范圍的下界和上界用於提取不同的N-gram。n的所有值都將使用Min n=n<=Max n。
  stop_words : string {‘english’}, list, or None (default)
    english表示使用內置的英語單詞停用表
    如果是list列表,該列表中的詞會作為停止詞。僅適用於analyzer=word。
    如果是None,就不會使用停止詞。max_df參數可以被設置在(0.7, 1.0)的范圍內,用來基於語料庫內文檔中術語的頻率來自動檢測和過濾停止詞。
  lowercase: 默認是True,將文本轉換為小寫。
  token_pattern: 默認r"(?u)\b\w\w+\b"
    使用正則表達式表示什么樣的形式才是一個token,只有當analyzer=word是才有用。默認的正則表達式是至少2個或者更多的字母。標點符號被完全忽略或者只是作為分隔符。

  max_df: 默認是1 [0, 1]之間的小數或者是整數。
    當構建詞匯表時,忽略那些文檔頻率嚴格高於給定閾值的術語(特定於語料庫的停止詞)。如果是浮點數,參數表示一個文件的比例。如果是整數,表示術語的絕對計數。如果vocabulary不是None,則忽略此參數。
  min_df: 與max_df類似。 默認是1.
  max_features: 默認是None, None或者是整數。
    如果不是None,表示建立一個只考慮最前面的max_features個術語來表示語料庫。如果vocabulary參數不是None的話,忽略這個參數。
  vocabulary: 默認是None。Mapping或者Iterable
    無論是Mapping還是字典,items是key, 索引是value,都是特征矩陣中的索引,或者是可迭代的terms。如果沒有給出,則從輸入文檔中確定詞匯表。映射中的索引不應該重復,並且不應該在0和最大索引之間有任何間隙。
  binary:
    如果為真,則所有非零計數設置為1。這對於模擬二進制事件而不是整數計數的離散概率模型是有用的。
  dtype :
    fit_transform或者transform返回的matrix的類型。

  屬性:
    vocabulary_: 詞和詞在向量化后的計數矩陣中列索引的映射關系。
    stop_words_: 停止詞集合。

  方法:
    build_analyzer:
      返回一個進行預處理和分詞的分析器函數對象。
    build_preprocessor:
      返回一個在分詞之前進行預處理的可調用方法。
    build_tokenizer:
      返回一個將字符串分為詞語序列的方法
    decode:
      將輸入轉換為unicode字符表示
      解碼的策略參照vectorizer的參數。
    fit(raw_documents, y=None):
      學習出一個詞匯字典。這個詞匯字典的格式是{word, word在向量矩陣中的列的索引}
      raw_documents是string,unicode,file對象構成的可迭代對象。
    fit_transform:
      學習詞匯字典並轉換為矩陣。等同於先調用fit,再調用transform,不過更有效率。
      返回向量矩陣。[n_samples, n_features]。行表示文檔,列表示特征。
    get_feature_names:
      特征名稱列表
    get_params:
      獲得向量器的參數。
    get_stop_words:
      獲取stopword列表
    inverse_transform(X):
      返回每個文檔中數量不是0的詞語
      返回結果是array組成的列表
    set_params:
      設置估計器參數
    transform(raw_documents):
      將文檔轉換成詞匯計數矩陣。使用fit擬合的詞匯表或者提供給構造函數的詞匯表來提取傳入文檔的詞語計數。

  CountVectorizer處理文本的步驟應該是先使用 preprocessor參數提供預處理器,對文本進行預處理。在使用tokenizer對文本進行拆分。再使用fit擬合得到詞匯表,再使用transform轉換為計數矩陣。

def count_vectorizer_example():
    from sklearn.feature_extraction.text import CountVectorizer
    vectorizer = CountVectorizer()
    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)
    feature_names = vectorizer.get_feature_names()
    # 會產生一個矩陣,行表示文章,列表是詞匯,列的數字表示詞匯的數量
    array = X.toarray()
    # 得到document詞所在的列的索引
    document_count = vectorizer.vocabulary_.get("document")
    # 在訓練語料庫中未出現的詞,會被完全忽略
    test = vectorizer.transform(["Something completely new."]).toarray()
    # 除了提取1-grams詞 而且提取2-grams詞。這樣是為了防止詞組順序顛倒。
    bigram_vectorizer = CountVectorizer(ngram_range=(1, 2),
                                        stop_words=['AAAAAA'],
                                        token_pattern=r"\b\w+\b", min_df=1)
    analyze = bigram_vectorizer.build_analyzer()
    print(analyze("Bi-grams are cool!"))
    # 構建的向量矩陣會變得更大
    X_2 = bigram_vectorizer.fit_transform(corpus).toarray()
    # is this這樣的疑問形式也會出現在向量中
    feature_index = bigram_vectorizer.vocabulary_.get("is this")
    print(X_2[:, feature_index])

    # ################測試各個函數的功能
    # build_analyzer: 返回一個進行預處理和分詞的調用對象
    analyzer = bigram_vectorizer.build_analyzer()
    print(analyzer("This is a test."))

    # build_preprocessor: 返回一個進行預處理的調用對象。
    preprocessor = bigram_vectorizer.build_preprocessor()
    # 這個預處理對象好像只進行了小寫轉換
    print(preprocessor("This is a test."))

    # build_tokenizer: 返回一個只對字符串進行分詞的可調用方法
    tokenizer = bigram_vectorizer.build_tokenizer()
    print(tokenizer("This is a test."))

    # decode(doc): 將輸入轉換為unicode字符表示。解碼策略使用vectorizer的參數
    print(bigram_vectorizer.decode("This is a test.這是一個測試。"))

    # fit(raw_documents, y=None): 從傳入的raw_documents的所有詞匯中學習出一個詞匯字典
    # 這個詞匯字典是 {word: word在向量矩陣中的列索引,...}
    # raw_documents: 字符串、unicode或者file對象構成的可迭代對象
    # y好像並沒有在函數中使用
    raw_documents = ["This is a test", "Is this a test?"]
    print(bigram_vectorizer.fit(raw_documents).vocabulary_)

    # fit_transform(raw_documents, y=None)
    # 學習出一個詞匯字典,並且返回一個行為文本,列為詞匯的矩陣。
    # 這個函數等價於先調用fit函數,再調用transform函數。但是是更高效的實現。
    print(bigram_vectorizer.fit_transform(corpus).toarray())

    # get_feature_names:返回一個特征名列表,特征的順序是特征在矩陣中的順序。
    print(bigram_vectorizer.get_feature_names())

    # get_params: 返回估計器的參數
    print(bigram_vectorizer.get_params())

    # get_stop_words: 返回停止詞表
    print(bigram_vectorizer.get_stop_words())

    # inverse_transform(X): 返回每個文檔中數量不是0的詞語
    # 返回的是array組成的list。len = n_samples
    print(bigram_vectorizer.inverse_transform(bigram_vectorizer.fit_transform(corpus).toarray()))

    # set_params 設置估計器的參數
    print(bigram_vectorizer.set_params(stop_words=["2"]).get_stop_words())

    # transform(raw_documents): 將文檔轉換成術語矩陣。
    # 使用fit擬合的詞匯表或提供給構造函數的詞匯表提取原始文本文檔中的詞語計數。
    print(bigram_vectorizer.transform(corpus).toarray())


if __name__ == "__main__":
    count_vectorizer_example()

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM