应用自然语言处理(NLP)解码电影
Applying Natural Language Processing to Decode a Movie
原文作者:Ritesh Sinha
原文地址:https://dzone.com/articles/applying-nlp-to-decode-an-indian-classical-movie-s
译者微博:@从流域到海域
译者博客:blog.csdn.net/solo95
这篇文章的目标是运用自然语言处理来理解印度经典电影“ 肖莱”中的各种人物之间的关系 。使用的文本取自Sholay的维基页面,只采用前三个段落用于更好地理解文章内容。本文的重点是方法而不是准确性,所以使用了较小的数据集。对NLP领域中各种方法的准确性感兴趣的读者可以看看这篇文章。
(Word embedding全部译为单词嵌入, 这篇文章多处出现words,有时指单词,有时指文字,请读者注意,译者注。)
背景
近年来,在向量空间中表示单词的各种方法已经出现,已被证明在捕捉句法(语法结构)和语义(含义)细节方面是极其有效的。单词嵌入是辅助NLP相关任务的技术之一。
在构成输入表示时,单词和短语嵌入已经被证明可以显著提高NLP的性能。
根据Wikipedia的这篇文章:
单词嵌入 是自然语言处理(NLP)中的一组语言建模和特征学习技术的总称,它把来自单词表的词或词组被映射到实数的向量上。
发现单词向量在解释关系方面表现相当好。从以下图像可以清楚看出。
这是一个有用的单词向量功能,他们能够解释如下关系:
vector(King) - vector(Queen) = vector(Man) - vector(Woman)
其中一个著名的方法是Mikolov等人的Word2Vec,它已经取得了很好的成功。这是由Google的研究人员完成的。
另外还有一个叫做GloVe (全局向量)的著名方法 ,由Jeffrey Pennington,Richard Socher和Christopher D. Manning在斯坦福大学开发,在某些情况下表现更好。
上述两种模式都遵循这个方法:一个词被保存它的公司(company)所知晓。
注:还有其他的方法,这些方法已经被广泛的使用,并且对NLP的发展做出了贡献,这里不进行讨论。
单词向量表示(Word Vector Representation)的适用性
单词向量表示法是非常有用的,有助于一些机器学习任务。我把其中一些列在下面。
- 主题建模:从文档集合中提取抽象主题的技术。(参见这里)
- 文档相似性:可以从单词向量表示中检索关于文档相似性的信息。
- 矢量化:ML pipelines(Spark中的一个包,译者注)和文本挖掘中的一个重要步骤。
用于分析的方法
在这种情况下,GloVe方法被用于分析从维基百科页面(其前三个段落)中获取的文本。然后,将对由GloVe算法形成的向量进行主成分分析,然后在带有Wiki文本中的各种短语的二维图上显示。
技术环境
所用的代码是在Rtudio环境中由R语言编写。
单词嵌入是通过使用text2vecand的 tm
包来完成的 。可视化使用 ggplot2
完成, 将会在一个二维空间中表示。
参数
对文本进行修剪以删除数量少于三个的单词。这是为了保持可视化看起来整洁。
文字窗口保持在5。
矢量的大小保持在20。
该模型通过调用 glove = GlobalVectors$new
进行训练,它在text2vec包中可用。
单词向量快照
以下是通过上述技术学习到的(针对出现在语料库中的一些单词)的各种向量的例子。
注意:由于空间不足,所有矢量都不显示。
短语之间的关系
学习过矢量之后,应用主成分分析,并在具有两个主成分的二维图上绘制出各个单词,因为难于以两维以上的方式进行可视化。由此产生的关系由下图描述。
一些有趣的观察发现:
- Jai和Veeru一起出现。
- 他们远离电影肖雷的名字。这可能是由于数据集不足。
- Basanti,Sholay和Ramgarh会一起出现。
- Veeru / Basanti和Jai / Radha之间的距离是可比的。
结论
我们看到,在一个小的数据集上,全局向量在理解一些关系方面表现得相当好。在矢量表示的帮助下,单词可以表示为数值矢量,并且可以用作一些更复杂的机器学习任务的构建块。
上面的分析的源代码和解释可以在这里找到。
- Python读取json文件,并转化为字典进行提取字段(出现索引must be int,not str)解决方案
- Python 把字典的key和value的值取出来,按照顺序存入到list中
- Go语言 如果实现http重连?
- python strip()函数 删除字符串中无空白字符或者是无用字符
- 闪回归档的简单测试(r8笔记第68天)
- sql语句查询到整个数据库的容量
- 神奇的go语言
- 备库查询导致的ORA-01110错误及修复(r8笔记第67天)
- SQL客户端DBvisualize直接导入数据出现中文乱码
- Python基础整理操作积累
- 让AI给颜值打分?应该是最公正的裁判了!
- orion的简单测试 (r8笔记第75天)
- golang ftp客户端示例 支持断点续传
- python 网页特征提取XPATH(两天玩转) 第一天
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 机器学习4个常用超参数调试方法!
- 总结:DCIC算法分析赛完整方案分享!
- 提高微服务安全性的11个方法
- nmap
- MSF基础与应用
- Windows系统组件漏洞
- 【风险通告】FastAdmin会员中心Getshell漏洞
- Azure Cosmos DB介绍及演示
- 从一次编译出发梳理概念: Jetty,Jersey,hk2,glassFish,Javax,Jakarta
- 《一起学sentinel》一、一起搭建sentinel服务
- InfluxDB和Grafana实现传感器数据的存储和可视化
- 样本相关性分析
- Android 序列化 Serializable与Parcelable
- 《一起学sentinel》二、初探sentinel的Slot
- Redis突然报错,今晚又不能回家了...