【发布时间】:2018-04-21 07:08:40
【问题描述】:
我想检查一个句子是否包含映射到某个类别的单词列表中的单词。所以我有一个带有单词、类别名称和方法 filterCategory 的 KeyValue.java 类来检查它是否包含单词。现在我有 10,000 个关键字为文本映射了不同的类别。但问题是它的速度很慢。您能否建议一些替代方法来加快分类速度。感谢您的帮助。
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;
}
分类.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;
}
}
}
【问题讨论】:
-
查看 Guava 的
Multimap,因为它是一个很好的 ADT。 -
我不确定它是否会以任何方式提高性能。
-
当我将
lowercase(和 FormatUtil 调用)移到 for 循环前面时,快速测试给了我很大的改进。您不必为每个键都这样做。 -
您的权利。我搞砸了。
-
您甚至可以在循环之前检查
lastWord和contains(" "),然后以一种或另一种方式循环,而无需一次又一次地检查。想想帮助方法containsKey(lc)和equalWord(lc, lastWord),在其中循环键。
标签: java regex collections text-classification multilabel-classification