Task3

特征選擇

  1. TF-IDF原理以及利用其進行特征篩選
  2. 互信息的原理以及利用其進行特征篩選

TF-IDF

  1. 原理:

如何提取一篇文章的的關鍵詞?

文章關鍵詞:指能體現(xiàn)一篇文章或一部著作的中心概念的詞語描沟。指檢索資料時所查內(nèi)容中必須有的詞語殴泰。
那么查找文章關鍵詞需要崔兴,在文章中出現(xiàn)次數(shù)多理卑,且是非停用詞的詞座韵,且在文章中重要程度高的詞煌张。

如何衡量某個詞的重要程度則為TF-IDF的重點部分垮卓,因為在文章中出現(xiàn)次數(shù)多的詞語,有可能是常見詞語比如:“中國”令花、“學習”等與文章中心概念不相關的詞匯阻桅,為了篩選這樣的詞匯,則需要一個重要性調(diào)節(jié)系數(shù)兼都,來衡量這個詞是不是常見詞嫂沉。那么如果某個詞比較少見,但是它在這篇文章中多次出現(xiàn)扮碧,那么它很可能就反映了這篇文章的特性趟章,正是我們所需要的關鍵詞。

  1. 詞頻(TF)

查找關鍵字前慎王,統(tǒng)計詞在文章中出現(xiàn)的次數(shù)

詞頻(TF) = 某個詞在文章中的出現(xiàn)次數(shù)

  • 為了便于不同文章的比較蚓土,進行“詞頻”標準化
    詞頻(TF) = \frac{某個詞在文章中的出現(xiàn)次數(shù)}{文章的總次數(shù)}
    或者
    詞頻(TF) = \frac{某個詞在文章中的出現(xiàn)次數(shù)}{該文中出現(xiàn)次數(shù)最多的詞的出現(xiàn)次數(shù)}
  1. 逆文檔頻率(IDF)

在詞頻的基礎上,要對每個詞分配一個"重要性"權(quán)重赖淤。最常見的詞("的"蜀漆、"是"、"在")給予最小的權(quán)重咱旱,較常見的詞("中國")給予較小的權(quán)重确丢,較少見的詞給予較大的權(quán)重。
此時需要一個語料庫吐限,用來模擬語言的使用環(huán)境
逆文檔頻率(IDF) = log(\frac{語料庫的文檔總數(shù)}{包含該詞的文檔數(shù)+1})

  1. 計算TF-IDF
    TF - IDF = 詞頻(TF) \times 逆文檔頻率(IDF)
  2. 利用TF-IDF進行特征篩選
    • 使用sklearn提取文本tfidf特征
def tfidf_weight_sklearn(words):
  '''
      使用sklearn提取文本tfidf特征
  '''
  vectorizer = CountVectorizer()      # 將詞語轉(zhuǎn)換成詞頻矩陣
  transformer = TfidfTransformer()    # 將統(tǒng)計每個詞語的tf-idf權(quán)值
  tfidf = transformer.fit_transform(vectorizer.fit_transform(words))
  word = vectorizer.get_feature_names()   # 獲取詞袋模型中的所有詞語
  weight = tfidf.toarray()
  weight = pd.DataFrame(weight,columns = word)
  return weight
  • 使用gensim提取文本tfidf特征
def tf_idf_weight_gensim(words):
    '''
        使用gensim提取文本的tfidf特征
    '''
    word_list = [ sentence.split(' ') for sentence in words]
    # 賦給語料庫中每個詞(不重復的詞)一個整數(shù)id
    dictionary = corpora.Dictionary(word_list)
    # 通過下面的方法可以看到語料庫中每個詞對應的id
    print(dictionary.token2id)
    new_corpus = [dictionary.doc2bow(text) for text in word_list]
    
    # 載入模型
    tfidf = models.TfidfModel(new_corpus)
    tfidf.save("my_model.tfidf")
    
    # 使用模型計算tfidf值
    tfidf = models.TfidfModel.load("my_model.tfidf")
    tfidf_vec = []
    for text in words:
        string_bow = dictionary.doc2bow(text.lower().split())
        tfidf_vec.append(tfidf[string_bow])
    
    return tfidf_vec

其中訓練數(shù)據(jù)為以下數(shù)據(jù):

corpus = [
    'this is the first document',
    'this is the second second document',
    'and the third one',
    'is this the first document'
]

gensim賦給訓練數(shù)據(jù)的每個詞的id如下:

詞-id對應字典

第一句話詞id對應TF-IDF值list

第一句話為'this is the first document'鲜侥,但是由最終的結(jié)果可以看出最終結(jié)果去除了停用詞the,可知gensim有自動去除停用詞的功能诸典;

  • 利用python自己實現(xiàn)TF-IDF
    其中不依賴庫的情況下描函,計算出的TF-IDF值準確性較低,僅僅作為練習
