基于sklearn的文本特征提取与分类

本文分享了作者参与中移动垃圾短信识别竞赛的经历及技术细节。从80万条训练短信中识别垃圾短信,通过分词、特征提取、分类等步骤实现了0.985的准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章开的比较久但内容没怎么写,不好意思!

本文呢是根据自己参加中移动垃圾短信基于文本内容识别竞赛而写的大数据与智能计算主页,竞赛描述网址:http://www.wid.org.cn/data/science/player/competition/detail/description/227由于比赛结果不太好,就记录一下用sklearn做文本特征提取这一块吧,当时也参考许多的博文,如Feature extraction - sklearn文本特征提取 应用scikit-learn做文本分类 以及文本挖掘之特征选择(python 实现)  等文章。

题目是80万条短信作为训练数据,10%的垃圾短信(label = 1),90%正常短信(label = 0),然后在20万条数据作为测试对象,找出垃圾短信与正常短信。我最终的评分是0.985,相对于第一0.997还是有很大差距,排名59/339。具体竞赛内容可以参考中国好创意比赛官网。

文本分类大致可以分为:出本处理,特征提取,特征选择,分类,预测几个步骤,其中前三步占用80%的工作量。

1.文本处理

分词,去除停用词等。文本处理要做的内容很多,如果需要请参考其他文献。

分词我采用结巴分词,有比较好用的python包,Python中文分词组件 以供参考

去除停用词需要根据实际情况作考虑,一般情况是需要的。

文本处理后,得到的应该是每条短信对应的分词表,如:原”商业秘密的秘密性那是维系其商业价值和垄断地位的前提条件之一“经过处理后为”商业秘密 秘密性 维系 商业价值 垄断 地位 前提条件 之一 “

核心代码:

#   (i not in stopWords) and    
def cutWords(msg,stopWords):
    seg_list = jieba.cut(msg,cut_all=False)
    #key_list = jieba.analyse.extract_tags(msg,20) #get keywords 
    leftWords = [] 
    for i in seg_list:
        if (i not in stopWords):
            leftWords.append(i)        
    return leftWords

#获取停用词表
def loadStopWords(): 
    stop = [line.strip().decode('utf-8')  for line in open('../data/stopWord.txt').readlines() ] 
    return stop
2.特征提取,特征选择

这里呢就需要参考上面的提到的两个参考博文了,具体API的用法可以参考sklearn官网  这里使用的是tfidf特征

核心代码举例,具体参考附录的完整工程:

#navie bayes classifier
def nbClassifier(trainData,testData,trainLabel,testLabel):
    vectorizer = CountVectorizer(binary=True)
    fea_train = vectorizer.fit_transform(trainData)
    fea_test = vectorizer.transform(testData);  
#     tv=TfidfVectorizer()#该类会统计每个词语的tf-idf权值    
#     fea_train = tv.fit_transform(trainData)    #return feature vector 'fea_train' [n_samples,n_features]  
#     fea_test = tv.transform(testData);  
    print 'Size of fea_train:' + repr(fea_train.shape) 
    print 'Size of fea_test:' + repr(fea_test.shape) 
    print fea_train.nnz
    print fea_test.nnz

    clf = MultinomialNB(alpha = 0.01)   
    clf.fit(fea_train,np.array(trainLabel))
    pred = clf.predict(fea_test)
    totalScore(pred,testData,testLabel)

3.分类,预测

这个不多说,常见的方法就那么几种,相差不会很大。如果需要达到很高的分数还需要算法上的修改优化。

4.改进

由于垃圾短信中存在特殊字符,比如,三角/方框/繁体字等,在预处理时可以建立所有文档的异常符号词库,作为字典,对结果肯定有提升.

参考比赛第一名的ppt,对我来说参考意义也蛮大,需要的可以在我的资源点击打开链接查看.

本人的工程代码以及数据请到我的github主页下载点击打开链接






### 如何使用 scikit-learn 进行文本分类 #### 准备工作 为了进行文本分类,首先需要安装必要的库。如果尚未安装 `scikit-learn` 和其他依赖项,则可以通过 pip 安装这些包。 ```bash pip install numpy pandas scikit-learn ``` #### 导入所需模块 在开始之前,先导入用于处理数据集以及构建和支持向量机模型所需的 Python 库[^2]: ```python from sklearn.feature_extraction.text import CountVectorizer from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.metrics import classification_report, accuracy_score import pandas as pd ``` #### 加载并预览数据集 假设有一个 CSV 文件作为输入源,该文件包含了两列——一列表示文档的内容(即待分析的文本),另一列表示类别标签(例如垃圾邮件/非垃圾邮件)。可以利用 Pandas 来加载此数据集,并查看前几条记录以了解其结构[^1]。 ```python data = pd.read_csv('path/to/dataset.csv') print(data.head()) ``` #### 数据准备 接下来,将整个数据集划分为训练集和测试集两个部分;通常情况下会按照一定比例分配这两者之间的样本数量,比如80%的数据用来训练而剩下的20%则留作验证之用。这里采用的是75%-25%的比例划分方法。 ```python X_train, X_test, y_train, y_test = train_test_split( data['text'], # 文本特征 data['label'], # 类别标签 test_size=0.25, random_state=42 ) ``` #### 特征提取 对于文本数据来说,在应用机器学习算法之前还需要将其转换成数值型特征向量的形式。在此过程中,通过调用 `CountVectorizer()` 创建了一个基于词频统计方式来表征每篇文档的方法实例对象,并以此为基础完成对原始语料库中所有单词频率计数的任务。最终得到的结果是一个稀疏矩阵形式的表现形式。 ```python vectorizer = CountVectorizer() X_train_counts = vectorizer.fit_transform(X_train.values.astype('U')) X_test_counts = vectorizer.transform(X_test.values.astype('U')) ``` #### 训练 SVM 模型 创建一个线性核的支持向量分类器 (Support Vector Classifier),并将上述经过变换后的训练样例传递给它来进行参数估计过程。这一步骤完成后即可获得已经拟合好的预测函数。 ```python clf = SVC(kernel='linear', C=1).fit(X_train_counts, y_train) predicted = clf.predict(X_test_counts) ``` #### 结果评估 最后,计算所建立起来的分类系统的性能指标,如准确率、召回率等,以便更好地理解当前方案的有效性和局限所在。此外还可以打印出详细的分类报告供进一步审查。 ```python print(f'Accuracy: {accuracy_score(y_test, predicted)}') print(classification_report(y_test, predicted)) ```
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值