Sobre la base de TF-IDF Python extracto de los datos de texto Imagen

      El final de un largo día de trabajo, para grabar algo escribir sobre ella. Hoy en día es la realización de lo que el algoritmo principal TF-IDF, esto creo que la gente entre en contacto con el procesamiento de datos de texto es simplemente pediatría, ¿cuál es el principio que lo haré no carga una mirada directa en el código aquí:

#!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)

      datos de contenido utilizados en el ensayo son los siguientes:

由于限制原因未能上传

      resultados de segmentación se muestran a continuación:

由于限制原因未能上传

       valor IDF se calcula como sigue:

由于限制原因未能上传

      Debido a las limitaciones razones, no pueden subir sus propios datos de uso de corpus, interesados ​​pueden tratar de encontrar su propio artículo, utilizo un pequeño corpus, aquí es mejor utilizar un relativamente amplio corpus de conjuntos de datos para calcular los valores de las FDI, por lo que la final calculado valor TF-IDF mayor fiabilidad.

 

Publicados 532 artículos originales · ganado elogios 1297 · Vistas 3,34 millones +

Supongo que te gusta

Origin blog.csdn.net/Together_CZ/article/details/105060056
Recomendado
Clasificación