java判断新闻发生地域

最近工作遇到一个问题,需要判断新闻发生的地域是否与上海有关。

1、准备工作:

首先,收集上海所有的行政区划(市、区、镇、街道、居委会、地标物(风景区、大学、公园等));

其次,收集全国的行政区划(市、区、镇、街道);

2、判断逻辑:

  1. 新闻标题中出现“上海”二字的,肯定有“上海”有关,可直接判断为新闻发生地域与上海有关;
  2. 若标题中未出现上海,但出现了其他省市区的地名,可直接判断为新闻发生地域与上海无关;
  3. 如果标题无法判断,则进入下一步:利用文章正文进行判断,采用统计地名出现次数的方式;
  4. 统计文章正文中出现的地名,如果该地名在上海有,则上海的统计(SH) +1 ;若外地也有相同地名,则外地的统计(WD)也 +1;
  5. 对正文中统计的地名进行计算阈值  scores = SH/ (SH+WD);
  6. 如果scores>0.3,则判断新闻发生地域与上海有关;否则与上海无关;

3、代码

3.1标题判别

public Boolean titleFilter(String title ) {
		Boolean result = true;
		if (title.contains("上海") ) {
			return result;
		}
		List<Term> terms = ToAnalysis.parse(title );
		for (Term term : terms) {
			String word = term.getName().replaceAll("政府|新区|区|县|市", "");
			if ( shAreas.contains(word)) { //shAreas 是上海市唯一地名集合
				return result;
			}
		}
		for (Term term : terms) {
			String word = term.getName().replaceAll("政府|新区|区|县|市", "");
			if (wdPlaces.contains(word )) {//wdPlaces是外地地名集合
				return false;
			}
		}
		return result;
	}

3.2正文判别

//所有地名Map,1:上海,0:外地
private Map<Integer,HashSet<String>> localPlace = new HashMap<Integer,HashSet<String>>();

public Boolean placesToFilter(String content) {
        List<Term> terms = ToAnalysis.parse(str);
		Map<Integer,Double> count = new HashMap<>();
		count.put(1,0d);
		count.put(0,0d);
		for (Term term : terms) {
			String word = term.getName().replaceAll("政府|县|市", "");
			if (localPlace .get(1).contains(word)||word.startsWith("上海")||word.endsWith("上海")) {
				count.compute(1,(k,v) -> {
					if (v==null)
						return 1d;
					else
						return v+1d;
				});
			}
			if (localPlace .get(0).contains(word)) {
				count.compute(0,(k,v) -> {
					if (v==null)
						return 1d;
					else
						return v+1d;
				});
			}
		}

		double sum = count.get(0) + count.get(1);
		if (sum==0)
			return true;
		else {
			double scores = count.get(1) / sum;
			if ( scores > 0.3d) {
				return true;
			}else
				return false;
		}
	}

4、测试

public static void main(String[] args) throws Exception {

        String title = "南昌衡源彻底没了";
        String content = "跟辽足一样,南昌衡源正式没了。 想到南昌衡源, 这支球队在南昌的历史几近完美。可惜南昌衡源转头就搬回了上海改名申鑫。但上海滩不好混。 那个客场只去过一次,忘了是哪年。太远了。";


        System.out.println(FilterProcesser.getInstance().placesToTitleFilter(title));
        System.out.println(FilterProcesser.getInstance().placesToFilter(title+" "+content));


    }

测试结果:

false

false

随机测试了508篇文章,召回率在80%以上,其中上海本地判断召回率81.5%,外地94.8%

猜你喜欢

转载自blog.csdn.net/u012998680/article/details/115356374