96SEO 2026-02-19 20:08 15
竞赛的数据集中训练集有7613个样本测试集有3263个样本。

训练集中的target用于标识推文是否属于灾难推文1表示灾难推文0表示非灾难推文最终任务是判断测试集中的推文样本是否为灾难推文评估指标是F1值详细竞赛信息见竞赛官网。
竞赛使用的模型是DistilBert由于DIstilBERT是
TensorFlow本文的代码基于PyTorch。
提交代码后最终评分F1值为0.82071排名242提交时间2024年10月24日。
所使用的代码已上传值Gitee点击直达。
/usr/share/nltk_data/corpora/wordnet.zip
/usr/share/nltk_data/corpora/安装en_core_web_sm要求python版本需3.9
https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.2.5/en_core_web_sm-2.2.5.tar.gzen_core_web_sm
版本太高2.x导致不兼容的问题需降到1.x降到1.x之后又有问题报错如下
incompatible.查阅后发现blis是spacy中的一个依赖库且我的spacy版本过高3.8.2需要降到2.3.5才行此时numpy1.24.4才能用。
/usr/share/nltk_data/corpora/wordnet.zip
get_linear_schedule_with_warmup
warnings.filterwarnings(ignore)train
pd.read_csv(D:/Desktop/kaggle数据集/nlp-disaster/train.csv)
pd.read_csv(D:/Desktop/kaggle数据集/nlp-disaster/test.csv)
print(训练集大小{}.format(train.shape))
print(测试集大小{}.format(test.shape))训练集大小(7613,
定义函数数据处理函数包扩小写转换、移除停用词、移除网址、移除标点和特殊符号、词形还原。
统计词频发现amp;出现的频率很高且该符号仅表示html标签中的符所以需移除。
get_wordnet_pos(word):#----------------------------------------------------------------------------------------##
最后将词性标签取其首字母并转换为大写#----------------------------------------------------------------------------------------#tag
nltk.pos_tag([word])[0][1][0].upper()tag_dict
wordnet.ADV}#----------------------------------------------------------------------------------------##
wordnet.NOUN名词#----------------------------------------------------------------------------------------#return
df[column].progress_apply(lambda
df[column].progress_apply(lambda
.join(...)将经过过滤后的单词列表重新连接成一个字符串单词之间用空格分隔df[column]
df[column].progress_apply(lambda
stop_words]))#----------------------------------------------------------------------------------------##
是要处理的文本#----------------------------------------------------------------------------------------#df[column]
df[column].progress_apply(lambda
df[column].progress_apply(lambda
df[column].progress_apply(lambda
.join([lemmatizer.lemmatize(word,
text_preprocessing(train_cleaned,text)注由于初始安装的
train_cleaned.loc[train_cleaned[target]
表示生成的词云图的宽度和高度尽量与figsize保持比例一致避免出现图形的拉伸和压缩
background_colorwhite).generate(disaster_strings)
np.array(Image.open(./twitter_mask.jpg))
train_cleaned.loc[train_cleaned[target]
#--------------------------------------------------------------------------------------------------------------------------------#
表示生成的词云图的宽度和高度尽量与figsize保持比例一致避免出现图形的拉伸和压缩
#--------------------------------------------------------------------------------------------------------------------------------#
background_colorwhite,stopwordsset()).generate(not_disaster_strings)
sns.boxplot(xtarget,ytrain_sent,datatrain,
plt.show()由图可知灾难推文的字符整体上比非灾难推文的字符多这是因为灾难推文大多来自新闻机构所以推文编写更正式字数更长。
而非灾难推文大多来自个人用户内容较少且拼写错误较多。
train[text].str.split().map(lambda
plt.show()灾难推文的词数比非灾难推文的词数略多一点点。
stop_word_count,mean_word_length,char_count]
enumerate(METAFEATURES):#----------------------------------------------------------------------------------------##
statdensity绘制概率密度分布比直方图更容易观察数据的分布聚集情况#
代替#----------------------------------------------------------------------------------------#sns.histplot(xtrain_data.loc[~DISASTER_TWEETS][feature],
kdeTrue)sns.histplot(xtrain_data.loc[DISASTER_TWEETS][feature],
kdeTrue)sns.histplot(train_data[feature],
statdensity)sns.histplot(test_data[feature],
range(2):axes[i][j].set_xlabel()axes[i][j].legend()axes[i][0].set_title(f{feature}
Set)axes[i][1].set_title(f{feature}
Distribution)plt.show()运行结果原图太长截取局部
由图可知词数、唯一词数量和平均词长度均大致服从正态分布。
且所有元特征在
print(f灾难推文数量{(train[target]1).sum()})
print(f非灾难推文数量{(train[target]0).sum()})fig,
axes[0].pie(train_data.groupby(target).count()[id],
sns.countplot(xtrain_data[target],
(3271)])axes[0].set_title(Target
统计灾难推文和非灾难推文中出现频次较高的词Unigrams一元语法
[train_cleaned[train_cleaned[target]
0][text],train_cleaned[train_cleaned[target]
new.values.tolist()#----------------------------------------------------------------------------------------##
word#----------------------------------------------------------------------------------------#corpus
most[:30]:x.append(word)y.append(count)sns.barplot(xy,
Tweets)axes[0].set_xlabel(Count)
sklearn.feature_extraction.text
Paramsn需要统计的词组的次词数title统计图标题def
n),stop_wordsenglish)#----------------------------------------------------------------------------------------##
fit_transform()首先对传入的文本进行分词根据空格和标点符号将文本拆分为词汇#
最后返回一个稀疏矩阵仅存储非零元素#----------------------------------------------------------------------------------------#bag_of_words
bag_of_words.sum(axis0)#----------------------------------------------------------------------------------------##
vocabulary_是一个字典包含了模型中识别的所有词单元或多元的映射。
#
这个字典的键是词或词组值是对应的列索引索引位置#----------------------------------------------------------------------------------------#words_freq
vectorizer.vocabulary_.items()]#
zip(*top_n_bigrams))sns.barplot(xy,
Tweets)axes[1].set_title(Disaster
Tweets)axes[0].set_xlabel(Count)axes[0].set_ylabel(Words)axes[1].set_xlabel(Count)axes[1].set_ylabel(Words)fig.suptitle(title,
vabaseline)plt.subplots_adjust(wspace0.5)ngrams(2,
NER是一种自然语言处理技术用于识别文本中具有特定意义的实体通常包括人名、地名、组织名、日期、时间、货币等。
_get_ner(i):#----------------------------------------------------------------------------------------##
对象包含了对输入文本的各种分析和处理结果#----------------------------------------------------------------------------------------#doc
counter.most_common()[:15]#----------------------------------------------------------------------------------------##
将成为包含对应频率的列表#----------------------------------------------------------------------------------------#x,
paletteplasma)axes[0].set_title(Non
axes[0].set_ylabel(Named-Entity)
axes[1].set_ylabel(Named-Entity)
#----------------------------------------------------------------------------------------#
#----------------------------------------------------------------------------------------#
borderaxespad0.)可以发现在灾难推文中GPE实体中的国家、城市、州比非灾难推文更常见。
此外国籍或宗教或政治团体名称更有可能在灾难推文中被提及。
Frequency词频-逆文档频率是一种用于信息检索与数据挖掘的常用加权技。
TF-IDF
能够减少高频词的影响通过计算词频TF和逆文档频率IDF的乘积来评估一个词对于一个文档集或语料库的重要程度。
NMF输出10个主题的前10个关键词主题的类型和内容由训练过程中的数据决定
输出的主题词数量按权重排序由大到小输出topic推文类型def
topic):#----------------------------------------------------------------------------------------##
使用逆文档频率IDF加权#----------------------------------------------------------------------------------------#tfidf_vectorizer
tfidf_vectorizer.fit_transform(text)#
tfidf_vectorizer.get_feature_names_out()#----------------------------------------------------------------------------------------##
使用非负奇异值分解作为初始化算法#----------------------------------------------------------------------------------------#nmf
random_state0,initnndsvd).fit(tfidf)print(topic)#----------------------------------------------------------------------------------------##
-1切片的方向为从右到左#----------------------------------------------------------------------------------------#for
enumerate(nmf.components_):print(Topic
mass由主题词可知灾难主题的关键词较为明显而非灾难主题则是更个人化的话题。
Transformers双向编码器表征法是一种基于Transformer架构的预训练语言模型能够有效捕捉文本中的上下文关系理解句子的语义。
这里选择使用
BERT指导较小的学生模型DistilBERT学习从而有效保留了大量的语言理解能力。
DistilBERT的参数比
torch.cuda.device_count())print(We
DistilBertForSequenceClassification
DistilBertTokenizer.from_pretrained(model_name)
DistilBertForSequenceClassification.from_pretrained(model_name,
#--------------------------------------------------------------------------------------------------------------------------------#
#--------------------------------------------------------------------------------------------------------------------------------#
tokenizer(texttrain[text].tolist(),add_special_tokensTrue,max_length31,truncationTrue,paddingTrue,
return_tensorspt,return_token_type_ids
True)X[input_ids].shapetorch.Size([7613,
31])封装数据集时训练集中的shuffle参数设置为True随机打乱数据可以防止模型学习到数据的顺序从而提高模型的泛化能力验证集和测试集shuffle参数设置为False能够保证测试集预测结果的一致性和可比性。
torch.tensor(X[attention_mask])
torch.tensor(train[target].values)
print(f训练集大小{len(train_inputs)})
print(f验证集大小{len(val_inputs)})定义功能函数
str(datetime.timedelta(secondselapsed_rounded))
Returnsavg_train_loss本轮次遍历一遍训练集的平均损失avg_train_accuracy本轮次遍历一遍训练集准确率def
设置模型为训练模式model.train()total_train_accuracy
enumerate(train_dataloader):b_input_ids
batch[0].to(device).to(torch.int64)b_input_mask
batch[1].to(device).to(torch.int64)b_labels
batch[2].to(device).to(torch.int64)#
清除上一次迭代的梯度信息防止梯度累积model.zero_grad()
#-------------------------------------------------------------------------------------------------##
logits而一般的神经网络只有logits#-------------------------------------------------------------------------------------------------#outputs
loss.item()#-------------------------------------------------------------------------------------------------##
instead.#-------------------------------------------------------------------------------------------------#logits
logits.detach().cpu().numpy()label_ids
b_labels.cpu().numpy()#-------------------------------------------------------------------------------------------------##
随后优化器会使用这些梯度来更新模型参数从而逐步最小化损失函数实现模型的训练#-------------------------------------------------------------------------------------------------#loss.backward()#
clip_grad_norm_(model.parameters(),
1.0torch.nn.utils.clip_grad_norm_(model.parameters(),
计算该step的准确率total_train_accuracy
len(train_dataloader)avg_train_loss
Returnsavg_val_accuracy本轮次遍历一遍验证集的平均损失avg_val_loss本轮次遍历一遍验证集准确率avg_val_f1本轮次遍历一遍验证集的
设置模型为测试模式model.eval()total_val_loss
validation_dataloader:b_input_ids
batch[0].to(device)b_input_mask
#-------------------------------------------------------------------------------------------------##
logits而一般的神经网络只有logits#-------------------------------------------------------------------------------------------------#outputs
loss.item()#-------------------------------------------------------------------------------------------------##
CPU#-------------------------------------------------------------------------------------------------#logits
len(validation_dataloader)avg_val_f1
len(validation_dataloader)avg_val_loss
len(validation_dataloader)return
get_linear_schedule_with_warmup(optimizer,
optimizer)#-------------------------------------------------------------------------------------------------##
将可迭代对象中的每个元素逐个添加到列表中#-------------------------------------------------------------------------------------------------#train_accuracies.append(train_accuracy)train_losses.append(train_loss)#
validation_dataloader)val_accuracies.append(val_accuracy)val_f1s.append(val_f1)val_losses.append(val_loss)print([第{}轮训练完成训练集中
val_accuracies):plt.figure(figsize(12,
Loss)plt.xlabel(Epoch)plt.ylabel(Loss)plt.legend()plt.subplot(1,
Accuracy)plt.plot(val_accuracies,
Accuracy)plt.xlabel(Epoch)plt.ylabel(Accuracy)plt.legend()loss_acc_plot(train_losses,
plt.ylabel(F1);注在本地CPU跑的F1值在0.77左右但是在kaggle中GPU跑的F1值在0.8左右原因未知。
validation_dataloader:b_input_ids
batch[0].to(device)b_input_mask
#-------------------------------------------------------------------------------------------------##
logits而一般的神经网络只有logits#-------------------------------------------------------------------------------------------------#outputs
#-------------------------------------------------------------------------------------------------##
CPU#-------------------------------------------------------------------------------------------------#logits
b_labels.cpu().numpy()all_labels.extend(label_ids)predicted
axis1).flatten()all_predictions.extend(predicted)cm
Matrix);横轴为预测类别纵轴为实际类别。
对标线上的值表示模型正确预测的样本数量非对角线上的值表示模型错误预测的样本数量。
tokenizer(texttest[text].tolist(),add_special_tokensTrue,max_length31,truncationTrue,paddingTrue,
return_tensorspt,return_token_type_ids
torch.tensor(X_test[input_ids])
torch.tensor(X_test[attention_mask])#
batch[0].to(device)b_input_mask
#-------------------------------------------------------------------------------------------------##
logits而一般的神经网络只有logits#-------------------------------------------------------------------------------------------------#outputs
attention_maskb_input_mask)loss
axis1)all_test_pred.extend(np.argmax(logits,
pd.read_csv(D:/Desktop/kaggle数据集/nlp-disaster/sample_submission.csv)
submission.to_csv(/kaggle/working/submission.csv,
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback