TF-IDF文本向量化及朴素贝叶斯文本分类

文本corpus的格式是每行一篇文章,先经过分词,去停用词之后,再利用jieba.analyse.extract_tags(context,topK = N)进行提取出每个文本前10个重要的关键词。文本corpus_tags里面内容是对应的每一行文本的标签。

jieba分词和去停用词代码:

import jieba

# 创建停用词列表函数
def stopwordslist():
    stopwords = [line.strip() for line in open('C:/Users/yin/Desktop/chinesestopwords.txt','r').readlines()]
    return stopwords

# 对句子进行中文分词和去停用词函数
def seg_depart(sentence):
    # 对文档中的每一行进行中文分词
    sentence_depart = jieba.cut(sentence.strip())
    # 创建一个停用词列表
    stopwords = stopwordslist()
    # 输出结果为outstr
    outstr = ''
    # 去停用词
    for word in sentence_depart:
        if word not in stopwords:
            if word != '\t':
                outstr += word
                outstr += " "
    #字符串转换成字节
    #outstr = outstr.encode()
    return outstr

# 给出文档路径
filename = "C:/Users/yin/Desktop/data16.txt"#输入文件路径
outfilename = "C:/Users/yin/Desktop/data17.txt"#输出文件路径
inputs = open(filename, 'r',encoding = 'utf-8')#注意文件的编码格式
outputs = open(outfilename, 'w+',encoding = 'utf-8')

# 将输出结果写入ou.txt中
for line in inputs:
    line_seg = seg_depart(line)
    #输出每行的分词和去停用词结果,然后换行
    outputs.write(line_seg + '\n')
outputs.close()
inputs.close()
print("删除停用词和分词成功!!!")

分词和去停用词完成之后,再进行特征提取:

import jieba.analyse
with open('C:/Users/yin/Desktop/data17.txt','r',encoding = 'utf-8') as fr,open('C:/Users/yin/Desktop/data16.txt','w',encoding = 'utf-8') as fd:
	for text in fr.readlines():
		if text.split():#去除掉文本之间的空行,如果没有空行则不需要
			keywords = jieba.analyse.extract_tags(text,topK = 10)
			for item in keywords:
				fd.write(item[0]+item[1])
				fd.write(' ')
				#fd.write(item[1])
			fd.write('\n')
print('输出成功....')

 得到的效果基本上如下图所示:(文本特征词和标签)

然后就把上述的两个文件导入到下方的代码中实现向量化和分类器:(训练和测试的数据按照7:3进行随机切割的)

import numpy as np
from sklearn.naive_bayes import GaussianNB

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import classification_report,accuracy_score

from sklearn.model_selection import train_test_split # 切割数据---train + test
from sklearn import preprocessing # 结果评估

corpus = open("C:/Users/yin/Desktop/data16.txt","r",encoding="utf-8-sig")
corpus_tags = open("C:/Users/yin/Desktop/data14.txt","r",encoding="utf-8-sig")


cv=TfidfVectorizer(binary=False,decode_error='ignore',stop_words='english')
vec=cv.fit_transform(corpus.readlines())
arr=vec.toarray() #文本特征值矩阵向量arr
#print(arr)

dicts = {"教育":0,"生活家":1,"汽车控":2,"私房话":3,"养生堂":4,"育儿":5,"财经迷":6,"职场":7,
"旅游":8,"搞笑":9,"八卦精":10,"星座":11,"体育":12,"美食":13,"时尚圈":14,"游戏":15,
"萌宠":16,"科技咖":17,"军事":18,"历史":19}

a = np.array(list(map(lambda x: dicts[x.strip()], corpus_tags))) #标签矩阵向量a


X_train,X_test, y_train, y_test =train_test_split(arr,a,test_size=0.3, random_state=0)#把文本特征向量和标签向量分割成训练集和测试集


