TF-IDF Pythonの抽出テキストデータ画像に基づいて

      仕事の長い一日の終わりには、それについての書き込みに何かを記録します。:今日はメインTF-IDFアルゴリズムは、私は人々がテキストデータの処理と接触すると信じて、これは私が負担ここにコードを直接見ていないだろう原理は何だ、単に小児科あるものの実現であります

#!usr/bin/env python
#encoding:utf-8
from __future__ import division

'''
__Author__:沂水寒城
功能:  TF-IDF算法

TF-IDF实际上是:TF * IDF
                TF:词频(Term Frequency)
                IDF:逆文档频率(Inverse Document Frequency)
'''


import os
import re
import sys
import xlrd
import math
import json
import jieba
import sklearn
import numpy as np
import jieba.analyse


if sys.version_info==2:
    reload(sys)
    sys.setdefaultencoding( "utf-8" )



def dataPrepossing(one_line):
    '''
    数据内容去除无效字符,预处理
    '''
    sigmod_list=[',','。','(',')','-','——','\n','“','”','*','#',
                 '《','》','、','[',']','(',')','-','.','/','】','【']
    for one_sigmod in sigmod_list:
        one_line=one_line.replace(one_sigmod,'')
    return one_line


def seg(one_content, stopwords=[]):  
    ''' 
    分词并去除停用词 
    '''  
    segs=jieba.cut(one_content, cut_all=False)  
    # segs=[w.encode('utf8') for w in list(segs)]  
    segs=[unicode(w) for w in list(segs)]  
    seg_set=set(set(segs)-set(stopwords))  
    return list(seg_set) 


def cutData2Words(dataDir='data/',save_path='cut_words.json'):
    '''
    将原始的文本数据切分为词数据
    '''
    result={}
    txt_list=os.listdir(dataDir)
    for one_txt in txt_list:
        one_name=one_txt.split('.')[0].strip()
        one_txt_path=dataDir+one_txt 
        with open(one_txt_path) as f:
            one_data=f.read()
        one_words_list=seg(one_data)
        result[one_name]=one_words_list
    with open(save_path,'w') as f:
        f.write(json.dumps(result))


def calWordsIdf(data='cut_words.json',save_path='word_idf.json'):
    '''
    将整个语料库读入矩阵,并计算每个词的idf值,写入文件
    '''
    with open(data) as f:
        data_dict=json.load(f)
    word_doc_list=[]
    for one_key in data_dict:
        word_doc_list.append(data_dict[one_key])
    word_dict={}
    for one_list in word_doc_list:
        for one in one_list:
            if one in word_dict:
                word_dict[one]+=1
            else:
                word_dict[one]=1
    print('='*60)
    idf_dict={}
    n=len(word_doc_list)
    for one_word in word_dict:
        idf_dict[one_word]=math.log(n*1.0/word_dict[one_word])
    with open(save_path,'w') as f:
        f.write(json.dumps(idf_dict))


def calTxtKeyWords(data='data/1.txt',topK=30):
    '''
    计算单个文件数据的关键词[基于TF-IDF值降序筛选]
    '''
    with open('word_idf.json') as f:
        idf_dict=json.load(f)
    with open(data) as f:
        content=f.read()
    words_list=seg(content)
    tf_dict={}
    for one_word in words_list:
        if one_word in tf_dict:
            tf_dict[one_word]+=1
        else:
            tf_dict[one_word]=1
    tfidf_dict={}
    for oneW in tf_dict:
        try:
            tf=tf_dict[oneW]
            idf=idf_dict[oneW]
            tfidf_dict[oneW]=tf*idf
        except Exception,e:
            pass
            #print 'Exception: ',e 
    sorted_list=sorted(tfidf_dict.items(),key=lambda e:e[1], reverse=True)
    for one in sorted_list[:5]:
        print(one)
    return sorted_list[:topK]


if __name__ == '__main__':
    print('Loading.............................................')


    #数据集分词
    cutData2Words(dataDir='data/',save_path='cut_words.json')

    #计算词的逆文档频率
    calWordsIdf(data='cut_words.json',save_path='word_idf.json')

    #计算文档 1.txt 对的关键词
    calTxtKeyWords(data='data/01.txt',topK=30)

      次のようにテストのために使用されるコンテンツデータは以下のとおりです。

由于限制原因未能上传

      セグメンテーション結果を以下に示します。

由于限制原因未能上传

       次のようにIDF値が計算されます。

由于限制原因未能上传

      制限の理由により、独自に使用コーパスデータをアップロードすることができない、興味を持って、独自の記事を見つけることを試みること、私は小さなコーパスを使用し、ここでは最終的なもの、IDF値を計算するためのデータセットの比較的大きなコーパスを使用するのが最適ですTF-IDF値がより高い信頼性を計算しました。

 

公開された532元の記事 ウォンの賞賛1297 ビュー334万+

おすすめ

転載: blog.csdn.net/Together_CZ/article/details/105060056