赞
踩
本月竞赛学习将以对话意图识别展开,意图识别是指分析用户的核心需求,错误的识别几乎可以确定找不到能满足用户需求的内容,导致产生非常差的用户体验。在对话过程中要准确理解对方所想表达的意思,这是具有很大挑战性的任务。在本次学习中我们将学习:
- 自然语言处理基础
- 文本分类路线:正则表达式、TFIDF、FastText、BERT、T5、Prompt、GPT
- 大模型分类路线:提示词、思维链、高效微调
Intent Recognition 是指通过自然语言文本来自动识别出用户的意图或目的的意向技术任务。
import pandas as pd
from wordcloud import WordCloud # 词云
import matplotlib.pyplot as plt
import jieba # 结巴
train.csv
和 test.csv
read_csv
函数可以读取 csv
格式的数据文件,并返回一个 DataFrame
对象。data_dir = ' '
train_data = pd.read_csv(data_dir + '/train.csv', sep='\t', header=None)
test_data = pd.read_csv(data_dir + '/test.csv', sep='\t', header=None)
DataFrame
对象的 value_counts
函数可以统计每个类别出现的次数和比例,使用 apply
函数和 len
函数可以统计每个文本的长度。1. 数据集的文本长度一致吗?
2. 数据集中的文本是长文本还是短文本?根据统计结果,查看每个文本的长度分布情况,如文本长度的中位数。
可以看到文本统计中,所有字符 12100 个,文本长度最少4个,最多54个,平均15个,应该属于是短文本、
文本类别统计
正则表达式 regular expressions 是一种用于字符串搜索和操作的强大工具。
它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
TFIDF(词频-逆文档频率)是一种常见的文本表示方法,可以用于文本分类任务。
TFIDF 将文本表示为词项的权重向量,其中每个词项的权重由其在文本中出现的频率和在整个语料库中出现的频率共同决定。
TFIDF 可以反映出词项在文本中的重要程度,越是常见的词项权重越低,越是稀有的词项权重越高。
需要使用到的包
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import LinearSVC
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import classification_report
import pandas as pd
import jieba
# 实例化tfidfVectorizer类 tfidf = TfidfVectorizer( # 使用结巴分词 tokenizer=jieba.lcut, # 使用百度停用词库 stop_words = list(cn_stopwords) ) # 计算训练集和测试集的tfidf矩阵 train_tfidf = tfidf.fit_transform(train_data[0]) test_tfidf = tfidf.transform(test_data[0]) # 查看训练集和测试集的tfidf矩阵 print(train_tfidf.shape, test_tfidf) print("=======================================") print(test_tfidf.shape, test_tfidf)
# 使用逻辑回归进行交叉验证预测
cv_pred = cross_val_predict(
LogisticRegression(),
train_tfidf,
train_data[1]
)
# classification_report生成分类报告
# 将train_data[1]作为真实值,cv_pred作为预测值,
# 可以得到准确率、召回率、F1值等评估指标
print(classification_report(train_data[1], cv_pred))
# 使用KNN进行交叉验证预测
cv_pred = cross_val_predict(
# 使用KNN
KNeighborsClassifier(),
train_tfidf,
train_data[1]
)
print(classification_report(train_data[1], cv_pred))
# 使用线性支持向量机进行交叉验证预测
# model = LinearSVC()
# model.fit(train_tfidf, train_data[1])
cv_pred = cross_val_predict(
LinearSVC(),
train_tfidf,
train_data[1]
)
print(classification_report(train_data[1], cv_pred))
TFIDF中可以设置哪些参数,如何影响到提取的特征?
KNN/LR/SVM的精度对比:根据实验结果,比较三种分类器在验证集和测试集上预测正确率、召回率、F1值等指标,并分析各自优缺点。
词向量是一种将单词转化为向量表示的技术。
通过将单词映射到一个低维向量空间中,词向量可以在一定程度上铺捉到单词的语义信息和关联关系。
# 使用结巴分词
train_data[0] = train_data[0].apply(jieba.lcut)
test_data[0] = test_data[0].apply(jieba.lcut)
# 使用 gensim的word2vec模型
model = Word2Vec(
sentences=list(train_data[0].values[:]) + list(test_data[0].values[:])
vector_size=50, # 词向量维度
#sg=0, # 训练算法,0表示CBOW 默认,1表示skip-gram
window=5, # 一句话中当前和预测单词之间的最大距离
min_count=1, # 词频最小值,低于它的词频将被丢弃
workers=4 # 并行训练
)
# 计算句子向量,这里直接求词向量均值
train_w2v = train_data[0].apply(lambda x: model.wv[x].mean(0))
test_w2v = test_data[0].apply(lambda x: model.wv[x].mean(0))
LR(逻辑回归)、SVM(支持向量机)和决策树都是常用的机器学习分类算法,可以使用sklearn库中提供的相关函数来实现。
使用 LR
# 使用LR
cv_pred = cross_val_predict(
LogisticRegression(),
train_w2v,
train_data[1]
)
print(classification_report(train_data[1], cv_pred))
# 使用决策树
cv_pred = cross_val_predict(
DecisionTreeClassifier(),
train_w2v,
train_data[1]
)
print(classification_report(train_data[1], cv_pred))
cv_pred = cross_val_predict(
LinearSVC(),
train_w2v,
train_data[1]
)
print(classification_report(train_data[1], cv_pred))
词向量的维度会影响到模型精度吗?
词向量编码后使用树模型和LR,谁的精度高,为什么?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。