问题导读
1、下面是如何通过抓取关键词来获取判断信息的?
2、如何编写使用Jsoup进行抓取信息?
花了点时间,把外交部网站上的发言人表态一栏中的数据全部抓取下来,按照一定的格式保存于文件中,时间范围是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://pan.baidu.com/s/1nt4vXWH 密码:bwbc
使用Jsoup进行抓取及页面解析的代码。
- [java] view plaincopy
- 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;
- }
- }
- }
复制代码
|