# -*- coding: utf-8 -*-
import os

import sys
sys.path.append("..")
from utils import word_frequency as wf
from utils import ccpl_lib as ccpl

# 根据输入的数据，统计词频后输出

# 输入数据的格式：
# 在 inpath目录下，
#   每个文件夹是一组数据，包括多个文件
#      每组数据中的每个文件是一批微博数据，文件名则是这批微博数据的标志
#        每个文件包括多行的微博数据，每行数据包括两列，第一列是id，第二列是微博内容
#   每组数据输出一个结果文件，该组数据的一个文件是一行

# ===================== 参数设置 =====================

#输入的数据文件所在目录
inpath = "../data/timeloc/"

#每个数据文件名在输出文件里的列名
filenameHeader = '地址 年月'

# 设置词典，每次只要修改词典名就可以
# dict_name = "dic_yq"

# 每个文件所需要的最少微博条数
MIN_WEIBO = 30

# 计算结果的输出路径
outpath = '../data/out/'

# ===================== 参数设置 =====================


dic_list = [
    'dic_daodedongji',
    'dic_daodejichu',
    'dic_getijitizhuyi',
    'dic_songjinwenhua',
    'dic_suicide',
    'dic_weibojibenqingxu'
    ]


# 将缓存中的微博数据wbuf写入文件fname中
def saveBuf(fname, wbuf):
    if(len(wbuf) <= 0):
        return
    
    with open(fname, 'a', encoding='utf-8') as outf:
        outf.write(wbuf)
        outf.flush()

    return



# 对每个词典进行统计
for dict_name in dic_list:

    #拼接成完整的词典路径
    dict_fullpath = "../dict/" + dict_name + '/'
    
    #判断该词典的路径是否存在
    if(not os.path.exists(dict_fullpath)):
        print("Dict ", dict_name, " 词典文件不存在!")
        continue
    
    #载入词典
    wordFreq = wf.word_frequency(dict_fullpath)
    
    #输出文件的表头信息
    header_0 = [filenameHeader]
    # header_1 = ['用户数','微博数','微博字数']
    header_1 = ['微博数','微博字数']
    header_2 = wordFreq.Name
    header_3 = ['词数','每句平均词数','字典覆盖率','数字比率','词长大于等于6的比率','词长大于等于4的比率','拉丁词比率','at用户数量','情感词数量','标签数量','url数量']
    header = header_0 + header_1 + header_2 + header_3
    headerstr = '\t'.join(str(s) for s in header)
    headerstr += '\n'
    
    # 读取输入目录下的每个子目录
    flist = ccpl.getSubFolderList(inpath)
    for rL in flist:
        inRegionDir = inpath + rL
        print(rL)
        
        #设置词频统计后的输出文件
        out_file = outpath + rL + '_' + dict_name + '.txt'
        
        # print(out_file)
        
        #将表头信息写入文件
        with open(out_file,'w',encoding='utf-8') as outf:
            outf.write(headerstr)
            outf.flush()
       
        buf_out = ''
        num_lines = 0
        
        # 读取目录下的每个数据文件
        for f in os.listdir(inRegionDir):
            infile = inRegionDir + '/' + f 
            # print(infile)
            
            # 获取数据文件的文件名
            strFileName = f.split('.')[0]
            
            weibo = []
            wb_count = 0
            txt_count = 0
            
            # 读入数据分拣
            with open(infile, encoding='utf-8', errors='ignore') as freader:
                for line in freader:
                    wb_count += 1 
                    txt_count += len(line)
                    weibo.append(line)
                    
            #如果微博数少于设定的阈值，则不进行后续分析
            if(len(weibo) < MIN_WEIBO):
                continue
            
            # 拼接出需要输出的统计结果
            row = [strFileName, wb_count, txt_count]
            feature_vector = wordFreq.getFeatureOriginal(weibo, True)
            feature_vector = feature_vector.split(",")
            row += feature_vector
            rowstr = '\t'.join(str(s) for s in row)
            rowstr += '\n'
            
            buf_out += rowstr
            num_lines += 1
            
            if(num_lines >= 1000):
                print('.', end ='')
                saveBuf(out_file, buf_out)
                    
                buf_out = ''
                num_lines = 0
    
        print()
        saveBuf(out_file, buf_out)

    # 清空词典
    wordFreq.clear()        

    
print('DONE!')
    
