22222153513 2023-02-11 22:48 采纳率: 60%
浏览 116
已结题

在 TF-IDF 特征提取的基础上对模型建立与评估

在 TF-IDF 特征提取的基础上, 分别采用逻辑回归、 朴素贝叶斯两种模型对文本数据的分类效果进行比较(准确率、召回率、F1);逻辑回归对分类标签种类比较(准确率、召回率、F1)
数据来源:https://github.com/aceimnorstuvwxz/toutiao-text-classfication-dataset

import numpy as np
import pandas as pd
import time
import jieba
import re
import string
import pickle
import matplotlib.pyplot as plt


from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.feature_extraction.text import TfidfTransformer, CountVectorizer
from sklearn.model_selection import StratifiedKFold



# # Pandas设置
# pd.set_option("display.max_columns", None)  # 设置显示完整的列
# pd.set_option("display.max_rows", None)  # 设置显示完整的行
# pd.set_option("display.expand_frame_repr", False)  # 设置不折叠数据
# pd.set_option("display.max_colwidth", 100)  # 设置列的最大宽度


# 加载数据集
def data():
    a=[]
    with open(r'D:\桌面\文本分类\data.txt',encoding='utf-8') as f:
        a.append(f.readlines())
    df = pd.DataFrame(a[0])
    df['label']=df[0].apply(lambda x:x.split('_!_')[1])      #对第二个!前的数据名称设置为label
    df['label_desc']=df[0].apply(lambda x:x.split('_!_')[2]) #对第三个!前的数据名称设置为label_desc
    df['sentence']=df[0].apply(lambda x:x.split('_!_')[3])   #对第四个!前的数据名称设置为sentence
    return df.iloc[0:,1:] 
df=data()


#去重仅保留第一次出现的评论
df=df.drop_duplicates(keep='first',inplace=False)
#去除空白行
df= df.dropna(axis=0)



STOPWORDS = r'D:\桌面\文本分类\停用词\stopwords-master\哈工大停用词表.txt'
stoplist = []
content_list = []
for word in open(STOPWORDS,encoding='utf-8'):
    stoplist.append(word.strip())   #添加停用词表


#去除无效符号
def qu_dian(text):
    punc = r'[~`!#$%^&*()_+-=|\';":/.,?><~·!@#¥%……&*()——+-=“:’;、。,?》《{}]'
    ff=re.sub(punc, "",text)
    f1=jieba.lcut(ff,cut_all=False)     #中文分词
    def rn(x):
        return x.replace(' ','')
    ben=list(filter(rn,f1))
    return ben

df['quchu']=df['sentence'].apply(qu_dian)

#去除停用词
def qu_word(x):
    real=[]
    for i in x:
        if i not in stoplist:
            real.append(i)
    return real

df['quchu']=df['quchu'].apply(qu_word)



# 实例化CountVectorizer
vectorizer = CountVectorizer()
# 将文本数据转化为特征矩阵
X = vectorizer.fit_transform(df['sentence'].tolist())
# 实例化TfidfTransformer
transformer = TfidfTransformer()
# 对特征矩阵进行tf-idf转换
X = transformer.fit_transform(X)
# 实例化StratifiedKFold
skf = StratifiedKFold(n_splits=5)

# 对数据进行划分
for train_index, test_index in skf.split(X, df['label']):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = df['label'][train_index], df['label'][test_index]

  • 写回答

