一文概览NLP算法(Python)(下)

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: 一文概览NLP算法(Python)

2.6 相似度算法(句子关系的任务)


自然语言处理任务中,我们经常需要判断两篇文档的相似程度(句子关系),比如检索系统输出最相关的文本,推荐系统推荐相似的文章。文本相似度匹配常用到的方法有:文本编辑距离、WMD、 BM2.5、词向量相似度 、Approximate Nearest Neighbor以及一些有监督的(神经网络)模型判断文本间相似度。



2.7 文本分类任务


文本分类是经典的NLP任务,就是将文本系列对应预测到类别。


  • 一种是输入序列输出这整个序列的类别,如短信息、微博分类、意图识别等。


  • 另一种是输入序列输出序列上每个位置的类别,上文提及的系列标注可以看做为词粒度的一种分类任务,如实体命名识别。


分类任务使用预训练+(神经网络)分类模型的端对端学习是主流,深度学习学习特征的表达然后进行分类,大大减少人工的特征。但以实际项目中的经验来看,对于一些困难任务(任务的噪声大),加入些人工的特征工程还是很有必要的。



2.8 文本生成任务


文本生成也就是由类别生成序列 或者 由序列到序列的预测任务。按照不同的输入划分,文本自动生成可包括文本到文本的生成(text-to-text generation)、意义到文本的生成(meaning-to-text generation)、数据到文本的生成(data-to-text generation)以及图像到文本的生成(image-to-text generation)等。具体应用如机器翻译、文本摘要理解、阅读理解、闲聊对话、写作、看图说话。常用的模型如RNN、CNN、seq2seq、Transformer。



同样的,基于大规模预训练模型的文本生成也是一大热门,可见《A Survey of Pretrained Language Models Based Text Generation》


三、垃圾短信文本分类实战


3.1 读取短信文本数据并展示


本项目是通过有监督的短信文本,学习一个垃圾短信文本分类模型。数据样本总的有5572条,label有spam(垃圾短信)和ham两种,是一个典型类别不均衡的二分类问题。



#源码可见https://github.com/aialgorithm/Blog importpandasaspd importnumpyasnp importmatplotlib.pyplotasplt spam_df=pd.read_csv('./data/spam.csv',header=0,encoding="ISO-8859-1") #数据展示 _,ax=plt.subplots(1,2,figsize=(10,5)) spam_df['label'].value_counts().plot(ax=ax[0],kind="bar",rot=90,title='label'); spam_df['label'].value_counts().plot(ax=ax[1],kind="pie",rot=90,title='label',ylabel=''); print("Datasetsize:",spam_df.shape) spam_df.head(5)


3.2 数据清洗预处理


数据清洗在于去除一些噪声信息,这里对短信文本做按空格分词,统一大小写,清洗非英文字符,去掉停用词并做了词干还原。考虑到短信文本里面的数字位数可能有一定的含义,这里将数字替换为‘x’的处理。最后,将标签统一为数值(0、1)是否垃圾短信。


#导入相关的库 importnltk fromnltkimportword_tokenize fromnltk.corpusimportstopwords fromnltk.dataimportload fromnltk.stemimportSnowballStemmer fromstringimportpunctuation importre#正则匹配 stop_words=set(stopwords.words('english')) non_words=list(punctuation) #词形、词干还原 #fromnltk.stemimportWordNetLemmatizer #wnl=WordNetLemmatizer() stemmer=SnowballStemmer('english') defstem_tokens(tokens,stemmer): stems=[] fortokenintokens: stems.append(stemmer.stem(token)) returnstems ###清除非英文词汇并替换数值x defclean_non_english_xdig(txt,isstem=True,gettok=True): txt=re.sub('[0-9]','x',txt)#去数字替换为x txt=txt.lower()#统一小写 txt=re.sub('[^a-zA-Z]','',txt)#去除非英文字符并替换为空格 word_tokens=word_tokenize(txt)#分词 ifnotisstem:#是否做词干还原 filtered_word=[wforwinword_tokensifnotwinstop_words]#删除停用词 else: filtered_word=[stemmer.stem(w)forwinword_tokensifnotwinstop_words]#删除停用词及词干还原 ifgettok:#返回为字符串或分词列表 returnfiltered_word else: return"".join(filtered_word) spam_df['token']=spam_df.message.apply(lambdax:clean_non_english_xdig(x)) spam_df.head(3) #数据清洗 spam_df['token']=spam_df.message.apply(lambdax:clean_non_english_xdig(x)) #标签整数编码 spam_df['label']=(spam_df.label=='spam').astype(int) spam_df.head(3)



3.3 fasttext词向量表示学习


