鱼C论坛

 找回密码
 立即注册
查看: 681|回复: 1

将读取文件由txt换成excel的问题

[复制链接]
发表于 2018-10-24 21:19:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好,最近我想用python实现文本分类(类似于垃圾邮件分类),但是信息是在excel表格中的(信息很多)。在网上看到的代码读取的是txt文本和文件夹,不知道如何才能实现对excel中的某一行字进行切割、分类呢?附,excel图,代码图

  1. import os
  2. import time
  3. import jieba
  4. import jieba.analyse
  5. import nltk
  6. import numpy as np
  7. import pylab as pl
  8. import matplotlib.pyplot as plt


  9. def TextProcessing(folder_path):

  10.     folder_list = os.listdir(folder_path)
  11.     train_set = []
  12.     test_set = []
  13.     all_words = {}
  14.     class_list = []

  15.     # 类间循环
  16.     for i in range(len(folder_list)):
  17.         new_folder_path = os.path.join(folder_path, folder_list[i])
  18.         files = os.listdir(new_folder_path)
  19.         class_list.append(folder_list[i].decode('utf-8'))

  20.         # 判断指标
  21.         j = 1
  22.         N = 100 # 每类text最多取100个样本
  23.         # 类内循环
  24.         for file in files:
  25.             if j > N:
  26.                 break
  27.             fp = open(os.path.join(new_folder_path, file), 'r')
  28.             raw = fp.read()
  29.             # print raw

  30.             # jieba分词
  31.             # jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数,不支持windows
  32.             word_cut = jieba.cut(raw, cut_all=False) # 精确模式,返回的结构是一个可迭代的genertor,jieba分词可以改进词典库
  33.             # jieba.disable_parallel() # 关闭并行分词模式

  34.             # for w in word_cut: # for循环得到每一个词语
  35.             #     print w
  36.             word_list = list(word_cut) # genertor转化为list,每个词unicode格式
  37.             # print word_list

  38.             # # jieba关键词提取
  39.             # # tags = jieba.analyse.extract_tags(raw, 10)
  40.             # tags = jieba.analyse.textrank(raw, 10)
  41.             # print tags

  42.             # 划分训练集和测试集
  43.             nFile = min([len(files), N])
  44.             if j > 0.3*nFile:
  45.                 train_set.append((word_list, class_list[i]))
  46.                 # 针对训练集的每个text分好的词序列进行循环,统计词频放入all_words
  47.                 for word in word_list:
  48.                     if all_words.has_key(word):
  49.                         all_words[word] += 1
  50.                     else:
  51.                         all_words[word] = 1
  52.             else:
  53.                 test_set.append((word_list, class_list[i]))
  54.             fp.close()
  55.             # print "Folder ", i+1, " -file- ", j
  56.             j += 1

  57.     # 所有出现过的词数目
  58.     # print "allwords: \n", all_words.keys()
  59.     print "all_words length in dict: ", len(all_words.keys())

  60.     # key函数利用词频进行降序排序
  61.     all_words_list = sorted(all_words.items(), key=lambda all_word:all_word[1], reverse=True) # 内建函数sorted参数需为list

  62.     return train_set, test_set, all_words_list


  63. def words_dict_use_stopwords(deleteN, all_words_list): # word_features是选用的word-词典
  64.     # 生成stopwords_list
  65.     stopwords_file = open('stopwords_cn.txt', 'r')
  66.     stopwords_list = []  
  67.     for line in stopwords_file.readlines():
  68.         stopwords_list.append(line.strip().decode('utf-8'))
  69.     stopwords_file.close()
  70.    
  71.     # dict_name = "dict_stopwords_"+str(deleteN)+".txt"
  72.     # dict = open(dict_name, 'w')
  73.     n = 1  
  74.     word_features = []  
  75.     for t in range(deleteN, len(all_words_list), 1):  
  76.         if n > 1000:
  77.             break
  78.         # print all_words_list[t][0]
  79.         if (all_words_list[t][0] not in stopwords_list) and (not all_words_list[t][0].isdigit()): #不在stopwords_list中并且不是数字
  80.             # dict.writelines(str(all_words_list[t][0]))
  81.             # dict.writelines(' ')
  82.             n += 1
  83.             word_features.append(all_words_list[t][0])
  84.     # dict.close()

  85.     return word_features  


  86. def text_features(text, word_features):  
  87.     text_words = set(text) # 找出text中的不同元素(单词)
  88.     features = {}  
  89.     for word in word_features: # 根据word_feature词典生成每个text的feature (True or False: NaiveBayesClassifier的特征)
  90.         features['contains(%s)' % word] = (word in text_words)
  91.     return features



  92. def TextFeatures(train_set, test_set, word_features):
  93.     # 根据每个text分词生成的word_list生成feature
  94.     # print train_set
  95.     # print test_set
  96.     # train_data是tuple list[({}, ),({}, ),({}, )],每个text的特征dict和类别组成一个tuple
  97.     train_data = [(text_features(d, word_features), c) for (d, c) in train_set] # (d, c)代表(已经分词的文件, 类别)
  98.     test_data = [(text_features(d, word_features), c) for (d, c) in test_set]
  99.     # print train_data
  100.     # print test_data
  101.     print "train number: ", len(train_data), "\ntest number: ", len(test_data)     
  102.     return train_data, test_data



  103. def TextClassifier(train_data, test_data):
  104.     # 朴素贝叶斯分类器
  105.     classifier = nltk.classify.NaiveBayesClassifier.train(train_data)
  106.     test_accuracy = nltk.classify.accuracy(classifier, test_data)
  107.     return test_accuracy


  108. if __name__ == '__main__':

  109.     print "start"
  110.    
  111.     ## 文本预处理
  112.     folder_path = 'Databases\SogouC\Sample'        
  113.     train_set, test_set, all_words_list = TextProcessing(folder_path)
  114.    
  115.     ## 文本特征提取和分类
  116.     deleteNs = range(100, 1000, 20)
  117.     test_accuracy_use = []
  118.     for deleteN in deleteNs:
  119.         # use stopwords
  120.         word_features = words_dict_use_stopwords(deleteN, all_words_list)
  121.         train_data, test_data = TextFeatures(train_set, test_set, word_features)
  122.         test_accuracy = TextClassifier(train_data, test_data)
  123.         test_accuracy_use.append(test_accuracy)
  124.    
  125.     # 结果评价
  126.     # 不同deleteNs下的test_accuracy
  127.     plt.figure()
  128.     plt.plot(deleteNs, test_accuracy_use)
  129.     plt.title('Relationship of deleteNs and test_accuracy')
  130.     plt.xlabel('deleteNs')
  131.     plt.ylabel('test_accuracy')
  132.     plt.savefig('result.png')

  133.     print "finished"
复制代码

excel中每一行是一个文件,而不是每个txt文本是一个文件,想对每一行的excel进行分类

excel中每一行是一个文件,而不是每个txt文本是一个文件,想对每一行的excel进行分类
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-10-24 21:31:02 | 显示全部楼层
其实我不是很了解你想做什么
不过我发现的一点问题是,
尽量不要用列表来归类,用字典比较好
如果你可以生成一个字典,最后可以用pandas的to_excel函数来生成你想要的文件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 11:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表