失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 文本特征提取之TF-IDF算法(原理+Python代码)

文本特征提取之TF-IDF算法(原理+Python代码)

时间:2024-01-29 18:19:48

相关推荐

文本特征提取之TF-IDF算法(原理+Python代码)

数据来源于天池赛题:零基础入门数据分析-学术前沿趋势分析

目录

一、原理介绍二、代码实现2.1数据预处理2.2使用TF-IDF提取特征2.3建立分类模型三、结果解释

一、原理介绍

TF-IDF方法常用来评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。在一个特定文件中,当某类词语出现的频率较高,同时该类词语在整个语料库中出现频率较低时,该类词语的TF-IDF就会比较高。

TF-IDF在中文中指词频-逆向文件频率,由TF(词频)和IDF(逆向文件频率)两个部分组成。

其中,TF(词频)指的是某一个给定的词语在该文件中出现的次数,TF的计算公式为:

TFw=在某一类中词条w出现的次数该类中所有的词条数目TF_{w}=\frac{在某一类中词条w出现的次数}{该类中所有的词条数目} TFw​=该类中所有的词条数目在某一类中词条w出现的次数​

IDF(逆向文件频率)的主要思想是:如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。TDF的计算公式为:

IDF=log(语料库的文档总数包含词条w的文档数+1)IDF=log\left ( \frac{语料库的文档总数}{包含词条w的文档数+1}\right )IDF=log(包含词条w的文档数+1语料库的文档总数​)

公式中分母之所以要加1,是为了避免分母为0

这里通过对计算机领域论文的标题和摘要进行文本特征提取,并根据这些文本特征来训练多分类模型,以此来识别不同类型的论文。

二、代码实现

# 导入所需的packageimport seaborn as sns #用于画图from bs4 import BeautifulSoup #用于爬取arxiv的数据import re #用于正则表达式,匹配字符串的模式import requests #用于网络连接,发送网络请求,使用域名获取对应信息import json #读取数据,我们的数据为json格式的import pandas as pd #数据处理,数据分析import matplotlib.pyplot as plt #画图工具import warningswarnings.filterwarnings("ignore") #过滤掉警告的意思from pyforest import *

#定义读取文本数据的函数def readArxivFile(path, columns=['id', 'submitter', 'authors', 'title', 'comments', 'journal-ref', 'doi','report-no', 'categories', 'license', 'abstract', 'versions','update_date', 'authors_parsed'], count=None):'''定义读取文件的函数path: 文件路径columns: 需要选择的列count: 读取行数'''data = []with open(path, 'r') as f: for idx, line in enumerate(f): if idx == count:breakd = json.loads(line)d = {col : d[col] for col in columns}data.append(d)data = pd.DataFrame(data)return datadata = readArxivFile('F:/data/arxiv-metadata-oai-.json', ['id', 'title', 'categories', 'abstract'],200000)

#查看数据前五行data.head()

2.1数据预处理

#将数据中的'title'列与'abstract'列进行合并,便于后续分类模型的训练data['text'] = data['title'] + data['abstract']data['text'] = data['text'].apply(lambda x: x.replace('\n',' '))data['text'] = data['text'].apply(lambda x: x.lower())data = data.drop(['abstract', 'title'], axis=1) #删除原有的列

#对数据中的多个类别和单个类别进行处理# 多个类别,包含子分类data['categories'] = data['categories'].apply(lambda x : x.split(' '))# 单个类别,不包含子分类data['categories_big'] = data['categories'].apply(lambda x : [xx.split('.')[0] for xx in x])

#对数据进行类别编码from sklearn.preprocessing import MultiLabelBinarizermlb = MultiLabelBinarizer()data_label = mlb.fit_transform(data['categories_big'].iloc[:])

data_label.shape

(170618, 34)

2.2使用TF-IDF提取特征

from sklearn.feature_extraction.text import TfidfVectorizervectorizer = TfidfVectorizer(max_features=4000) #提取特征,限定特征提取数量不超过4000个vectorizer

TfidfVectorizer(analyzer=‘word’, binary=False, decode_error=‘strict’,

dtype=<class ‘numpy.float64’>, encoding=‘utf-8’,

input=‘content’, lowercase=True, max_df=1.0, max_features=4000,

min_df=1, ngram_range=(1, 1), norm=‘l2’, preprocessor=None,

smooth_idf=True, stop_words=None, strip_accents=None,

sublinear_tf=False, token_pattern=’(?u)\b\w\w+\b’,

tokenizer=None, use_idf=True, vocabulary=None)

data_tfidf = vectorizer.fit_transform(data['text'].iloc[:])

2.3建立分类模型

# 划分训练集和验证集from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(data_tfidf, data_label,test_size = 0.2,random_state = 1)

# 构建多标签分类模型#这里使用先验为多项式分布的朴素贝叶斯模型from sklearn.multioutput import MultiOutputClassifierfrom sklearn.naive_bayes import MultinomialNB clf = MultiOutputClassifier(MultinomialNB()).fit(x_train, y_train)clf

MultiOutputClassifier(estimator=MultinomialNB(alpha=1.0, class_prior=None,

fit_prior=True),

n_jobs=None)

#评估模型拟合效果,输出分类模型报告from sklearn.metrics import classification_reportprint(classification_report(y_test, clf.predict(x_test)))

precision recall f1-score support0 0.000.000.00 01 0.000.000.00 12 0.000.000.00 03 0.910.850.8836254 0.000.000.00 45 0.000.000.00 06 0.000.000.00 17 0.000.000.00 08 0.770.760.7738019 0.840.890.861071510 0.000.000.00 011 0.000.000.00 18612 0.440.410.42162113 0.000.000.00 114 0.750.590.66109615 0.610.800.69107816 0.900.190.32 24217 0.530.670.59145118 0.710.540.62140019 0.880.840.861024320 0.400.090.15 93421 0.000.000.00 122 0.870.030.06 41423 0.480.650.55 51724 0.370.330.35 53925 0.000.000.00 126 0.600.420.49389127 0.000.000.00 028 0.820.080.15 67629 0.860.120.21 29730 0.800.400.53171431 0.000.000.00 432 0.560.650.60339833 0.000.000.00 0micro avg 0.760.700.7247851macro avg 0.390.270.2947851weighted avg 0.750.700.7147851samples avg 0.740.760.7247851

三、结果解释

在上面文本分类模型的评估结果中,precision表示查准率,recall表示查全率,f1-score表示F1值,support表示准确分类的论文数量。从评估结果可以看出,在模型训练的33个类别中,不同类别上的准确率差异很大。平均而言,准确率有百分之七十多。

如果觉得《文本特征提取之TF-IDF算法(原理+Python代码)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。