import pandas as pd
from config import Config
from sklearn.feature_extraction.text import TfidfVectorizer # TF-IDF类
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier # 随机森林
from tqdm import tqdm
from sklearn.metrics import precision_score,recall_score,f1_score
import pickle   # 专门读写pickle类型的文件

# 1- 基础配置信息
config = Config()

if __name__ == '__main__':
    # 2- 读取预处理后的文件
    # 2.1- 读取文件
    # [:2000]：只取前2000行数据，为了加快代码开发和测试的速度。注意：正式上线之前，要删掉
    df = pd.read_csv(config.process_train_datapath)[:2000]
    # df = pd.read_csv(config.process_train_datapath)

    # 2.2- 获取特征和目标值
    words = df["words"]
    y = df["label"]

    # 3- 特征数据转词向量
    # 3.1- 创建TF-IDF算法模型实例对象
    # 读取停止词
    stop_word_list = open(config.stopwords_datapath,encoding="UTF-8").read().split()
    tfidf = TfidfVectorizer(stop_words=stop_word_list)
    # 模型训练，并且对数据转成词向量
    x = tfidf.fit_transform(words)

    # 3.2- 输出相关信息
    # print("处理后的特征名称列表",tfidf.get_feature_names_out())
    # print("处理后的词和索引映射关系",tfidf.vocabulary_)
    # print("处理后的词和索引的条数：也就是词汇表大小",len(tfidf.vocabulary_))

    """
        TF-IDF处理后的数据解释：
            Coords	Values
            (0, 818)	0.4145423492151699
            
            1- 0：代表该词所在的句子索引
            2- 818：代表该词的词索引
            3- 0.4145423492151699：TF-IDF的值
    """
    # print(x)

    # 4- 划分训练集和测试集
    x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=0.2, random_state=114)

    # 5- 模型训练
    model = RandomForestClassifier(n_jobs=-1)
    model.fit(x_train,y_train)

    # 6- 评估
    y_pred = model.predict(x_test)
    """
        average参数解释：
            1- binary：针对二分类场景
            2- macro：宏观。多分类场景，样本分布均衡的场景
            3- micro：微观。多分类场景，样本分布不均衡的场景
    """
    print("精确率",precision_score(y_test, y_pred, average="macro"))
    print("召回率",recall_score(y_test, y_pred, average="macro"))
    print("F1值",f1_score(y_test, y_pred, average="macro"))


    # 7- 保存训练好的模型：推荐使用joblib.dump()
    with open(config.tfidf_model_path,mode="wb") as f:
        pickle.dump(tfidf,f)

    with open(config.rf_model_path,mode="wb") as f:
        pickle.dump(model,f)



