之前已经提到过使用FudanNLP进行新闻关键词提取,无奈组长不满意于是换成了ictclas,在我的ubuntu13.04上面ictclas跑得很好,可惜到别人的机器上就报错,没办法,只好再一次换工具,经过晓阳童鞋推荐,这次换成了ANSJ,据说这个工具就是早先ictclas的Java版本。

这个工具的Github地址是这里:https://github.com/ansjsun/ansj_seg 需要看源码的自己前往。下面说说如何使用这个工具提取关键词。

1-下载JAR包

显然下载JAR包是最省事的方法,当然你也可以把Github上面的工程加进来,无奈JAR包找了好久未找到,最后只好向作者索取,目前已经上传到CSDN了,欢迎下载:http://download.csdn.net/detail/jj12345jj198999/6020541

2-自定义keyword类

虽然ANSJ中已经实现了关键词提取,不过输出时并没有给出每一个关键词的权重,于是只好手动修改keyword类,好在Github上面的源码中已经定义了权重成员,我们只需要增加一个Get函数即可。

[java]  view plain copy print ?
  1. public class Keyword implements Comparable<Keyword> {
  2. private String name;
  3. private double score;
  4. private double idf;
  5. private int freq;
  6. public Keyword(String name, int docFreq, int weight) {
  7. this.name = name;
  8. this.idf = Math.log(10000 + 10000.0 / (docFreq + 1));
  9. this.score = idf * weight;
  10. freq++;
  11. }
  12. public void updateWeight(int weight) {
  13. this.score += weight * idf;
  14. freq++;
  15. }
  16. public int compareTo(Keyword o) {
  17. if (this.score < o.score) {
  18. return 1;
  19. } else {
  20. return -1;
  21. }
  22. }
  23. public boolean equals(Object obj) {
  24. // TODO Auto-generated method stub
  25. if (obj instanceof Keyword) {
  26. Keyword k = (Keyword) obj;
  27. return k.name.equals(name);
  28. } else {
  29. return false;
  30. }
  31. }
  32. public String toString() {
  33. return name;
  34. }
  35. //look here ******************************************************
  36. public double getScore(){
  37. return score;
  38. }
  39. public int getFreq() {
  40. return freq;
  41. }
  42. }

除了这个之外,我们还需要原封不动地把keywordcomputer类重抄一遍,随叫这两个类息息相关呢,要么都在JAR中要么就一起跳出来。对于这个类,实在不知道计算keyword时为何要知道title的长度,作者告诉我这不是他写的也不知道缘由,我猜Github上面添加这个模块的人肯定认为出现在标题中的词需要赋予较大的权重吧,也许这个想法是对的。

[java]  view plain copy print ?
  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.TreeSet;
  7. import org.ansj.app.newWord.LearnTool;
  8. import org.ansj.domain.Term;
  9. import org.ansj.recognition.NatureRecognition;
  10. import org.ansj.splitWord.analysis.NlpAnalysis;
  11. public class KeyWordComputer {
  12. private int nKeyword = 10;
  13. //default constructor keyword number=10
  14. public KeyWordComputer() {
  15. nKeyword = 10;
  16. }
  17. // constructor set keyword number
  18. public KeyWordComputer(int nKeyword) {
  19. this.nKeyword = nKeyword;
  20. }
  21. //get keywords object list
  22. private List<Keyword> computeArticleTfidf(String content, int titleLength) {
  23. Map<String, Keyword> tm = new HashMap<String, Keyword>();
  24. LearnTool learn = new LearnTool();
  25. List<Term> parse = NlpAnalysis.parse(content, learn);
  26. parse = NlpAnalysis.parse(content, learn);
  27. for (Term term : parse) {
  28. int weight = getWeight(term, content.length(), titleLength);
  29. if (weight == 0)
  30. continue;
  31. Keyword keyword = tm.get(term.getName());
  32. if (keyword == null) {
  33. keyword = new Keyword(term.getName(), term.getNatrue().allFrequency, weight);
  34. tm.put(term.getName(), keyword);
  35. } else {
  36. keyword.updateWeight(1);
  37. }
  38. }
  39. TreeSet<Keyword> treeSet = new TreeSet<Keyword>(tm.values());
  40. ArrayList<Keyword> arrayList = new ArrayList<Keyword>(treeSet);
  41. if (treeSet.size() < nKeyword) {
  42. return arrayList;
  43. } else {
  44. return arrayList.subList(0, nKeyword);
  45. }
  46. }
  47. //get keywords,need title and content
  48. public Collection<Keyword> computeArticleTfidf(String title, String content) {
  49. return computeArticleTfidf(title + "\t" + content, title.length());
  50. }
  51. //get keywords, just need content
  52. public Collection<Keyword> computeArticleTfidf(String content) {
  53. return computeArticleTfidf(content, 0);
  54. }
  55. //get keywords weight
  56. private int getWeight(Term term, int length, int titleLength) {
  57. if (term.getName().matches("(?s)\\d.*")) {
  58. return 0;
  59. }
  60. if (term.getName().trim().length() < 2) {
  61. return 0;
  62. }
  63. String pos = term.getNatrue().natureStr;
  64. if (!pos.startsWith("n") || "num".equals(pos)) {
  65. return 0;
  66. }
  67. int weight = 0;
  68. if (titleLength > term.getOffe()) {
  69. return 20;
  70. }
  71. // position
  72. double position = (term.getOffe() + 0.0) / length;
  73. if (position < 0.05)
  74. return 10;
  75. weight += (5 - 5 * position);
  76. return weight;
  77. }
  78. }