def get_tf(word_list, words_count):
    '''
        根據(jù)分詞列表以及詞頻列表計算詞頻
    '''
    words_tf = []
    for i in range(len(word_list)):
        word_tf_dict = dict()
        for word in word_list[i]: 
            print(words_count[i][word])
            word_tf_dict[word] = words_count[i][word] / sum(words_count[i].values())
        words_tf.append(word_tf_dict)
    return words_tf


def get_contain(word, word_list):
    count = 0
    for text in word_list:
        if word in text:
            count += 1
    return count


def get_idf(word_list):
    # 統(tǒng)計包含該詞的文檔數(shù)
    all_text = []
    for text in word_list:
        all_text += text
    all_word = list(set(all_text))
    word_idf = dict()
    for word in all_word:
        word_count = get_contain(word, word_list)
        word_idf[word] = math.log(len(word_list) / (1 + word_count))
    
    return word_idf
            

def get_tfidf(words):
    '''
        手動實現(xiàn)TF-IDF
    '''    
    # 分詞
    word_list = [sentence.split(' ') for sentence in words]
    # 統(tǒng)計詞頻
    sentence_list = []
    for sentence in word_list:
        sentence_list.append(Counter(sentence))
    # 計算tf值
    words_tf = get_tf(word_list, sentence_list)
    # 計算idf值
    words_idf = get_idf(word_list)
    # 計算TF-IDF
    tf_idf_weight = []
    for i in range(len(word_list)):
        tf_idf_dict = dict()
        for word in word_list[i]:
            tf_idf_dict[word] = words_tf[i][word] * words_idf[word]
        tf_idf_weight.append(tf_idf_dict)
    
    # 轉(zhuǎn)成DataFrame
    tf_idf = pd.DataFrame()
    for word in words_idf.keys():
        value = []
        for text in tf_idf_weight:
            if word in text.keys():
                value.append(text[word])
            else:
                value.append(0.0)
        tf_idf[word] = value
        
    return tf_idf

互信息

  1. 原理
  • 點互信息PMI
    公式如下:
    PMI(x;y) = log\frac{p(x,y)}{p(x)p(y)}=log\frac{p(x|y)}{p(x)}=log\frac{p(y|x)}{p(x)}

如果x,y不相關狐粱,則P(x,y) = P(x)P(y)
如果x,y相關赘阀,則當二者相關性越大P(x,y)相比于P(x)P(y)則越大
y出現(xiàn)的情況下x出現(xiàn)的條件概率p(x|y)除以x本身出現(xiàn)的概率p(x),自然就表示x跟y的相關程度脑奠。

  • 互信息MI

用來衡量兩個數(shù)據(jù)分布的吻合程度
其中值越大意味著結(jié)果與真實情況越吻合

公式如下:
I(X;Y) = \sum_{x\in X}\sum_{y\in Y}p(x, y)log\frac {p(x,y)}{p(x)p(y)}

其衡量的是兩個隨機變量之間的相關性,即一個隨機變量中包含的關于另一個隨機變量的信息量幅慌;
所謂的隨機變量宋欺,即隨機試驗結(jié)果的量的表示,可以簡單理解為按照一個概率分布進行取值的變量,比如隨機抽查的一個人的身高就是一個隨機變量齿诞;
其中互信息其實就是對X和Y的所有可能的取值情況的點互信息PMI的加權(quán)和酸休。

# 互信息
labels_true = [0, 0, 0, 1, 1, 1]
labels_pred = [0, 0, 1, 1, 2, 2]
mr.adjusted_mutual_info_score(labels_true, labels_pred)

完整代碼見github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市祷杈,隨后出現(xiàn)的幾起案子斑司,更是在濱河造成了極大的恐慌,老刑警劉巖但汞,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宿刮,死亡現(xiàn)場離奇詭異,居然都是意外死亡私蕾,警方通過查閱死者的電腦和手機僵缺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踩叭,“玉大人磕潮,你說我怎么就攤上這事∪荼矗” “怎么了自脯?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長斤富。 經(jīng)常有香客問我膏潮,道長,這世上最難降的妖魔是什么茂缚? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任戏罢,我火速辦了婚禮,結(jié)果婚禮上脚囊,老公的妹妹穿的比我還像新娘龟糕。我一直安慰自己,他們只是感情好悔耘,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布讲岁。 她就那樣靜靜地躺著,像睡著了一般衬以。 火紅的嫁衣襯著肌膚如雪缓艳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天看峻,我揣著相機與錄音阶淘,去河邊找鬼。 笑死互妓,一個胖子當著我的面吹牛溪窒,可吹牛的內(nèi)容都是我干的坤塞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼澈蚌,長吁一口氣:“原來是場噩夢啊……” “哼摹芙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宛瞄,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浮禾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后份汗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盈电,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年裸影,在試婚紗的時候發(fā)現(xiàn)自己被綠了挣轨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡轩猩,死狀恐怖卷扮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情均践,我是刑警寧澤晤锹,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站彤委,受9級特大地震影響鞭铆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜焦影,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一车遂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斯辰,春花似錦舶担、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闸氮,卻和暖如春剪况,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒲跨。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工译断, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人或悲。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓镐作,卻偏偏與公主長得像藏姐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子该贾,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容