Python文字資料分析與處理

megachen發表於2018-08-29

Python文字資料分析與處理(新聞摘要)

分詞
  • 使用jieba分詞, 注意lcut只接受字串
過濾停用詞
TF-IDF得到摘要資訊或者使用LDA主題模型
  • TF-IDF有兩種
    • jieba.analyse.extract_tags(content, topK=20, withWeight=False) # content為string, topK選出20個關鍵字, withWeight: 每一個關鍵詞同等重要
    • 使用gensim庫
      • from gensim import corpora, models
      • dictinary = corpora.Dictionary(word_list) # 為每一個單詞分配一個id, 並記錄每一個單詞的詞頻到dfs屬性中
      • corpus = [dictionary.doc2bow(line) for line in word_list] # 得到詞庫, 形式是(token, id)
      • corpus.token2id以[token:id, …]返回
      • # 將資料處理完之後, 才能使用models進行計算
      • lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20) # corpus指定語料庫, id2word指定字典, id在corpus中, num_toptics指定訓練的主題數
      • lda.print_topic(1, 10) # 1為topic的id, 10為topic中關鍵字的個數
      • lda.print_topic(3, 10) # 3為返回的topic個數, 10為每一個topic中關鍵字的個數
      • 返回的形式是0.009*”文化” + 0.005*”戀情” + 0.004*”中” + 0.004*”撒” + 0.004*”節目”的列表, 數字為權重

機器學習貝葉斯(文字處理, 判斷一句評論是否是侮辱性的[學會了這個, 那麼垃圾郵箱, 廣告的過濾也一樣了, 文字處理貝葉斯的world])

與其他的泰坦尼克號遇難預測等案例不同, 文字處理需要自己在預處理時構建出資料表. 沒有後者每一個提供表

不使用第三方庫實現的思路

  • 獲取文字資料
    • 格式: data0 = [[`Hello`, `buddy`], [`You`, `silly`]], labels = [1, 1]等
    • 二維list, 一個list表示合併在一起可以表示一句話
  • 過濾停用詞得到去掉停用詞的集合data

  • 對data進行去重(現在使用的演算法不需要單詞出現的數量, 如果換作其他演算法則不一定), 獲取data中所有的單詞words, words的形式為list
    • 實現思路:
      • data = set(data): 轉換為set達到去重的效果
      • data = list(data): 將data轉為list, 因為需要單詞的順序
  • data0的每一個list元素的單詞轉為0和1, 返回一組向量, 0表示沒有該單詞, 1表示有該單詞
  • def NBTrain函式使用貝葉斯進行訓練
    • 根據labels先判斷出bad言論數, 得出其概率
    • 縮小範圍, 鎖定到bad言論中, 計算出每一條bad言論的單詞總數與所有bad言論的總數的比值
    • 鎖定到not bad言論中, 計算出每一條not bad言論的單詞總數與所有not bad言論的總數的比值
    • 返回三個向量
  • 根據根據貝葉斯公式, 根據輸入的測試集向量, 通過貝葉斯公式與NBTrain出來的引數(該引數與貝葉斯公式非常相關)得出p0與p1, 比較大小進行分類藉口

使用sklearn的native_bayes模組實現

  • 獲得資料
  • 過濾掉停用詞
  • 將每一個樣本對應的單詞以` `.jion合併, 因為之後將單詞轉為向量的物件需要這樣的引數
  • 匯入sklearn.features_extraction.text.CountVectorizier或者sklearn.features_extraction.text.TfidfVectorizier, 是兩種將字串中的單詞轉為向量的演算法, 後者效果更好, 所以以他為例
    • tfidf = TfidVectorizier() # 有一個ngram_range可選引數, (1, 4)表示得到的feature為1個, 2個依次增加到3個, 3就是最終每一個句子的向量的長度
    • tfidf_fit = tfidf.fit_transform(texts) # texts的形式[`I am myself`, `Do not say it`, …]
    • tfidf_fit.get_feature_names()返回單詞list
    • tfidf_fit.toarray()返回轉換後的向量
  • 現在得到了我們需要用於建模的資料表了(前面就是特徵提取的操作, 是機器學習中最難的部分, 目的就是為了得到可以用於建模的資料表)
  • 將資料分成訓練集和測試集
  • 匯入native_bayes模組中的MultinomialNB類物件
    • clf = MultinomialNB()
    • clf.fit(X_train.values.tolist(), y_train.values.tolist()) # bayes坑的地方, 傳入的必須是list, 內部不提供轉換
  • 評估
    • clf.score(X_test.values.tolist(), y_test.values.tolist())


相關文章