我们需要将单词文本转化为数值的词向量才能输入模型。词向量表示常用的词袋、fasttext、bert等方法,这里训练的是fasttext,模型的主要输入参数是,输入分词后的语料(通常训练语料越多越好,当现有语料有限时候,直接拿github上合适的大规模预训练模型来做词向量也是不错的选择),词向量的维度size(一个经验的词向量维度设定是,dim > 8.33 logN, N为词汇表的大小,当维度dim足够大才能表达好这N规模的词汇表的含义。可参考《# 最小熵原理(六):词向量的维度应该怎么选择?By 苏剑林》)。语料太大的时候可以使用workers开启多进程训练(其他参数及词表示学习原理后续会专题介绍,也可以自行了解)。


#训练词向量Fasttextembed模型 fromgensim.modelsimportFastText,word2vec fmodel=FastText(spam_df.token,size=100,sg=1,window=3,min_count=1,iter=10,min_n=3,max_n=6,word_ngrams=1,workers=12) print(fmodel.wv['hello'])#输出hello的词向量 #fmodel.save('./data/fasttext100dim')



按照句子所有的词向量取平均,为每一句子生成句向量。


fmodel=FastText.load('./data/fasttext100dim') #对每个句子的所有词向量取均值,来生成一个句子的vector defbuild_sentence_vector(sentence,w2v_model,size=100): sen_vec=np.zeros((size,)) count=0 forwordinsentence: try: sen_vec+=w2v_model[word]#.reshape((1,size)) count+=1 exceptKeyError: continue ifcount!=0: sen_vec/=count returnsen_vec #句向量 sents_vec=[] forsentinspam_df['token']: sents_vec.append(build_sentence_vector(sent,fmodel,size=100))

print(len(sents_vec))


3.4 训练文本分类模型


示例采用的fasttext embedding + lightgbm的二分类模型,类别不均衡使用lgb代价敏感学习解决(即class_weight='balanced'),超参数是手动简单配置的,可以自行搜索下较优超参数。


###训练文本分类模型 fromsklearn.model_selectionimporttrain_test_split fromlightgbmimportLGBMClassifier fromsklearn.linear_modelimportLogisticRegression train_x,test_x,train_y,test_y=train_test_split(sents_vec,spam_df.label,test_size=0.2,shuffle=True,random_state=42) result=[] clf=LGBMClassifier(class_weight='balanced',n_estimators=300,num_leaves=64,reg_alpha=1,reg_lambda=1,random_state=42) #clf=LogisticRegression(class_weight='balanced',random_state=42) clf.fit(train_x,train_y) importpickle #保存模型 pickle.dump(clf,open('./saved_models/spam_clf.pkl','wb')) #加载模型 model=pickle.load(open('./saved_models/spam_clf.pkl','rb'))


3.5 模型评估


训练集测试集按0.2划分,分布验证训练集测试集的AUC、F1score等指标,均有不错的表现。



fromsklearn.metricsimportauc,roc_curve,f1_score,precision_score,recall_score defmodel_metrics(model,x,y,tp='auc'): """评估""" yhat=model.predict(x) yprob=model.predict_proba(x)[:,1] fpr,tpr,_=roc_curve(y,yprob,pos_label=1) metrics={'AUC':auc(fpr,tpr),'KS':max(tpr-fpr), 'f1':f1_score(y,yhat),'P':precision_score(y,yhat),'R':recall_score(y,yhat)} roc_auc=auc(fpr,tpr) plt.plot(fpr,tpr,'k--',label='ROC(area={0:.2f})'.format(roc_auc),lw=2) plt.xlim([-0.05,1.05])#设置x、y轴的上下限,以免和边缘重合,更好的观察图像的整体 plt.ylim([-0.05,1.05]) plt.xlabel('FalsePositiveRate') plt.ylabel('TruePositiveRate')#可以使用中文,但需要导入一些库即字体 plt.title('ROCCurve') plt.legend(loc="lowerright") returnmetrics print('train',model_metrics(clf,train_x,train_y,tp='ks')) print('test',model_metrics(clf,test_x,test_y,tp='ks'))

相关文章
|
2月前
|
存储 监控 算法
企业数据泄露风险防控视域下 Python 布隆过滤器算法的应用研究 —— 怎样防止员工私下接单,监控为例
本文探讨了布隆过滤器在企业员工行为监控中的应用。布隆过滤器是一种高效概率数据结构,具有空间复杂度低、查询速度快的特点,适用于大规模数据过滤场景。文章分析了其在网络访问监控和通讯内容筛查中的实践价值,并通过Python实现示例展示其技术优势。同时,文中指出布隆过滤器存在误判风险,需在准确性和资源消耗间权衡。最后强调构建多维度监控体系的重要性,结合技术与管理手段保障企业运营安全。
66 10
|
2月前
|
算法 Python
Apriori算法的Python实例演示
经过运行,你会看到一些集合出现,每个集合的支持度也会给出。这些集合就是你想要的,经常一起被购买的商品组合。不要忘记,`min_support`参数将决定频繁项集的数量和大小,你可以根据自己的需要进行更改。
117 18
|
2月前
|
存储 机器学习/深度学习 算法
论上网限制软件中 Python 动态衰减权重算法于行为管控领域的创新性应用
在网络安全与行为管理的学术语境中,上网限制软件面临着精准识别并管控用户不合规网络请求的复杂任务。传统的基于静态规则库或固定阈值的策略,在实践中暴露出较高的误判率与较差的动态适应性。本研究引入一种基于 “动态衰减权重算法” 的优化策略,融合时间序列分析与权重衰减机制,旨在显著提升上网限制软件的实时决策效能。
71 2
|
3月前
|
算法 数据可视化 Python
Python中利用遗传算法探索迷宫出路
本文探讨了如何利用Python和遗传算法解决迷宫问题。迷宫建模通过二维数组实现,0表示通路,1为墙壁,'S'和'E'分别代表起点与终点。遗传算法的核心包括个体编码(路径方向序列)、适应度函数(评估路径有效性)、选择、交叉和变异操作。通过迭代优化,算法逐步生成更优路径,最终找到从起点到终点的最佳解决方案。文末还展示了结果可视化方法及遗传算法的应用前景。
|
3月前
|
存储 监控 算法
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
95 7
|
3月前
|
存储 监控 算法
员工电脑监控场景下 Python 红黑树算法的深度解析
在当代企业管理范式中,员工电脑监控业已成为一种广泛采用的策略性手段,其核心目标在于维护企业信息安全、提升工作效能并确保合规性。借助对员工电脑操作的实时监测机制,企业能够敏锐洞察潜在风险,诸如数据泄露、恶意软件侵袭等威胁。而员工电脑监控系统的高效运作,高度依赖于底层的数据结构与算法架构。本文旨在深入探究红黑树(Red - Black Tree)这一数据结构在员工电脑监控领域的应用,并通过 Python 代码实例详尽阐释其实现机制。
82 7
|
3月前
|
运维 监控 算法
基于 Python 迪杰斯特拉算法的局域网计算机监控技术探究
信息技术高速演进的当下,局域网计算机监控对于保障企业网络安全、优化资源配置以及提升整体运行效能具有关键意义。通过实时监测网络状态、追踪计算机活动,企业得以及时察觉潜在风险并采取相应举措。在这一复杂的监控体系背后,数据结构与算法发挥着不可或缺的作用。本文将聚焦于迪杰斯特拉(Dijkstra)算法,深入探究其在局域网计算机监控中的应用,并借助 Python 代码示例予以详细阐释。
87 6
|
4月前
|
人工智能 编解码 算法
如何在Python下实现摄像头|屏幕|AI视觉算法数据的RTMP直播推送
本文详细讲解了在Python环境下使用大牛直播SDK实现RTMP推流的过程。从技术背景到代码实现,涵盖Python生态优势、AI视觉算法应用、RTMP稳定性及跨平台支持等内容。通过丰富功能如音频编码、视频编码、实时预览等,结合实际代码示例,为开发者提供完整指南。同时探讨C接口转换Python时的注意事项,包括数据类型映射、内存管理、回调函数等关键点。最终总结Python在RTMP推流与AI视觉算法结合中的重要性与前景,为行业应用带来便利与革新。
195 5
|
4月前
|
存储 监控 算法
基于 Python 哈希表算法的员工上网管理策略研究
于当下数字化办公环境而言,员工上网管理已成为企业运营管理的关键环节。企业有必要对员工的网络访问行为予以监控,以此确保信息安全并提升工作效率。在处理员工上网管理相关数据时,适宜的数据结构与算法起着举足轻重的作用。本文将深入探究哈希表这一数据结构在员工上网管理场景中的应用,并借助 Python 代码示例展开详尽阐述。
73 3
|
4月前
|
人工智能 监控 算法
Python下的毫秒级延迟RTSP|RTMP播放器技术探究和AI视觉算法对接
本文深入解析了基于Python实现的RTSP/RTMP播放器,探讨其代码结构、实现原理及优化策略。播放器通过大牛直播SDK提供的接口,支持低延迟播放,适用于实时监控、视频会议和智能分析等场景。文章详细介绍了播放控制、硬件解码、录像与截图功能,并分析了回调机制和UI设计。此外,还讨论了性能优化方法(如硬件加速、异步处理)和功能扩展(如音量调节、多格式支持)。针对AI视觉算法对接,文章提供了YUV/RGB数据处理示例,便于开发者在Python环境下进行算法集成。最终,播放器凭借低延迟、高兼容性和灵活扩展性,为实时交互场景提供了高效解决方案。
251 4

热门文章

最新文章

推荐镜像

更多