bbc数据集结构

bbc文件夹下有五个文件夹,对应5个聚类,分别为tech,sport,politics,entertainment,business。每个子文件夹下有多个txt文本文件,是一段简短的bbc演讲稿,举例如下:

在这里插入图片描述

预处理代码

思路:

  1. 获取所有子文件夹,循环遍历读取文本数据,获取文本及标签。
  2. 文本向量化,采用TF-IDF进行向量化。
  3. 建立图结构。

其中,建立图结构采用的是利用文本向量的余弦相似度作为文本之间的相似关系,因为余弦相似度可以比较好地度量文本语义的相似程度。构建出文本之间的相似图结构,为基于图的文本聚类算法提供输入。设置阈值可以过滤掉不相似的文本对,只保留较相似的文本对之间的边。降低图结构的复杂度。

def get_graph():
    main_folder = 'bbc'

    # 列出主文件夹中的所有子文件夹
    subfolders = [subfolder for subfolder in os.listdir(main_folder) if
                  os.path.isdir(os.path.join(main_folder, subfolder))]

    # 定义TF-IDF向量化器
    vectorizer = TfidfVectorizer(stop_words='english',max_features=5000)  # 最多提取的特征数

    # 创建列表以存储文本数据和标签
    text_data = []
    labels = []

    # 循环遍历每个子文件夹并从文件中读取文本数据
    for label, subfolder in enumerate(subfolders):
        subfolder_path = os.path.join(main_folder, subfolder)
        txt_files = glob.glob(os.path.join(subfolder_path, '*.txt'))
        for txt_file in txt_files:
            text = read_text_file(txt_file)
            text_data.append(text)
            labels.append(label)

    # 对文本进行向量化
    tfidf_matrix = vectorizer.fit_transform(text_data).toarray()

    # 计算文本之间的余弦相似度
    from sklearn.metrics.pairwise import cosine_similarity
    graph = cosine_similarity(tfidf_matrix)

    # 设置阈值,相似度大于阈值的文本对之间建立边
    threshold = 0.8
    node_size = len(labels)
    edges = []
    for i in range(node_size):
        for j in range(node_size):
            if i != j and graph[i][j] > threshold:
                edges.append((i, j))

    # 保存图结构
    graph_path = 'graph/bbc_graph.txt'
    with open(graph_path, 'w') as f:
        for src, dst in edges:
            f.write('{} {}\n'.format(src, dst))

    # 保存标签
    label_path = 'data/bbc_label.txt'
    np.savetxt(label_path, labels, fmt='%d')

    # 保存txt
    save_path = 'data/'
    file_name = os.path.join(save_path, 'bbc.txt')

    try:
        with open(file_name, 'wb') as f:
            np.savetxt(f, tfidf_matrix, fmt='%f')

    except IOError as e:
        print('Error opening file for writing: ', e)
        return
    # tfidf_matrix = vectorizer.fit_transform(text_data).toarray()
    np.savetxt(file_name, tfidf_matrix, fmt='%f')

    # 创建数据加载器
    batch_size = 32
    dataset = CustomDataset(tfidf_matrix, labels)
    dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)



def read_text_file(file_path):
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            text = file.read()
    except:
        return ''
    return text


# 创建一个自定义数据集类,用于加载数据
class CustomDataset(torch.utils.data.Dataset):
    def __init__(self, data, labels):
        self.data = data
        self.labels = labels

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        x = torch.Tensor(self.data[idx])
        y = self.labels[idx]
        return x, y

get_graph()
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