from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.neighbors import KNeighborsClassifier

# 构建训练集和测试集的数据
train_data = ["新冠后 心率快，心脏 不舒服 腋下10厘米憋 新冠后心脏不舒服",
              "低压高 低压 96到102 高压 正常 谢谢 低压96 102 高压 正常",
              "吃什么 效果 比较好，原发性 高血压 最近 血压高的历害 高压155 低压105",
              "高血压 入冬 以来吃这两个药 血压 不稳定",
              "血压 升高3天 患者3天前 自觉 眼胀 不适，测 血压 发现",
              "腹部 胃镜检查示：慢性 非萎缩性 胃炎 伴胆汁反流，行肠镜检查示 慢性 直肠炎",
              "麻烦 看一下 胃镜 报告 超声内镜 体检 发现的",
              "反酸 烧心 上腹部 不适",
              "胃肠 不适 胃正 胃窦 慢性萎缩性 胃炎伴糜烂 重度肠上皮化生 肠镜 未发现异常",
              "上腹胀3月 腹胀 胆汁反流性胃炎 反流性咽喉炎",
              "3月底 胃镜 示小灶腺体 轻度非典型增生 3月底 胃镜 表浅黏膜慢性活动性炎 小灶腺体轻度非典型"]
train_labels = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
test_data = ["高血压 头部束缚感，胸口闷，胃反酸，脚后跟疼，无家族史",
             "反酸  反酸 烧心 不适 伴进 食油腻 食物 腹部",
             "高血压 现 高压最高 血压 降下来 降压 ",
             "胃炎 胆汁反流 胃病 焦虑症 如何治疗"]
test_labels = []

# 使用TF-IDF向量化文本数据
vectorizer = TfidfVectorizer()
train_vectors = vectorizer.fit_transform(train_data)
test_vectors = vectorizer.transform(test_data)

# 使用KNN算法对训练集进行训练，KNeighborsClassifier默认欧几里得距离公式
k = 3  # 选择K值为3
knn_classifier = KNeighborsClassifier(n_neighbors=k)
knn_classifier.fit(train_vectors, train_labels)

# 对测试集进行分类预测
test_predictions = knn_classifier.predict(test_vectors)
print("预测标签：", test_predictions)

# import pandas as pd
# from sklearn.feature_extraction.text import TfidfVectorizer
# from sklearn.neighbors import KNeighborsClassifier
# from sklearn.metrics import classification_report
# from sklearn.model_selection import train_test_split
#
# # 读取新闻文本数据集
# news_data = pd.read_excel('../datas/bing.xlsx', sheet_name='Sheet1')
#
# # 提取文本数据和标签
# X = news_data["comment"]
# y = news_data["sentiment"]
#
# # 对文本数据进行TF-IDF向量化
# vectorizer = TfidfVectorizer()
# X_tfidf = vectorizer.fit_transform(X)
#
# # 划分训练集和测试集
# X_train, X_test, y_train, y_test = train_test_split(X_tfidf, y, test_size=0.2, random_state=42)
#
# # 训练KNN分类器
# knn = KNeighborsClassifier(n_neighbors=5)
# knn.fit(X_train, y_train)
#
# # 在测试集上进行预测
# y_pred = knn.predict(X_test)

# 输出分类报告
# Precision：精确率，表示分类器正确预测为正例的样本数量占分类器预测为正例的样本数量的比例。
# Recall：召回率，表示分类器正确预测为正例的样本数量占实际正例样本的数量的比例。
# F1-score：F1值，综合考虑了精确率和召回率，是精确率和召回率的加权调和平均值，是评估分类器性能的一个综合指标。
# Support：样本数量，表示每个类别在数据集中的样本数量

# Accuracy：准确率，表示分类器正确预测的样本数量占总样本数量的比例。
# Macro avg：宏平均，表示对每个类别分别计算精确率、召回率、F1值等指标后，对所有类别的指标取平均值得到的结果。
# Weighted avg：加权平均，表示对每个类别分别计算精确率、召回率、F1值等指标后，对所有类别的指标进行加权平均得到的结果，权重为每个类别的样本数量。
# print(classification_report(y_test, y_pred))


# import numpy as np
# import operator
#
# import pandas as pd
#
#
# def knnClassify(inputX, data, labels, k):
#     # 1.计算测试数据与各训练数据之间的距离。
#     dataSize = data.shape[0]
#     x = np.tile(inputX, (dataSize, 1)) - data
#     xPositive = x ** 2
#     xDistances = xPositive.sum(axis=1)
#     distances = np.sqrt(xDistances)
#
#     # 2.按照距离的大小进行排序。
#     sortDisIndex = distances.argsort()
#
#     # 3.选择其中距离最小的k个样本点。4.确定K个样本点所在类别的出现频率。
#     classCount = {}  # 创建字典：label为键，频数为值
#     for i in range(k):
#         getLabel = labels[sortDisIndex[i]]
#         classCount[getLabel] = classCount.get(getLabel, 0) + 1
#
#     # 5.返回K个样本点中出现频率最高的类别作为最终的预测分类。
#     sortClass = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
#     print(sortClass[0][0])
#
#     return sortClass[0][0]
#
#
# if __name__ == '__main__':
#     # 测试数据
#     # inputX = np.array([2, 2.2, 1.9])
#     # 训练数据
#     # data = np.array([[1, 0.9, 1], [0.8, 0.9, 0.7], [1.3, 1, 1.2], [1.2, 0.9, 1], [2, 2.2, 2.1], [2.3, 2.2, 2], [2, 2.2, 1.9], [1.9, 2.2, 2.1], [3.1, 3.1, 3], [2.8, 2.9, 3.1], [2.9, 3, 3.2], [3.1, 3, 3.1]])
#     # 训练数据标签
#     # labels = np.array([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3])
#
#     # k = 4
#
#     # knnClassify(inputX, data, labels, k)
#
#
#
