我目前从我们的票务系统导出了一个包含两列的 CSV。
简短描述和类别。
两者都是由代理在记录工单时创建的。例如
- 数据备份不工作,备份
- Groups,Notes 中的电子邮件更改
- 找不到备份目录,备份
- 电子邮件 > 全球 - Lotus Notes,Notes
我被要求使用 Python 编写一个朴素贝叶斯程序,该程序将读取 CSV 文件中的简短描述,然后决定如何对其进行分类。
我有 329 张门票,分为 6 个不同的类别。
以下是每个的计数:
- 1 级 60
- 2 类 77
- 三级 65
- 第 4 类 16
- 5级18
- 6 级 93
我在想我必须创建 6 个不同的字典(每个类一个),其中包含简短描述中使用的所有单词,不包括通常的 !"£$%^&*()<>,./?:;@' #~][{}
然后,当我运行该程序时,它将使用 nltk 标记简短描述并将其与所有字典进行比较,并且匹配度最高的任何一个都将确定类别。
我会以正确的方式解决这个问题吗?我应该为我的样品使用多少张票?
以下是我目前所拥有的。它基本上运行一个以类命名的 csv 文件,然后输出另一个删除了标点符号的文件,所有单词都以小写字母和单独的单元格显示。然后,此数据将用作字典。我不确定我是否会以正确的方式处理这件事。
import csv
from nltk.tokenize import RegexpTokenizer
#Read CSV
readFile = open ('Backup.csv', 'r')
csv.readFile = csv.reader(readFile)
resultFile = open ('result.csv', 'w')
wr = csv.writer(resultFile)
#removes punctuation
tokenizer = RegexpTokenizer(r'\w+')
#for every row in file tokenize and covert to lowercase
#write tokenized words to a .csv file.
for row in csv.readFile:
wr.writerow(tokenizer.tokenize(row[0].lower()))
readFile.close()
resultFile.close()
编辑: 我现在已经开始使用以下内容,它从我的两列 csv 文件中获取数据:
from textblob.classifiers import NaiveBayesClassifier
from textblob import TextBlob
with open('train.csv', 'r') as fp:
cl = NaiveBayesClassifier(fp, format="csv")
print(cl.classify("backup")) # "Backup"
print(cl.classify("Lotus Notes.")) #"Lotus"
etc..
可以肯定的是,我只需要获得更好的训练和测试数据样本量,然后我将输入一个简短描述的 csv,然后使用已计算的类对其进行更新。
从功能的角度来看,除非我犯了任何明显的错误,否则它似乎可以工作?