Как транслировать строковые предложения по заданным ключевым словам в Java - PullRequest
0 голосов
/ 06 марта 2019

Я пытался изменить заданные предложения с некоторыми заданными ключевыми словами, чтобы создать выражения Schematron для тестирования.

Я поделился примером и кодом, который я пробовал. Однако я не мог понять, как объединить все значения в одном списке с порядком.

Код:

    int index = -1;
    int index2 = -1;
    int index3 = -1;
    Map <Integer, String> tempMap;
    Map <Integer, String> tempMap2;
    Map <Integer, String> tempMap3;
    List <List <String>> result = new LinkedList <>();
    List <List <String>> resultForOperators = new LinkedList <>();
    List <List <String>> tempList = new LinkedList <>();
    List <String> sentence = new ArrayList <>();
        sentence.add("meal is ('excellent' or 'wonderful' or 'acceptable') and dog is a 'good' friend or 'best' friend");
        sentence.add("cats are ('excellent') or dog is ('wonderful and excellent')");
        sentence.add("Animals are ('beautiful') and cats are Animals");


        List <String> keyword = new ArrayList <>();
        keyword.add("dog");
        keyword.add("Animals");
        keyword.add("cats");
        keyword.add("friend");
        keyword.add("water");
        keyword.add("meal");
        keyword.add("milk");


        List <String> op = new ArrayList <>();
        op.add("OR");
        op.add("AND");
        op.add("IS");
        op.add("ARE");

        List <String> adj = new ArrayList <>();
        adj.add("'wonderful'");
        adj.add("'excellent'");
        adj.add("'wonderful and excellent'");
        adj.add("'acceptable'");
        adj.add("'amazing'");
        adj.add("'best'");
        adj.add("'beautiful'");
        adj.add("'good'");

        for (String message : sentence) {
            tempMap = new LinkedHashMap <>();
            tempMap2 = new LinkedHashMap <>();
            tempMap3 = new LinkedHashMap <>();

            for (String key : keyword) {
                index = message.indexOf(key);
                while (index >= 0) {
                    tempMap.put(index, key);
                    index = message.indexOf(key, index + key.length());
                }


            }

            for (String ope : op) {
                index2 = message.indexOf(ope.toLowerCase());
                while (index2 >= 0) {
                    tempMap2.put(index2, ope.toLowerCase());
                    index2 = message.indexOf(ope.toLowerCase(), index2 + ope.toLowerCase().length());

                }

            }
            for (String adj1 : adj) {
                index3 = message.indexOf(adj1.toLowerCase());
                while (index3 >= 0) {
                    tempMap3.put(index3, adj1.toLowerCase());
                    index3 = message.indexOf(adj1.toLowerCase(), index3 + adj1.toLowerCase().length());

                }

            }


            result.add(sortValues(tempMap));
            resultForOperators.add(sortValues(tempMap2));
            tempList.add(sortValues(tempMap3));

        }

        displayResults(result);
        displayResults(resultForOperators);
        displayResults(tempList);

    } catch (NullPointerException e) {
        instance.logger.error(e.getMessage());
    } catch (IndexOutOfBoundsException e) {

    }

}

public static List <String> sortValues(Map <Integer, String> tempMap) {
    Map <Integer, String> map = new TreeMap <>(tempMap);
    List <String> sortedValues = new LinkedList <String>(map.values());
    return sortedValues;
}

public void displayResults(List <List <String>> result) {


    for (List <String> list : result) {

        int c = 0;
        for (String value : list) {
            System.out.print(((String) value).replaceAll(" ", "") + " ");
            c++;

        }


        System.out.println();
    }

Выход для этого кода:

   meal dog friend friend 
   cats dog 
   Animals cats Animals 
   is or or and is or 
   are or is and 
   are and are 
   'excellent' 'wonderful' 'acceptable' 'good' 'best' 
   'excellent' 'wonderful' 'excellent' 
   'beautiful'

Желаемый результат:

meal is 'excellent' or meal is 'wonderful'or meal is 'acceptable') and dog is 'good' friend or dog is 'best' friend
cats are 'excellent' or dog is 'wonderful' or dog is 'excellent'
Animals are 'beautiful' and cats are Animals

Я распечатал их все по отдельности, чтобы вы лучше видели, что нужно сделать.

Основная идея заключается в создании валидации Schematron для проверки выражений из данного предложения. Поэтому значения должны повторяться для каждого смежного значения. потому что это синтаксис xPath.

Если есть другой способ описания синтаксиса для XSLT 2.0, например meal is ('excellent', 'wonderful','acceptable'), тогда это было бы идеально, потому что мне не нужно повторять одно и то же значение 3 раза или более для нескольких случаев.

Как я уже говорил, выражение будет превращено в определения xPath.

Операторы могут появляться и в прилегающей части, но, поскольку они записаны в '', они должны учитываться не как операторы, а как строка.

Я прошу прощения за мои ошибки, и если это сложно. Но я очень стараюсь и пока не смог найти хорошего решения этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...