基于机器学习的文本分类NLP基本介绍
一、学习目的:
1 学会TF-IDF的原理和使用 2 使用sklearn的机器学习模型完成文本分类
二、处理文本方法:
1 One-hot(独热编码) 2 Bag of Words(词袋) 3 N-gram 4 TF-IDF 分数
下面具体介绍每种方法
2.1.one-hot
即将每一个单词使用一个离散的向量表示。具体将每个字/词编码一个索引,然后根据索引进行赋值
如:
句子1:我 爱 北 京 天 安 门 句子2:我 喜 欢 上 海
首先对所有句子的字进行索引,即将每个字确定一个编号: {'我': 1, '爱': 2, '北': 3, '京': 4, '天': 5, '安': 6, '门': 7, '喜': 8, '欢': 9, '上': 10, '海': 11}
得到有个11维的稀疏矩阵 我:[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 爱:[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] ... 海:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
2.2.Bag of Words(词袋表示),也称为Count Vectors
每个文档的字/词可以使用其出现次数来进行表示
#直接统计每个字出现的次数,并进行赋值: 句子1:我 爱 北 京 天 安 门 转换为 [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0] 句子2:我 喜 欢 上 海 转换为 [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
在sklearn中可以直接CountVectorizer
来实现这一步骤
from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'This is the first document.', 'This document is the second document.', 'And this is the third one.', 'Is this the first document?', ] vectorizer = CountVectorizer() vectorizer.fit_transform(corpus).toarray()
2.3.N-gram
与Count Vectors类似,不过加入了相邻单词组合成为新的单词,并进行计数
如果N取值为2,则句子1和句子2就变为:
句子1:我爱 爱北 北京 京天 天安 安门
句子2:我喜 喜欢 欢上 上海
2.4.TF-IDF
分数由两部分组成:
第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。
其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率
1 TF(t)= 该词语在当前文档出现的次数 / 当前文档中词语的总数 2 IDF(t)= log_e(文档总数 / 出现该词语的文档总数)
三、代码实现
# Count Vectors + RidgeClassifier import pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.linear_model import RidgeClassifier from sklearn.metrics import f1_score train_df = pd.read_csv('../data/train_set.csv', sep='\t', nrows=15000) vectorizer = CountVectorizer(max_features=3000) train_test = vectorizer.fit_transform(train_df['text']) clf = RidgeClassifier() clf.fit(train_test[:10000], train_df['label'].values[:10000]) val_pred = clf.predict(train_test[10000:]) print(f1_score(train_df['label'].values[10000:], val_pred, average='macro')) # 0.74
# TF-IDF + RidgeClassifier import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import RidgeClassifier from sklearn.metrics import f1_score train_df = pd.read_csv('../data/train_set.csv', sep='\t', nrows=15000) tfidf = TfidfVectorizer(ngram_range=(1,3), max_features=3000) train_test = tfidf.fit_transform(train_df['text']) clf = RidgeClassifier() clf.fit(train_test[:10000], train_df['label'].values[:10000]) val_pred = clf.predict(train_test[10000:]) print(f1_score(train_df['label'].values[10000:], val_pred, average='macro')) # 0.87
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人