在这个项目里, 你需要完成一个意图识别的任务,主要使用的模型是SVM算法。使用的数据集是SMP2018中文人机对话技术评测
,是由科大讯飞股份有限公司提供数据。具体的数据可以从以下的链接下载: https://worksheets.codalab.org/worksheets/0x27203f932f8341b79841d50ce0fd684f/#, 下载之后把是数据集解压在当前的工程的根目录下。 在这个任务里,你即将要完成的几个任务是:
- 读取文件、展示数据、并做并将label映射为数字index, 以及将index映射为类别。
- 使用分词工具对用户query进行切分。
- 下载停用词表:https://github.com/goto456/stopwords/blob/master/%E4%B8%AD%E6%96%87%E5%81%9C%E7%94%A8%E8%AF%8D%E8%A1%A8.txt,
读取, 并对分词后结果进行过滤 - 统计词频,并过滤低频词
- 计算
tfidf
下载tiny-word-embedding
:https://github.com/Embedding/Chinese-Word-Vectors, 分别使用tfidf
, word2vec
建立SVM
模型, 并对比二者结果。
1. 下载数据和预处理
import numpy as np
import pandas as pd
import jieba # 感谢这个magic package,你不必要担心如何分词。如果想了解细节,可以参考此文件。
import requests
import os
from collections import Counter
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from gensim.models import Word2Vec
from sklearn.svm import SVC
from sklearn import metrics
from tqdm import tqdm
import pickle
import warnings
warnings.filterwarnings('ignore')
#下载数据,数据集为SMP2018
#训练集数据保存在同目录下的train.json文件中,测试集数据保存在同目录下的test.json文件中
#也可以使用! wget https://worksheets.codalab.org/rest/bundles/0x0161fd2fb40d4dd48541c2643d04b0b8/contents/blob/ 方式下载
if not os.path.exists('train.json'):
trainData = requests.get("https://worksheets.codalab.org/rest/bundles/0x0161fd2fb40d4dd48541c2643d04b0b8/contents/blob/")
with open("train.json", "wb") as f:
f.write(trainData.content)
if not os.path.exists('test.json'):
testData = requests.get("https://worksheets.codalab.org/rest/bundles/0x1f96bc12222641209ad057e762910252/contents/blob/")
with open("test.json", "wb") as f:
f.write(testData.content)
#读取数据至DataFrame中
train_df = pd.read_json("train.json").transpose()
test_df = pd.read_json("test.json").transpose()
# 先来查看一下数据,确保没有任何错误!
print ("训练数据和测试数据:", train_df.shape, test_df.shape)
print ("标签的种类: ", train_df.label.unique()) # 查看标签的个数以及标签种类,预计10个类别。
labelName = train_df.label.unique() #全部label列表
#实现文本label 与index的映射 hint : zip dict
label_index_dict = dict(zip(labelName,range(len(labelName))))
#查看label 与index 的映射关系
print(label_index