分享

令人深刻:外交部发言人发言语料抓取及简单分析

问题导读
1、下面是如何通过抓取关键词来获取判断信息的?
2、如何编写使用Jsoup进行抓取信息?





花了点时间,把外交部网站上的发言人表态一栏中的数据全部抓取下来,按照一定的格式保存于文件中,时间范围是2010-09-14~2014-06-18,如果跑在服务器上的话,可以做增量更新,即若有更新每天下载一篇新的文章。我国的外交部发言人制度是在1983年3月1日开始设立的,但是外交部网站上公布的数据好像只有我拿到的这些。

文件格式如图:
1.JPG


(声明:本人只是想把这些答记者问的对话当作自然语言处理的语料,进行学习。)

从这些文本中统计出如下信息;

发言人出场的次数

姓名 次数
洪磊 458
华春莹 175
刘为民 117
秦刚 98
姜瑜 90
马朝旭 62
发言长度最长和最短

2011年4月19日外交部发言人洪磊举行例行记者会1580
2014年2月27日外交部发言人华春莹主持例行记者会 1277
发言中出现的词数,由多到少,前50位(去除了一些停用词):

中方 10074
中国 5248
问 4992
答 4350
对此 2772
合作 2727
发展 2261
和平 2203
评论 2127
各方 1944
希望 1891
稳定 1883
对话 1720
国家 1643
叙利亚 1623
日本 1557
中 1536
维护 1523
地区 1436
推动 1415
外交部 1284
据报道 1281
两国 1198
国际 1171
方 1100
应 1089
日方 1030
国际社会 1014
愿 1014
解决 996
关系 986
局势 978
支持 971
介绍 952
立场 902
钓鱼岛 901
战略 898
情况 894
美国 890
总理 889
已 889
努力 883
访问 881
称 876
请 872
总统 866
领导人 865
相关 838
主权 807
外长 803

可以看出,日本、叙利亚、美国出现的次数在地名上拍名最前,说明这些国家与我国的关系密切(纠葛?)。提到主席的次数没有总统多,总理的次数与总统相当。可以看出,我国的外交目标主要是合作发展、维护世界和平!不过,这是外交部的发言,可能记者多来自国外,关心中国政府对世界的声音,所以大多提到了整个世界。

问题数(每出现一个?统计一次):

951个问题

就这么简单统计了一下,当然我并没有明确的目的,所以也不能够做过多的深入分析。我觉得,从语言学上、逻辑学上都可以进行分析,因为这些句子肯定都是经过仔细推敲的,可能话中有话,但是会避免出现歧义。“学习说话者”,可以从中找到一些技巧,比如不管多么复杂刁难的问题,都可以用几个字就回答了提问,还可能让人哑口无言,重要的是抓住重点。

语料下载地址:链接:http://pan.baidu.com/s/1nt4vXWH 密码:bwbc

使用Jsoup进行抓取及页面解析的代码。
  1. [java] view plaincopy
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.StringTokenizer;  
  7.   
  8. import org.apache.commons.io.FileUtils;  
  9. import org.jsoup.Jsoup;  
  10. import org.jsoup.nodes.Document;  
  11. import org.jsoup.nodes.Element;  
  12. import org.jsoup.select.Elements;  
  13.   
  14. public class Spider {  
  15.     public static void main(String[] args) throws IOException {  
  16. //          ArrayList<String> all = getAll();  
  17.             String file = "c://users//logic//desktop//fayan.list";  
  18. //          write2File(file, all);  
  19. //          System.out.println("---------------------------------");  
  20.          readFromFile(file);  
  21.     }  
  22.   
  23.     public static ArrayList<String> getAll() throws IOException {  
  24.         ArrayList<String> list = new ArrayList<String>();  
  25.         for (int i = 0; i < 27; i++) {  
  26.             String baseurl = "http://www.fmprc.gov.cn/mfa_chn/wjdt_611265/fyrbt_611275/default";  
  27.             if (i == 0)  
  28.                 baseurl = baseurl + ".shtml";  
  29.             else  
  30.                 baseurl = baseurl + "_" + i + ".shtml";  
  31.             Document doc = Jsoup  
  32.                     .connect(baseurl)  
  33.                     .timeout(50000)  
  34.                     .userAgent(  
  35.                             "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 "  
  36.                                     + "(KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36")  
  37.                     .header("X-Requested-With", "XMLHttpRequest").get();  
  38.             Elements element = doc.getElementsByTag("li");  
  39.             for (Element ele : element) {  
  40.                 if (!ele.html().contains("target="_blank""))  
  41.                     continue;  
  42.                 String content_url = ele.select("a[href]").attr("abs:href");  
  43.                 String text = ele.text();  
  44.                 String title = text.substring(0, text.indexOf('('));  
  45.                 //首先查找,再增量更新  
  46. //              if (isContains("c://users//logic//desktop//fayan.list", title))  
  47. //                  continue;  
  48.                 String date = text.substring(text.indexOf('(') + 1,  
  49.                         text.indexOf(')'));  
  50.                 String content = getContent(content_url);  
  51.                 StringBuffer buf = new StringBuffer();  
  52.                 buf.append(title.trim() + "||" + date.trim() + "||" + content  
  53.                         + "\n");  
  54.                 list.add(buf.toString());  
  55.                 System.out.println(title + "\t" + date);  
  56.             }  
  57.             System.out.println("---------------------------------");  
  58.         }  
  59.         return list;  
  60.     }  
  61.   
  62.     public static String getContent(String contentUrl) throws IOException {  
  63.         Document doc = Jsoup  
  64.                 .connect(contentUrl)  
  65.                 .userAgent(  
  66.                         "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 "  
  67.                                 + "(KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36")  
  68.                 .header("X-Requested-With", "XMLHttpRequest").timeout(50000)  
  69.                 .get();  
  70.         Element element = doc.getElementById("doccontent");  
  71.         return element.text().trim().replaceAll("\\s+", "");  
  72.     }  
  73.   
  74.     public static void write2File(String file, ArrayList<String> lines,boolean isAppend)  
  75.             throws IOException {  
  76.         FileUtils.writeLines(new File(file), lines, isAppend);  
  77.     }  
  78.   
  79.     public static boolean isContains(String file, String find)  
  80.             throws IOException {  
  81.         List<String> lines = FileUtils.readLines(new File(file));  
  82.         for (String str : lines) {  
  83.             if (str.contains(find))  
  84.                 return true;  
  85.         }  
  86.         return false;  
  87.     }  
  88.       
  89.     public static void readFromFile(String file)  
  90.             throws IOException {  
  91.         List<String> lines = FileUtils.readLines(new File(file));  
  92.         int i=0;  
  93.         ArrayList<String> list = new ArrayList<String>();  
  94.         for (String str : lines) {  
  95.              StringTokenizer tokenizer = new StringTokenizer(str,"||");  
  96.              String s ="";  
  97.              while(tokenizer.hasMoreTokens()){  
  98. //               String s = tokenizer.nextToken();  
  99.                  s = tokenizer.nextToken();  
  100.                  String s1 = tokenizer.nextToken();  
  101.                  String s2 = tokenizer.nextToken();  
  102.                   
  103.              }  
  104.              System.out.println(s);  
  105.              list.add(s);  
  106.              write2File("c://users//logic//desktop//fayan_name.list", list,false);  
  107. //           String temp[] = str.split("||");  
  108. //           System.out.println(temp[0] + "\t" + temp[1] + "\t" + temp[2]);  
  109. //           if(i++ == 5)  
  110. //               break;  
  111.         }  
  112.     }  
  113. }  
复制代码




没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条