View Javadoc
1   package com.gisgraphy.fulltext;
2   
3   import java.util.ArrayList;
4   import java.util.List;
5   import java.util.regex.Matcher;
6   import java.util.regex.Pattern;
7   
8   /**
9   * A class to detect if a text conatins a street type
10  * 
11  * @author <a href="mailto:david.masclet@gisgraphy.com">David Masclet</a>
12  * 
13  */
14  public class SmartStreetDetection {
15  	
16  	private final static List<String> STREET_TYPES = new ArrayList<String>(){
17  		private static final long serialVersionUID = -3194005170253765829L;
18  
19  		{
20  			add("rue");
21  			add("boulevard");
22  			add("autoroute");
23  			add("bd");
24  			add("blvd");
25  			add("avenue");
26  			add("chemin");
27  			add("rte");
28  			add("route");
29  			add("impasse");
30  			add("passage");
31  			add("place");
32  			add("sentier");
33  			add("voie");
34  			add("allee");
35  			add("alley");
36  			add("avenue");
37  			add("blvd");
38  			add("boulevard");
39  			add("highway");
40  			add("hiway");
41  			add("motorway");
42  			add("plaza");
43  			add("road");
44  			add("route");
45  			add("street");
46  			add("rua");
47  			add("plaza");
48  			add("carrera");
49  			add("camino");
50  			add("passatge");
51  			add("autovia");
52  			add("autopista");
53  			add("autobahn");
54  			add("fleck");
55  		};
56  	};
57  	
58  	private static final List<String> STREET_TYPES_DECOMPOUND = new ArrayList<String>(){
59  		{
60  			add("straße");
61  			add("strasse");
62  			add("plätze");
63  			add("platze");
64  			add("landstraße");
65  		}
66  	};
67  	
68  	private static final String STREET_REGEXP = getRegexp();
69  	private static final Pattern STREET_PATTERN = Pattern.compile(STREET_REGEXP,Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);
70  
71  	public List<String> getStreetTypes(String textToTest){
72  		Matcher matcher = STREET_PATTERN.matcher(textToTest);
73  		List<String> splitedString = new ArrayList<String>();
74      	while (matcher.find()) {
75      	    for (int j = 1; j <= matcher.groupCount(); j++) {
76      		 String group = matcher.group(j);
77      		    if (group!= null && !"".equals(group.trim())){
78      		    	splitedString.add(group);
79      		    }
80      	    }
81      	}
82      	return splitedString;
83  		
84  	}
85  
86  	static String getRegexp() {
87  		StringBuffer sb =new StringBuffer("((?:");
88  		for (int i=0;i<STREET_TYPES.size();i++){
89  			sb.append("\\b").append(STREET_TYPES.get(i)).append("\\b");
90  			if (i!=STREET_TYPES.size()-1){
91  				sb.append("|");
92  			}
93  		}
94  		sb.append("\\b)|(?:");
95  		for (int i=0;i<STREET_TYPES_DECOMPOUND.size();i++){
96  			sb.append(STREET_TYPES_DECOMPOUND.get(i)).append("\\b");
97  			if (i!=STREET_TYPES_DECOMPOUND.size()-1){
98  				sb.append("|");
99  			}
100 		}
101 		
102 		sb.append("))");
103 		return sb.toString();
104 	}
105 
106 }