最近工作遇到一个问题,需要判断新闻发生的地域是否与上海有关。
1、准备工作:
首先,收集上海所有的行政区划(市、区、镇、街道、居委会、地标物(风景区、大学、公园等));
其次,收集全国的行政区划(市、区、镇、街道);
2、判断逻辑:
- 新闻标题中出现“上海”二字的,肯定有“上海”有关,可直接判断为新闻发生地域与上海有关;
- 若标题中未出现上海,但出现了其他省市区的地名,可直接判断为新闻发生地域与上海无关;
- 如果标题无法判断,则进入下一步:利用文章正文进行判断,采用统计地名出现次数的方式;
- 统计文章正文中出现的地名,如果该地名在上海有,则上海的统计(SH) +1 ;若外地也有相同地名,则外地的统计(WD)也 +1;
- 对正文中统计的地名进行计算阈值 scores = SH/ (SH+WD);
- 如果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%