赞
踩
20年当时自身功底是比较零基础(会写些基础的Python[三个科学计算包]数据分析),一开始看这块其实挺懵的,不会就去问百度或其他人,当时遇见困难挺害怕的,但22后面开始力扣题【目前已刷好几轮,博客没写力扣文章之前,力扣排名靠前已刷有5遍左右,排名靠后刷3次左右,代码功底也在一步一步提升】不断地刷、遇见代码不懂的代码,也开始去打印print去理解,到后面问其他人的问题越来越少,个人自主学习、自主解决能力也得到了进一步增强。
赛题以匿名处理后的新闻数据为赛题数据,数据集报名后可见并可下载。赛题数据为新闻文本,并按照字符级别进行匿名处理。整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐的文本数据。
赛题数据由以下几个部分构成:训练集20w条样本,测试集A包括5w条样本,测试集B包括5w条样本。为了预防选手人工标注测试集的情况,我们将比赛数据的文本按照字符级别进行了匿名处理。
处理后的赛题训练数据如下:
在数据集中标签的对应的关系如下:{‘科技’: 0, ‘股票’: 1, ‘体育’: 2, ‘娱乐’: 3, ‘时政’: 4, ‘社会’: 5, ‘教育’: 6, ‘财经’: 7, ‘家居’: 8, ‘游戏’: 9, ‘房产’: 10, ‘时尚’: 11, ‘彩票’: 12, ‘星座’: 13}
评价标准为类别f1_score的均值,选手提交结果与实际测试集的类别进行对比,结果越大越好。
赛题思路分析:赛题本质是一个文本分类问题,需要根据每句的字符进行分类。但赛题给出的数据是匿名化的,不能直接使用中文分词等操作,这个是赛题的难点。
因此本次赛题的难点是需要对匿名字符进行建模,进而完成文本分类的过程。由于文本数据是一种典型的非结构化数据,因此可能涉及到特征提取和分类模型两个部分。为了减低参赛难度,我们提供了一些解题思路供大家参考:
思路1:TF-IDF + 机器学习分类器
直接使用TF-IDF对文本提取特征,并使用分类器进行分类。在分类器的选择上,可以使用SVM、LR、或者XGBoost。
思路2:FastText
FastText是入门款的词向量,利用Facebook提供的FastText工具,可以快速构建出分类器。
思路3:WordVec + 深度学习分类器
WordVec是进阶款的词向量,并通过构建深度学习分类完成分类。深度学习分类的网络结构可以选择TextCNN、TextRNN或者BiLSTM。
思路4:Bert词向量
Bert是高配款的词向量,具有强大的建模学习能力。
这里使用思路1(TF-IDF + 机器学习分类器) 及 思路4(Bert词向量)
TF-IDF 分数由两部分组成:第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。
TF(t)= 该词语在当前文档出现的次数 / 当前文档中词语的总数
IDF(t)= log_e(文档总数 / 出现该词语的文档总数)
# TF-IDF + LinearSVC import numpy as np import pandas as pd from sklearn.model_selection import KFold from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import LinearSVC from sklearn.metrics import f1_score, confusion_matrix, recall_score, precision_score print("开始读取数据") train_df = pd.read_csv('train_set.csv', sep='\t') test_df = pd.read_csv('test_a.csv', sep='\t') print("结束读取数据") print("开始tfidf") tfidf = TfidfVectorizer( sublinear_tf=True, strip_accents='unicode', analyzer='word', token_pattern=r'\w{1,}', stop_words='english', ngram_range=(1,3), max_features=10000) tfidf.fit(pd.concat([train_df['text'], test_df['text']])) train_word_features = tfidf.transform(train_df['text']) test_word_features = tfidf.transform(test_df['text']) X_train = train_word_features y_train = train_df['label'] X_test = test_word_features print("结束tfidf") print("开始TF-IDF + LinearSVC") # https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html#sklearn.model_selection.KFold KF = KFold(n_splits=10, random_state=7) clf = LinearSVC() test_pred = np.zeros((X_test.shape[0], 1), int) # 存储测试集预测结果 行数:len(X_test) ,列数:1列 for KF_index, (train_index,valid_index) in enumerate(KF.split(X_train)): print('第', KF_index+1, '折交叉验证开始...') # 训练集划分 x_train_, x_valid_ = X_train[train_index], X_train[valid_index] y_train_, y_valid_ = y_train[train_index], y_train[valid_index] # 模型构建 clf.fit(x_train_, y_train_) # 模型预测 val_pred = clf.predict(x_valid_) print("LinearSVC准确率为:",f1_score(y_valid_, val_pred, average='macro')) # 保存测试集预测结果 test_pred = np.column_stack((test_pred, clf.predict(X_test))) # 将矩阵按列合并 # 取测试集中预测数量最多的数 preds = [] for i, test_list in enumerate(test_pred): preds.append(np.argmax(np.bincount(test_list))) preds = np.array(preds) result = pd.DataFrame(preds, columns=['label']) result.to_csv("TFIDF_LinearSVC_submission_0304.csv", encoding='gbk', index=False) print("结束TF-IDF + LinearSVC")
score:0.9410
# https://github.com/Goldgaruda/Tianchi-NLP-News-Text-Classification-Rank-5-solution/blob/main/tfidf/cv.py import numpy as np import pandas as pd from sklearn.model_selection import KFold from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics import f1_score from lightgbm import LGBMClassifier print("开始读取数据") train_df = pd.read_csv('train_set.csv', sep='\t') test_df = pd.read_csv('test_a.csv', sep='\t') print("结束读取数据") print("开始tfidf") tfidf = TfidfVectorizer( sublinear_tf=True, strip_accents='unicode', analyzer='word', token_pattern=r'\w{1,}', stop_words='english', ngram_range=(1,3), max_features=10000) print('train_df.head():', train_df.head()) tfidf.fit(np.concatenate((train_df['text'].iloc[:].values,test_df['text'].iloc[:].values),axis=0)) train_word_features = tfidf.transform(train_df['text'].iloc[:].values) test_word_features = tfidf.transform(test_df['text'].iloc[:].values) X_train = train_word_features y_train = train_df['label'] X_test = test_word_features print("开始tfidf") print("开始TF-IDF + LGBMClassifier") KF = KFold(n_splits=5, random_state=7) clf = LGBMClassifier(n_jobs=-1, feature_fraction=0.7, bagging_fraction=0.4, lambda_l1=0.001, lambda_l2=0.01, n_estimators=600) # 存储测试集预测结果 行数:len(X_test) ,列数:1列 test_pred = np.zeros((X_test.shape[0], 1), int) for KF_index, (train_index,valid_index) in enumerate(KF.split(X_train)): print('第', KF_index+1, '折交叉验证开始...') # 训练集划分 x_train_, x_valid_ = X_train[train_index], X_train[valid_index] y_train_, y_valid_ = y_train[train_index], y_train[valid_index] # 模型构建 clf.fit(x_train_, y_train_) # 模型预测 val_pred = clf.predict(x_valid_) print("LGBMClassifier准确率为:",f1_score(y_valid_, val_pred, average='macro')) # 保存测试集预测结果 test_pred = np.column_stack((test_pred, clf.predict(X_test))) # 将矩阵按列合并 # 取测试集中预测数量最多的数 preds = [] for i, test_list in enumerate(test_pred): preds.append(np.argmax(np.bincount(test_list))) preds = np.array(preds) result = pd.DataFrame(preds, columns=['label']) result.to_csv("TFIDF_LGBMClassifier_submission_0304.csv", encoding='gbk', index=False) print("结束TF-IDF + LGBMClassifier")
score:0.9509
比赛源自:阿里云天池大赛 - 零基础入门NLP - 新闻文本分类
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。