2015-05-08 5 views
1

У меня возникают проблемы с моей картой синонима. Я хочу, чтобы иметь возможность искать текстовый файл для ключевого слова или связанного слова в текстовом файле, а затем выводить найденное предложение. поэтому моя программа ищет ответы на вопросы, основанные на ключевом слове или субониме. как моя программа работает, путем поиска текстового файла для ключевого слова в вопросе, а затем вывода ответа на вопрос, который является следующей строкой после того, как вопрос в текстовом файле. Когда я ищу ключевое ключевое слово в вопросе, программа работает. Но когда я пытаюсь задать вопрос со связанным словом, программа не распознает входные данные. Так, например, если я вхожу «как главный?» ответ на этот вопрос находится на следующей строке, которая является «основной проблемой», но если я вхожу «как фокус», программа не распознает связанное слово focus Может кто-нибудь помочь мне найти проблему, которая заключается в поиске для связанного слова также. Вот мой текстовый файлПоиск определенной строки текста в текстовом файле

what is the textbook name? 
the textbook name is Java 
how is the major? 
the major is difficult 
how much did the shoes cost? 
the shoes cost two dollars 
how is the major when cramer took it? 
when cramer took it, it was okay 
how is the major when jar took it? 
jar said it was fine 
what is the color of my bag? 
the color of my bag is blue 

и вот мой код

public static class DicEntry { 
    String key; 
    String[] syns; 
    Pattern pattern; 

    public DicEntry(String key, String... syns) { 
     this.key = key; 
     this.syns = syns; 
     pattern = Pattern.compile(".*(?:" 
       + Stream.concat(Stream.of(key), Stream.of(syns)) 
         .map(x -> "\\b" + Pattern.quote(x) + "\\b") 
         .collect(Collectors.joining("|")) + ").*"); 
    } 
} 



public static void parseFile(String s) throws IOException { 

    List<DicEntry> synonymMap = populateSynonymMap(); // populate the map 

    File file = new File("data.txt"); 
    Scanner scanner = new Scanner(file); 
    Scanner forget = new Scanner(System.in); 

    int flag_found = 0; 

    while (scanner.hasNextLine()) { 
     final String lineFromFile = scanner.nextLine(); 

     for (DicEntry entry : synonymMap) { // iterate over each word of the 
              // sentence. 

      if (entry.pattern.matcher(s).matches()) { 

       if (lineFromFile.contains(entry.key)) { 

        //String bat = entry.key; 
        if(lineFromFile.contains(s))  { 
        String temp = scanner.nextLine(); 
        System.out.println(temp); 



       } 
      } 
     } 
    } 
    } 


} 


private static List<DicEntry> populateSynonymMap() { 
    List<DicEntry> responses = new ArrayList<>(); 
    responses.add(new DicEntry("bag", "purse", "black")); 
    responses.add(new DicEntry("shoe", "heels", "gas")); 
    responses.add(new DicEntry("major", "discipline", "focus", "study")); 

    return responses; 
} 

public static void getinput() throws IOException { 

    Scanner scanner = new Scanner(System.in); 
    String input = null; 
    /* End Initialization */ 
    System.out.println("Welcome "); 
    System.out.println("What would you like to know?"); 

    System.out.print("> "); 
    input = scanner.nextLine().toLowerCase(); 
    parseFile(input); 
} 

public static void main(String args[]) throws ParseException, IOException { 
    /* Initialization */ 
    getinput(); 

} 

} 
+0

Пожалуйста, попробуйте удалить ненужный пар ts из вашего кода (например, задавать и писать ответы на вопросы, не найденные в текстовом файле). – siegi

ответ

0

Казалось бы, что после того, как вы пройдете

if (lineFromFile.contains(entry.key)) 

в методе parseFile(String s), вы хотели бы знать, если ваш введенный пользователем ввод содержит любой из entry.syns и заменяет синоним клавишей

// This is case sensitive 
boolean synonymFound = false; 
for (String synonym : entry.syns) { 
    if (s.contains(synonym)) { 
     s = s.replace(synonym, entry.key) 
     break; 
    } 
} 

Так как вы хотите, чтобы остановить поиск как только вы найдете матч (точную или синоним матч), вы хотите иметь return заявления пнуть из метода или использовать флаг, чтобы выгнать из while (scanner.hasNextLine())

if (lineFromFile.contains(s)) { 
    String temp = scanner.nextLine(); 
    System.out.println(temp); 

    flag_found = 1; 

    System.out 
      .println(" Would you like to update this information ? "); 
    String yellow = forget.nextLine(); 
    if (yellow.equals("yes")) { 
     // String black = scanner.nextLine(); 
     removedata(temp); 
    } else if (yellow.equals("no")) { 

     System.out.println("Have a good day"); 
     // break; 
    } 

    // Add return statment to end the search 
    return; 
} 

Результаты:

enter image description here

enter image description here

+0

Я ценю ваше сообщение. Но если я задаю * как фокус? * Ответ должен быть только * майор трудный * не каждый отдельный экземпляр, где найдено слово major. Понимаю? Кроме того, если я спрошу, «как был фокус, когда крамер взял его», выход должен быть только *, когда крамер взял его, это было хорошо * –

+0

@Candole See updates – Shar1er80

+0

Вы, правда, мат. Большое спасибо –