3-test

最后就是写一个类测试,import一堆东西

[java]  view plain copy print ?
  1. import java.util.List;
  2. import java.io.BufferedReader;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.io.StringReader;
  7. import java.util.Iterator;
  8. import org.ansj.app.newWord.LearnTool;
  9. import org.ansj.domain.Term;
  10. import org.ansj.recognition.NatureRecognition;
  11. import org.ansj.splitWord.Analysis;
  12. import org.ansj.splitWord.analysis.NlpAnalysis;
  13. import org.ansj.splitWord.analysis.ToAnalysis;
  14. import org.ansj.util.*;
  15. import org.ansj.recognition.*;
  16. public class test {
  17. public static void main(String[] args) throws IOException {
  18. String filePath = "./test-utf8.TXT";
  19. String tt=new String();
  20. BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF8"));
  21. String str;
  22. while ((str = in.readLine()) != null) {
  23. tt+=str;
  24. }
  25. test1(tt);
  26. System.out.println("*************************");
  27. filePath = "./test1.txt";
  28. BufferedReader in2 = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF8"));
  29. String str2;
  30. String tt2=new String();
  31. while ((str2 = in2.readLine()) != null) {
  32. tt2+=str2;
  33. }
  34. test1(tt2);
  35. }
  36. public static void test1(String content){
  37. KeyWordComputer key=new KeyWordComputer(10);
  38. Iterator it = key.computeArticleTfidf(content).iterator() ;
  39. while(it.hasNext()) {
  40. Keyword key2=(Keyword)it.next();
  41. System.out.println(key2.toString()+key2.getScore());
  42. }
  43. }
  44. }

在测试时有一点需要注意,ANSJ目前只支持UTF-8格式的字符串,其他格式的运行时会报JAVA GC错误,作者说因为处理过程中是乱码,程序以为都是新词导致内存崩溃了,希望他在以后的版本中加以改进吧。最后给出输出结果,这里是按照权重排序的:

[plain]  view plain copy print ?
  1. init ambiguity  waring :library/ambiguity.dic because : not find that file or can not to read !
  2. init core library ok use time :3983
  3. init ngram ok use time :2023
  4. 屌丝528.8693014046396
  5. 李毅202.62858475668492
  6. 网络174.9965471938941
  7. 球迷110.52413506982782
  8. 群体110.52413506982782
  9. 人人110.52413506982782
  10. 名号101.31379048067551
  11. 高富帅92.10390216212956
  12. 满屏92.10390216212954
  13. 网友92.1034458915232
  14. *************************
  15. 社会主义1446.0241004969153
  16. 社会1326.289620837935
  17. 中国1096.0347881537828
  18. 人民1049.9792831633652
  19. 文化874.9827359694709
  20. 经济874.9827359694709
  21. 特色847.3517022020139
  22. 制度801.2999792562523
  23. 体系746.0379117213383
  24. 国家598.6723982949011

