使用 Node.js 对文本内容分词和关键词抽取


Posted in Javascript onMay 27, 2017

在讨论技术前先卖个萌,吃货的世界你不懂~~

使用 Node.js 对文本内容分词和关键词抽取

众成翻译的文章有 tag,用户可以基于 tag 来快速筛选感兴趣的文章,文章也可以依照 tag 关联来进行相关推荐。但是现在众成翻译的 tag 是在推荐文章的时候设置的,都是英文的,而且人工设置难免不规范和不完全。虽然发布文章后也可以人工编辑,但是我们也不能指望用户或管理员能够时时刻刻编辑出恰当的 tag,所以我们需要用工具来自动生成 tag。

在现在开源的分词工具里面,jieba是一个功能强大性能优越的分词组件,更幸运地是,它有 node 版本。

nodejieba 的安装和使用十分简单:

npm install nodejieba
var nodejieba = require("nodejieba");
var result = nodejieba.cut("帝国主义要把我们的地瓜分掉");
console.log(result);
//[ '帝国主义', '要', '把', '我们', '的', '地', '瓜分', '掉' ]
result = nodejieba.cut('土地,俺老孙的金箍棒在哪里?');
console.log(result);
//[ '土地', ',', '俺', '老', '孙', '的', '金箍棒', '在', '哪里', '?' ]
result = nodejieba.cut('大圣,您的金箍棒就棒在特别配您的头型!');
console.log(result); 
//[ '大圣',',','您','的','金箍棒','就','棒','在','特别','配','您','的','头型','!' ]

我们可以载入自己的字典,在字典里给每个词分别设置权重和词性:

编辑 user.uft8
地瓜 9999 n
金箍 9999 n
棒就棒在 9999
然后通过 nodejieba.load 加载字典。

var nodejieba = require("nodejieba");
nodejieba.load({
 userDict: './user.utf8',
});
var result = nodejieba.cut("帝国主义要把我们的地瓜分掉");
console.log(result);
//[ '帝国主义', '要', '把', '我们', '的', '地瓜', '分', '掉' ]
result = nodejieba.cut('土地,俺老孙的金箍棒在哪里?');
console.log(result);
//[ '土地', ',', '俺', '老', '孙', '的', '金箍棒', '在', '哪里', '?' ]
result = nodejieba.cut('大圣,您的金箍棒就棒在特别配您的头型!');
console.log(result); 
//[ '大圣', ',', '您', '的', '金箍', '棒就棒在', '特别', '配', '您', '的', '头型', '!' ]

除了分词以外,我们可以利用 nodejieba 提取关键词:

const content = `

HTTP、HTTP/2与性能优化

本文的目的是通过比较告诉大家,为什么应该从HTTP迁移到HTTPS,以及为什么应该添加到HTTP/2的支持。在比较HTTP和HTTP/2之前,先看看什么是HTTP。

什么是HTTP

HTTP是在万维网上通信的一组规则。HTTP属于应用层协议,跑在TCP/IP层之上。用户通过浏览器请求网页时,HTTP负责处理请求并在Web服务器与客户端之间建立连接。

有了HTTP/2,不使用雪碧图、压缩、拼接,也可以提升性能。然而,这不代表不应该使用这些技术。不过这已经清楚表明了我们从HTTP/1.1移动到HTTP/2的必要性。
`;

const nodejieba = require("nodejieba");
const result = nodejieba.extract(content, 20);
console.log(result);

输出的结果类似下面这样:

[ { word: 'HTTP', weight: 140.8704516850025 },
 { word: '请求', weight: 14.23018001394 },
 { word: '应该', weight: 14.052171126120001 },
 { word: '万维网', weight: 12.2912397395 },
 { word: 'TCP', weight: 11.739204307083542 },
 { word: '1.1', weight: 11.739204307083542 },
 { word: 'Web', weight: 11.739204307083542 },
 { word: '雪碧图', weight: 11.739204307083542 },
 { word: 'HTTPS', weight: 11.739204307083542 },
 { word: 'IP', weight: 11.739204307083542 },
 { word: '应用层', weight: 11.2616203224 },
 { word: '客户端', weight: 11.1926274509 },
 { word: '浏览器', weight: 10.8561552143 },
 { word: '拼接', weight: 9.85762638414 },
 { word: '比较', weight: 9.5435285574 },
 { word: '网页', weight: 9.53122979951 },
 { word: '服务器', weight: 9.41204128224 },
 { word: '使用', weight: 9.03259988558 },
 { word: '必要性', weight: 8.81927328699 },
 { word: '添加', weight: 8.0484751722 } ]

我们添加一些新的关键词到字典里:

性能
HTTP/2

输出结果如下:

