扫描各种长度关键字的字符串

时间:2018-01-31 16:08:43

标签: java arrays search hashmap apache-poi

我想扫描我的文档,将其拆分为某些关键字,例如“燃料'车辆'车辆租赁”,'' ;资产类型维护'等问题是关键字的长度不同。一个是单词关键词,另一个是4个词关键词。目前我一字一句地扫描,但不喜欢多字关键字的想法,例如'汽车租赁'例如。

我可以做些什么来改进我的代码并使用多个单词关键字? 这就是它现在的样子

public void findKeywords(POITextExtractor te, ArrayList<HashMap<String,Integer>> listOfHashMaps, ArrayList<Integer> KeywordsFound, ArrayList<Integer> existingTags) {

    String document = te.getText().toString();
    String[] words = document.split("\\s+");
    int wordsNo = 0;
    int keywordsMatched = 0;

    try {
        for(String word : words) {
            wordsNo++;

            for(HashMap<String, Integer> hashmap : listOfHashMaps) {
                if(hashmap.containsKey(word) &&  !KeywordsFound.contains(hashmap.get(word)) && !existingTags.contains(hashmap.get(word))) {
                    KeywordsFound.add(hashmap.get(word));
                    keywordsMatched++;
                    System.out.println(word);
                }
            }
        }
        System.out.println("New keywords found: " + KeywordsFound);
        System.out.println("Number of words in document = " + wordsNo);
        System.out.println("Number of keywords matched: " + keywordsMatched);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    }
}

我已经包含了我的方法。如果还需要了解我的代码,请发表评论。

@UPDATE

public void findKeywords(POITextExtractor te, ArrayList<HashMap<String,Integer>> listOfHashMaps, ArrayList<Integer> KeywordsFound, ArrayList<Integer> existingTags) {

    String document = te.getText().toString();
    String[] words = document.split("\\s+");
    int wordsNo = 0;
    int keywordsMatched = 0;

    for(HashMap<String, Integer> hashmap : listOfHashMaps) {
         Iterator it = hashmap.entrySet().iterator();
         while (it.hasNext()) {
             Map.Entry pair = (Map.Entry)it.next();
             //System.out.println(pair.getKey() + " = " + pair.getValue());
             it.remove(); // avoids a ConcurrentModificationException

             if(document.contains((CharSequence) pair.getKey()) && !KeywordsFound.contains(pair.getValue()) && !existingTags.contains(pair.getValue())) {
                 System.out.println(pair.getKey());
                 KeywordsFound.add((Integer) pair.getValue());
                 keywordsMatched++;  
             }
         }
    }

    System.out.println("New keywords found: " + KeywordsFound);
    System.out.println("Number of keywords matched: " + keywordsMatched);
}

2 个答案:

答案 0 :(得分:0)

我认为这是一种功课。因此: 看看string search algorithms在较大的字符串中搜索子字符串(模式)。

然后假设您使用了这种算法之一,但是您没有在更大的字符序列中搜索的字符序列(模式),而是在一个字符串(模式)序列中搜索更大的字符串序列。 (所以你只有一个不同的,更大的字母表)

答案 1 :(得分:0)

另一种方法是通过搜索字符串拆分字符串。 例如。

List<String> searchString = new ArrayList<>();
searchString.add("Fuel");
searchString.add("Asset Type Maintenance");
searchString.add("Vehicle Leasing");

String document=""; // Assuming that you complete string is initilaized here.

for (String str : searchString) {
    String[] tempDoc=document.split(str);
    System.out.println(str + " is repated "+ (tempDoc.length-1) + " times");

请注意,这可能会破坏垃圾收集中的JVM。 您可以自己比较性能。