Ich möchte prüfen, ob ein Satz ein Wort aus einer Liste von Wörtern enthält, die einer Kategorie zugeordnet sind. Also habe ich eine Klasse KeyValue.java mit Wörtern, Kategorienamen und einer Methode filterCategory, um zu prüfen, ob sie das Wort enthält. Jetzt habe ich 10.000 Schlüsselwörtern verschiedene Kategorien für den Text zugeordnet. Aber das Problem ist, es ist viel zu langsam. Können Sie alternative Methoden vorschlagen, um die Klassifizierung zu beschleunigen? Danke für die Hilfe.Überprüfen Sie, ob ein Satz ein Wort aus einer Liste enthält.
public class KeyValue {
private String key;
private String value;
public KeyValue(String key, String value) {
this.key = key;
this.value= value;
}
public KeyValue() {
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
Classification.java
class Classification
{
private static List<KeyValue> keyMap = new ArrayList<KeyValue>();
static{
getWordMap();
}
public static List<KeyValue> getWordMap()
{
if(keyMap.size()==0)
{
keyMap.add(new KeyValue("sports","football"));
keyMap.add(new KeyValue("sports","basketball"));
keyMap.add(new KeyValue("sports","olympics"));
keyMap.add(new KeyValue("sports","cricket"));
keyMap.add(new KeyValue("sports","t20"));
}
}
public static KeyValue filterCategory(String filteredText)
{
KeyValue kv = null;
for(KeyValue tkv:keyMap)
{
String value = tkv.getValue();
String lc = filteredText.toLowerCase();
lc = FormatUtil.replaceEnglishSymbolsWithSpace(lc);//remove symbols with space and then normalizes it
String lastWord="";
if(lc.contains(" "))
{
lastWord = lc.substring(lc.lastIndexOf(" ")+1);
if(lc.startsWith(value+" ") || lc.contains(" "+value+" ") || value.equals(lastWord))
{
kv = new KeyValue(tkv.getKey(), tkv.getValue());
break;
}
}
else if(lc.contains(value))
{
kv = new KeyValue(tkv.getKey(), tkv.getValue());
break;
}
}
if(kv==null)
{
return new KeyValue("general","0");
}
else
{
kv.setValue("100");
return kv;
}
}
}
Schauen Sie in Guava 'Multimap', wie es eine gute ADT ist, dafür zu verwenden. –
Ich bin mir nicht sicher, ob es die Leistung in irgendeiner Weise verbessern wird. – akay
Ein schneller Test gab mir eine ziemliche Verbesserung, als ich den "Kleinbuchstaben" (und den FormatUtil-Aufruf) vor die for-Schleife stellte. Sie müssen es nicht für jeden Schlüssel tun. –