[ { word: 'HTTP', weight: 105.65283876375187 },
 { word: 'HTTP/2', weight: 58.69602153541771 },
 { word: '请求', weight: 14.23018001394 },
 { word: '应该', weight: 14.052171126120001 },
 { word: '性能', weight: 12.61259281884 },
 { word: '万维网', weight: 12.2912397395 },
 { word: 'IP', weight: 11.739204307083542 },
 { word: 'HTTPS', weight: 11.739204307083542 },
 { word: '1.1', weight: 11.739204307083542 },
 { word: 'TCP', weight: 11.739204307083542 },
 { word: 'Web', weight: 11.739204307083542 },
 { word: '雪碧图', weight: 11.739204307083542 },
 { word: '应用层', weight: 11.2616203224 },
 { word: '客户端', weight: 11.1926274509 },
 { word: '浏览器', weight: 10.8561552143 },
 { word: '拼接', weight: 9.85762638414 },
 { word: '比较', weight: 9.5435285574 },
 { word: '网页', weight: 9.53122979951 },
 { word: '服务器', weight: 9.41204128224 },
 { word: '使用', weight: 9.03259988558 } ]

在这个基础上,我们采用白名单的方式过滤出一些可以作为 tag 的词:

const content = `

HTTP、HTTP/2与性能优化

本文的目的是通过比较告诉大家,为什么应该从HTTP迁移到HTTPS,以及为什么应该添加到HTTP/2的支持。在比较HTTP和HTTP/2之前,先看看什么是HTTP。

什么是HTTP

HTTP是在万维网上通信的一组规则。HTTP属于应用层协议,跑在TCP/IP层之上。用户通过浏览器请求网页时,HTTP负责处理请求并在Web服务器与客户端之间建立连接。

有了HTTP/2,不使用雪碧图、压缩、拼接,也可以提升性能。然而,这不代表不应该使用这些技术。不过这已经清楚表明了我们从HTTP/1.1移动到HTTP/2的必要性。
`;

const nodejieba = require("nodejieba");
nodejieba.load({
 userDict: './user.utf8',
});
const result = nodejieba.extract(content, 20);
const tagList = ['HTTPS', 'HTTP', 'HTTP/2', 'Web', '浏览器', '性能'];
console.log(result.filter(item => tagList.indexOf(item.word) >= 0));

最后得到:

[ { word: 'HTTP', weight: 105.65283876375187 },
 { word: 'HTTP/2', weight: 58.69602153541771 },
 { word: '性能', weight: 12.61259281884 },
 { word: 'HTTPS', weight: 11.739204307083542 },
 { word: 'Web', weight: 11.739204307083542 },
 { word: '浏览器', weight: 10.8561552143 } ]

这就是我们想要的结果。

以上就是分词库 nodejieba 基本的使用方法,在将来我们可以利用它对众成翻译发布的译文自动分析添加相应的 tag,以为各位译者和读者提供更好的用户体验。

以上所述是小编给大家介绍的使用 Node.js 对文本内容分词和关键词抽取,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery EasyUI中对表格进行编辑的实现代码
Jun 10 Javascript
Javascript将string类型转换int类型
Dec 09 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
May 05 Javascript
禁用页面部分JavaScript不是全部而是部分
Sep 03 Javascript
Sublime Text 3常用插件及安装方法
Dec 16 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
May 25 Javascript
springMVC结合AjaxForm上传文件
Jul 12 Javascript
AngularJS中$http服务常用的应用及参数
Aug 22 Javascript
js如何获取网页所有图片
May 12 Javascript
JavaScript模板引擎原理与用法详解
Dec 24 Javascript
详解react-refetch的使用小例子
Feb 15 Javascript
JS脚本实现定时到网站上签到/签退功能
Apr 22 Javascript
vue子组件使用自定义事件向父组件传递数据
May 27 #Javascript
javascript回调函数的概念理解与用法分析
May 27 #Javascript
原生JavaScript实现的简单省市县三级联动功能示例
May 27 #Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
May 27 #Javascript
详细讲解vue2+vuex+axios
May 27 #Javascript
AngularJS获取json数据的方法详解
May 27 #Javascript
vue中用H5实现文件上传的方法实例代码
May 27 #Javascript
You might like
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
php导入模块文件分享
2015/03/17 PHP
php实现的日历程序
2015/06/18 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
2016/07/18 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
使用JavaScript实现弹出层效果的简单实例
2016/05/31 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
可能这些是你想要的H5软键盘兼容方案(小结)
2019/04/23 HTML / CSS
彪马西班牙官网:PUMA西班牙
2019/06/18 全球购物
前台接待的工作职责
2013/11/21 职场文书
加入学生会演讲稿
2014/04/24 职场文书