如果

List<Term> parse = NlpAnalysis.parse(content,learn);

报错,说明你除了导入上面地址的jar还导入了其他anjs的jar需要删除

利用anjs新闻关键词的抓取相关推荐

  1. jupyter分割代码块_科研分享—Python根据关键词自动抓取Pubmed文献标题(附全部代码)文末有福利...

    写在前面:接触Python应该是8月初的一篇公众号文章,大致内容是使用py爬取数据库并汇总到本地.正好手头需要对某个领域的文献进行调研,不妨学习一下. 什么是Python? 百度说:Python (计 ...

  2. python beautifulsoup抓取网页内容_利用Python和Beautiful Soup抓取网页内容

    利用Python和Beautiful Soup抓取网页内容 Posted on 2012-08-09 00:08 SamWei 阅读(381) 评论(1) 编辑 收藏 Python 3中提供了url打 ...

  3. 高校新闻抓取分析之百度新闻篇---数据抓取

    高校新闻抓取分析之百度新闻篇-数据抓取 tips: 本文代码使用python3编写 代码仓库 使用urllib抓取数据 百度新闻网页界面分析 在我读大学的时候(18年前),百度新闻还能基于新闻标题或者 ...

  4. 网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp)

    转自原文 网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp) 最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决 ...

  5. 网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp

    网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp 最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决定试一 ...

  6. cutycapt php,PHP利用CutyCapt获取网页快照,抓取网页高清图片快照(教程)

    PHP利用CutyCapt获取网页快照,抓取网页高清图片快照(教程): // +------------------------------------------------------------ ...

  7. 如何利用CommMonitor串口监控,抓取串口Modbus RTU数据包

    今天来分享一下,如何抓取串口Modbus RTU数据包. 首先,下载CommMonitor的最新版v12.0,才支持Modbus RTU/ASCII协议分析功能, 同ModbusMonitor RTU ...

  8. 爬虫实践-微博关键词搜索抓取

    关键词: 1.终于离婚了 2.提离职 3.相亲对象 4.给我的教训 ----- 下载地址: 微博关键词抓取 终于离婚了 微博关键词抓取 提离职 微博关键词抓取 相亲对象 微博关键词抓取 给我的教训 转 ...

  9. 爬虫技术 -- 进阶学习(十)网易新闻页面信息抓取(htmlagilitypack搭配scrapysharp)...

    最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决定试一试~ 于是到https://www.nuget.org/packages/Scrapy ...

最新文章

  1. 动手实践系列:CV语义分割!
  2. 常用开源代码网站集合
  3. 外圆内方与外方内圆的奇妙变换!
  4. 用python计算准确率_分词结果准确率、召回率计算-python(示例代码)
  5. Eclipse中的SVN插件
  6. 利用容器来拆分字符串
  7. HDU5687 Problem C【字典树】
  8. 自定义路径创建Cocos2d-x项目
  9. 拓端tecdat|R语言最大流最小割定理和最短路径算法分析交通网络流量拥堵问题
  10. python 线程(创建2种方式,锁,死锁,递归锁,GIL锁,守护进程)
  11. ImageAssitant插件 — 一件提取网页图片
  12. 用Python物理建模的第一本书终于来啦
  13. Qt - 获取屏幕分辨率
  14. ENSP:配置静态路由表,实现不同VLAN间的通信
  15. JavaScript边学边玩的小游戏、好用的js网站:
  16. 07-HTML5举例:简单的视频播放器
  17. WeCube 2.0 全新架构,整装待发
  18. 多传感器融合标定方法汇总
  19. Excel绘制图表时X轴在有数据点的地方才出现刻度标签
  20. java离群值,R从数据框中按组别移除离群值

热门文章

  1. Scrapy 爬*度图片
  2. django外调用url_Django urls 配置 ,模版url调用
  3. 小米9的屏幕是三星EA8076
  4. FATFS支持英文长文件名
  5. 删除火狐书签_在Firefox 3中还原您丢失/删除的智能书签文件夹
  6. Qt5+MySQL 插入中文乱码解决方案
  7. iPhone修个运营商图标
  8. A40i-linux 扩展文件系统分区
  9. word文档怎么做组织结构图
  10. 软件实训-技术学习心得