Guest User

Untitled

a guest
Dec 15th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.07 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. /**
  4. * 简单计算文本相似度
  5. */
  6. public class CalcStringSimilar {
  7. // 单位
  8. public static class Unit{
  9. private Integer id;
  10. private String name;
  11.  
  12. public Integer getId() {
  13. return id;
  14. }
  15.  
  16. public void setId(Integer id) {
  17. this.id = id;
  18. }
  19.  
  20. public String getName() {
  21. return name;
  22. }
  23.  
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27.  
  28. @Override
  29. public String toString() {
  30. return "Unit{" +
  31. "id=" + id +
  32. ", name='" + name + '\'' +
  33. '}';
  34. }
  35. }
  36.  
  37. public static class UnitSimilarWrap{
  38. //
  39. public Unit unit1;
  40. public Unit unit2;
  41. public Integer similarPercent;
  42.  
  43. public Unit getUnit1() {
  44. return unit1;
  45. }
  46.  
  47. public void setUnit1(Unit unit1) {
  48. this.unit1 = unit1;
  49. }
  50.  
  51. public Unit getUnit2() {
  52. return unit2;
  53. }
  54.  
  55. public void setUnit2(Unit unit2) {
  56. this.unit2 = unit2;
  57. }
  58.  
  59. public Integer getSimilarPercent() {
  60. return similarPercent;
  61. }
  62.  
  63. public void setSimilarPercent(Integer similarPercent) {
  64. this.similarPercent = similarPercent;
  65. }
  66.  
  67. @Override
  68. public String toString() {
  69. return "相似度=" + similarPercent + "%;" +
  70. "unit1=" + unit1 +
  71. "; unit2=" + unit2 ;
  72. }
  73. }
  74.  
  75.  
  76. public static void main(String[] args) {
  77. //
  78. List<Unit> unitList = getTestData();
  79. // 计算相似度
  80. List<UnitSimilarWrap> unitSimilarList = parseUnitSimilarList(unitList);
  81. for(UnitSimilarWrap wrap : unitSimilarList){
  82. System.out.println(wrap);
  83. }
  84.  
  85. }
  86.  
  87. private static List<UnitSimilarWrap> parseUnitSimilarList(List<Unit> unitList) {
  88. List<UnitSimilarWrap> unitSimilarList = new ArrayList<UnitSimilarWrap>();
  89. //
  90. Set<Unit> processedUnitSet = new HashSet<Unit>();
  91. //
  92. for(Unit unit1 : unitList){
  93. //
  94. processedUnitSet.add(unit1);
  95. //
  96. for(Unit unit2 : unitList){
  97. //已经比较过
  98. if(processedUnitSet.contains(unit2)){
  99. continue;
  100. }
  101. //
  102. String name1 = unit1.getName();
  103. String name2 = unit2.getName();
  104. //
  105. int similarPercent = calStringSimilar(name1, name2);
  106. //
  107. UnitSimilarWrap wrap = new UnitSimilarWrap();
  108. wrap.setUnit1(unit1);
  109. wrap.setUnit2(unit2);
  110. wrap.setSimilarPercent(similarPercent);
  111. //
  112. unitSimilarList.add(wrap);
  113. }
  114. }
  115. // 排序
  116. Collections.sort(unitSimilarList, new Comparator<UnitSimilarWrap>() {
  117. @Override
  118. public int compare(UnitSimilarWrap w1, UnitSimilarWrap w2) {
  119. // 升序
  120. //return w1.getSimilarPercent() - w2.getSimilarPercent();
  121. // 降序
  122. return w2.getSimilarPercent() - w1.getSimilarPercent();
  123. }
  124. });
  125.  
  126. //
  127. return unitSimilarList;
  128. }
  129.  
  130. public static List<Unit> getTestData(){
  131.  
  132. //
  133. Unit unit1 = new Unit();
  134. unit1.setId(1);
  135. unit1.setName("北京第1医院");
  136. //
  137. Unit unit2 = new Unit();
  138. unit2.setId(2);
  139. unit2.setName("北京第2医院2");
  140. //
  141. Unit unit3 = new Unit();
  142. unit3.setId(3);
  143. unit3.setName("北京第3医院");
  144. //
  145. Unit unit4 = new Unit();
  146. unit4.setId(4);
  147. unit4.setName("北京第4医院44");
  148. //
  149. Unit unit5 = new Unit();
  150. unit5.setId(5);
  151. unit5.setName("北京第5医院44");
  152. //
  153. List<Unit> unitList = new ArrayList<Unit>();
  154. //
  155. unitList.add(unit1);
  156. unitList.add(unit2);
  157. unitList.add(unit3);
  158. unitList.add(unit4);
  159. unitList.add(unit5);
  160.  
  161. //
  162. return unitList;
  163. }
  164.  
  165.  
  166.  
  167.  
  168. public static int calStringSimilar(String name1, String name2) {
  169. int similarPercent = 0;
  170. //
  171. name1 = trimAllBlank(name1);
  172. name2 = trimAllBlank(name2);
  173. //
  174. int len1 = name1.length();
  175. int len2 = name2.length();
  176. // 空字符串
  177. if(len1 < 1 || len2 < 1){
  178. return similarPercent;
  179. }
  180. // 计算每个字出现的次数
  181. Map<String, Integer> wordNumMap1 = parseWordNumber(name1);
  182. Map<String, Integer> wordNumMap2 = parseWordNumber(name2);
  183. // 计算相似的字数
  184. int similarNum = calMapSimilarNum(wordNumMap1, wordNumMap2);
  185. int maxLen = Math.max(len1, len2);
  186. //
  187. if(similarNum < 1){
  188. return similarPercent;
  189. }
  190. //
  191. Long similarPercentD = Math.round(100.0 * similarNum / maxLen);
  192. similarPercent = similarPercentD.intValue();
  193. //
  194. return similarPercent;
  195. }
  196.  
  197. // 计算相似的字数
  198. public static int calMapSimilarNum(Map<String, Integer> wordNumMap1, Map<String, Integer> wordNumMap2) {
  199. int similarNum = 0;
  200. if(null == wordNumMap1 || null==wordNumMap2
  201. || wordNumMap1.isEmpty() || wordNumMap2.isEmpty()){
  202. return similarNum;
  203. }
  204. //
  205. Set<String> keySet1 = wordNumMap1.keySet();
  206. Set<String> keySet2 = wordNumMap2.keySet();
  207. //
  208. for(String key : keySet1){
  209. //
  210. if(wordNumMap2.containsKey(key)){
  211. //
  212. Integer num1 = wordNumMap1.get(key);
  213. Integer num2 = wordNumMap2.get(key);
  214. //
  215. if(null == num1 || null == num2){
  216. continue;
  217. }
  218. // 增加相同字数的数量
  219. similarNum += Math.min(num1, num2);
  220. }
  221. }
  222.  
  223. //
  224. return similarNum;
  225. }
  226.  
  227. // 计算每个字出现的次数
  228. public static Map<String, Integer> parseWordNumber(String name) {
  229. Map<String, Integer> wordNumMap = new HashMap<String, Integer>();
  230. //
  231. if(null == name){
  232. name = "";
  233. }
  234. // 去除中英文空格
  235. name = trimAllBlank(name);
  236. // 计算每个字出现的顺序
  237. int len = name.length();
  238. for(int i = 0; i< len; i++){
  239. //
  240. String word = name.substring(i, i+1);
  241. //
  242. Integer num = wordNumMap.get(word);
  243. if(null == num){
  244. num = Integer.valueOf(0);
  245. }
  246. // 数量 + 1
  247. num = num + 1;
  248. //
  249. wordNumMap.put(word, num);
  250. }
  251. //
  252. return wordNumMap;
  253. }
  254.  
  255. // 去除中英文空格
  256. public static String trimAllBlank(String name) {
  257. if(null == name){
  258. name = "";
  259. }
  260. name = name.replace(" ", "").replace(" ", "").trim();
  261. //
  262. return name;
  263. }
  264. }
Add Comment
Please, Sign In to add comment