4条回答 默认 最新

  • GISer Liu 2023-02-12 00:29
    关注
    
    import numpy as np
    import pandas as pd
    import time
    import jieba
    import re
    import string
    import pickle
    import matplotlib.pyplot as plt
    
    
    from sklearn.metrics import accuracy_score, precision_score, recall_score
    from sklearn.feature_extraction.text import TfidfTransformer, CountVectorizer
    from sklearn.model_selection import StratifiedKFold
    from sklearn.metrics import classification_report
    from sklearn.linear_model import LogisticRegression
    from sklearn.naive_bayes import MultinomialNB
    
    
    # # Pandas设置
    # pd.set_option("display.max_columns", None)  # 设置显示完整的列
    # pd.set_option("display.max_rows", None)  # 设置显示完整的行
    # pd.set_option("display.expand_frame_repr", False)  # 设置不折叠数据
    # pd.set_option("display.max_colwidth", 100)  # 设置列的最大宽度
    
    
    # 加载数据集
    def data():
        a=[]
        with open(r'F:\项目\jupternotebook\吴恩达机器学习2022\文本数据分析\datas.txt',encoding='utf-8') as f:
            a.append(f.readlines())
        df = pd.DataFrame(a[0])
        df['label']=df[0].apply(lambda x:x.split('_!_')[1])      #对第二个!前的数据名称设置为label
        df['label_desc']=df[0].apply(lambda x:x.split('_!_')[2]) #对第三个!前的数据名称设置为label_desc
        df['sentence']=df[0].apply(lambda x:x.split('_!_')[3])   #对第四个!前的数据名称设置为sentence
        return df.iloc[0:,1:] 
    df=data()
    
    
    #去重仅保留第一次出现的评论
    df=df.drop_duplicates(keep='first',inplace=False)
    #去除空白行
    df= df.dropna(axis=0)
    
    
    
    STOPWORDS = r'F:\项目\jupternotebook\吴恩达机器学习2022\文本数据分析\哈工大停用词表.txt'
    stoplist = []
    content_list = []
    for word in open(STOPWORDS,encoding='utf-8'):
        stoplist.append(word.strip())   #添加停用词表
    
    
    #去除无效符号
    def qu_dian(text):
        punc = r'[~`!#$%^&*()_+-=|\';":/.,?><~·!@#¥%……&*()——+-=“:’;、。,?》《{}]'
        ff=re.sub(punc, "",text)
        f1=jieba.lcut(ff,cut_all=False)     #中文分词
        def rn(x):
            return x.replace(' ','')
        ben=list(filter(rn,f1))
        return ben
    
    df['quchu']=df['sentence'].apply(qu_dian)
    
    #去除停用词
    def qu_word(x):
        real=[]
        for i in x:
            if i not in stoplist:
                real.append(i)
        return real
    
    df['quchu']=df['quchu'].apply(qu_word)
    
    
    
    # 实例化CountVectorizer
    vectorizer = CountVectorizer()
    # 将文本数据转化为特征矩阵
    X = vectorizer.fit_transform(df['sentence'].tolist())
    # 实例化TfidfTransformer
    transformer = TfidfTransformer()
    # 对特征矩阵进行tf-idf转换
    X = transformer.fit_transform(X)
    # 实例化StratifiedKFold
    skf = StratifiedKFold(n_splits=5)
    
        
    # 对数据进行划分
    y = df['label']
    for train_index, test_index in skf.split(X,y):
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y.iloc[train_index], y.iloc[test_index]
        
    #逻辑回归
    
    clf = LogisticRegression(random_state=0, solver='lbfgs', multi_class='multinomial')
    clf.fit(X_train, y_train)
    y_pred_log = clf.predict(X_test)
    
    #计算准确率、召回率、F1
    accuracy = accuracy_score(y_test, y_pred_log)
    precision = precision_score(y_test, y_pred_log, average='macro')
    recall = recall_score(y_test, y_pred_log, average='macro')
    f1 = 2 * precision * recall / (precision + recall)
    print("逻辑回归分类结果:\n准确率:", accuracy, "\n召回率:", recall, "\nF1:", f1)
    
    
    #朴素贝叶斯
    
    clf = MultinomialNB()
    clf.fit(X_train, y_train)
    y_pred_clf = clf.predict(X_test)
    
    #计算准确率、召回率、F1
    accuracy = accuracy_score(y_test, y_pred_clf)
    precision = precision_score(y_test, y_pred_clf, average='macro')
    recall = recall_score(y_test, y_pred_clf, average='macro')
    f1 = 2 * precision * recall / (precision + recall)
    print("朴素贝叶斯分类结果:\n准确率:", accuracy, "\n召回率:", recall, "\nF1:", f1)
    
    # 评估分类效果
    print(classification_report(y_test, y_pred_log))
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月20日
  • 已采纳回答 2月12日
  • 赞助了问题酬金15元 2月11日
  • 创建了问题 2月11日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来