花了点时间,把外交部网站上的发言人表态一栏中的数据全部抓取下来,按照一定的格式保存于文件中,时间范围是2010-09-14~2014-06-18,如果跑在服务器上的话,可以做增量更新,即若有更新每天下载一篇新的文章。我国的外交部发言人制度是在1983年3月1日开始设立的,但是外交部网站上公布的数据好像只有我拿到的这些。
文件格式如图:
(声明:本人只是想把这些答记者问的对话当作自然语言处理的语料,进行学习。)
从这些文本中统计出如下信息;
发言人出场的次数
姓名 次数
洪磊 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://download.csdn.net/detail/ozhaohuafei/7526553 。
使用Jsoup进行抓取及页面解析的代码。
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import org.apache.commons.io.FileUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class Spider { public static void main(String[] args) throws IOException { // ArrayList<String> all = getAll(); String file = "c://users//logic//desktop//fayan.list"; // write2File(file, all); // System.out.println("---------------------------------"); readFromFile(file); } public static ArrayList<String> getAll() throws IOException { ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < 27; i++) { String baseurl = "http://www.fmprc.gov.cn/mfa_chn/wjdt_611265/fyrbt_611275/default"; if (i == 0) baseurl = baseurl + ".shtml"; else baseurl = baseurl + "_" + i + ".shtml"; Document doc = Jsoup .connect(baseurl) .timeout(50000) .userAgent( "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 " + "(KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36") .header("X-Requested-With", "XMLHttpRequest").get(); Elements element = doc.getElementsByTag("li"); for (Element ele : element) { if (!ele.html().contains("target=\"_blank\"")) continue; String content_url = ele.select("a[href]").attr("abs:href"); String text = ele.text(); String title = text.substring(0, text.indexOf('(')); //首先查找,再增量更新 // if (isContains("c://users//logic//desktop//fayan.list", title)) // continue; String date = text.substring(text.indexOf('(') + 1, text.indexOf(')')); String content = getContent(content_url); StringBuffer buf = new StringBuffer(); buf.append(title.trim() + "||" + date.trim() + "||" + content + "\n"); list.add(buf.toString()); System.out.println(title + "\t" + date); } System.out.println("---------------------------------"); } return list; } public static String getContent(String contentUrl) throws IOException { Document doc = Jsoup .connect(contentUrl) .userAgent( "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 " + "(KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36") .header("X-Requested-With", "XMLHttpRequest").timeout(50000) .get(); Element element = doc.getElementById("doccontent"); return element.text().trim().replaceAll("\\s+", ""); } public static void write2File(String file, ArrayList<String> lines,boolean isAppend) throws IOException { FileUtils.writeLines(new File(file), lines, isAppend); } public static boolean isContains(String file, String find) throws IOException { List<String> lines = FileUtils.readLines(new File(file)); for (String str : lines) { if (str.contains(find)) return true; } return false; } public static void readFromFile(String file) throws IOException { List<String> lines = FileUtils.readLines(new File(file)); int i=0; ArrayList<String> list = new ArrayList<String>(); for (String str : lines) { StringTokenizer tokenizer = new StringTokenizer(str,"||"); String s =""; while(tokenizer.hasMoreTokens()){ // String s = tokenizer.nextToken(); s = tokenizer.nextToken(); String s1 = tokenizer.nextToken(); String s2 = tokenizer.nextToken(); } System.out.println(s); list.add(s); write2File("c://users//logic//desktop//fayan_name.list", list,false); // String temp[] = str.split("||"); // System.out.println(temp[0] + "\t" + temp[1] + "\t" + temp[2]); // if(i++ == 5) // break; } } }