def test_gaussian_nb():
    X = X_train
    Y = y_train
 
    gnb = GaussianNB()
    gnb.fit(X, Y)
    
    result = gnb.predict(X_test)
    print(classification_report(y_test,result))
 
if __name__ == '__main__':
    test_gaussian_nb()

可以得到一个简单的分类评价效果:

 

以上就是一些简单的过程,欢迎交流,谢谢!

 

  • 5
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: 我的代码示例如下:# 导入需要的库 import pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer from sklearn.naive_bayes import MultinomialNB# 读取数据 df = pd.read_csv('comments.csv')# 实例化CountVectorizer count_vect = CountVectorizer() # 将评论文本向量化 X_train_counts = count_vect.fit_transform(df['Comment'])# 实例化TfidfTransformer tfidf_transformer = TfidfTransformer()# 将向量数据进行tf-idf加权 X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)# 实例化MultinomialNB clf = MultinomialNB().fit(X_train_tfidf, df['Label'])# 预测 predicted = clf.predict(X_train_tfidf) ### 回答2: 使用贝叶斯文本分类对评论进行分类,可以通过以下代码实现,其中采用CountVectorizer进行向量化,并使用TF-IDF加权。 ```python import pandas as pd from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer from sklearn.naive_bayes import MultinomialNB from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 读取评论数据集,包含评论内容和对应的类别 data = pd.read_csv('comments.csv') # 将评论内容转换为向量表示 vectorizer = CountVectorizer() X = vectorizer.fit_transform(data['评论内容']) # 计算TF-IDF权重 tfidf_transformer = TfidfTransformer() X = tfidf_transformer.fit_transform(X) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, data['类别'], test_size=0.2, random_state=42) # 构建并训练贝叶斯分类器 clf = MultinomialNB() clf.fit(X_train, y_train) # 在测试集上进行预测 y_pred = clf.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print("模型准确率:", accuracy) ``` 以上代码使用pandas库读取评论数据集,其中包括评论内容和对应的类别。通过CountVectorizer进行向量化处理,将评论内容转换为数量特征,然后使用TfidfTransformer计算TF-IDF权重对特征进行加权。接着,使用train_test_split函数将数据集划分为训练集和测试集,其中测试集占比为20%。构建MultinomialNB贝叶斯分类器,并使用训练集进行训练。最后,对测试集进行预测,计算准确率作为模型的评估指标。 ### 回答3: 使用贝叶斯文本分类对评论进行分类的完整代码如下: ```python import pandas as pd from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import Pipeline # 加载评论数据集 df = pd.read_csv('comments.csv') # 划分特征和目标变量 X = df['comment'] y = df['label'] # 定义Pipeline,包含CountVectorizerTfidfTransformer和MultinomialNB三个步骤 pipeline = Pipeline([ ('vect', CountVectorizer()), # 将文本转换为词频矩阵 ('tfidf', TfidfTransformer()), # 对词频矩阵进行TF-IDF加权 ('clf', MultinomialNB()) # 使用朴素贝叶斯分类器进行分类 ]) # 拟合数据并进行预测 pipeline.fit(X, y) predicted = pipeline.predict(X) # 输出预测结果 for comment, label in zip(X, predicted): print(f"评论: {comment}") print(f"预测标签: {label}") print() ``` 上述代码首先导入了需要的库,包括pandas、CountVectorizerTfidfTransformer、MultinomialNB和Pipeline。然后加载评论数据集,将评论作为特征(X)和评论标签作为目标变量(y)。 接下来,定义了一个Pipeline,其中包含三个步骤。第一个步骤是CountVectorizer,用于将文本数据转换为词频矩阵;第二个步骤是TfidfTransformer,用于对词频矩阵进行TF-IDF加权;第三个步骤是MultinomialNB,使用朴素贝叶斯分类器进行分类。 然后,使用Pipeline拟合数据,并对所有评论进行预测。最后,通过循环遍历每个评论和对应的预测标签,将结果输出到控制台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值