Замена цифр существительным с использованием хэш-карты

Мое входное предложение:

баран где ты

После этого я получу это дерево разбора:

' 2|TYPE|nx0e-VPadjn-Vnx1 1|RPron|nx-RP-S 0|NOUN|NXN 3|NOUN|NXN ', '1'

Я хочу заменить 2 на 'are' 1 на 'where' и ram на 0 .

Как я должен сделать это с хэш-картой?

1 ответ

Этот ответ основан на множестве предположений, так как ваш вопрос недостаточно ясен. Но мне не хватает представителя, чтобы комментировать.

Если вы используете String.split() во входном предложении как:

String[] words = "ram where are you".split(" ");
// words[0] => ram
// words[1] => where
// words[2] => are
// words[3] => you

Похоже, что ваше дерево разбора было сгенерировано путем анализа входного предложения.
Каждая запись в первом разделе дерева разбора соответствует слову во входном предложении.
Кажется, что первая цифра в записи разбора соответствует индексу каждого слова во входном предложении.

Таким образом, запись разбора может быть разбита как: <word index>|<word category>|<something not clear>

Ну, это похоже

2|TYPE|nx0e-VPadjn-Vnx1 => are
1|RPron|nx-RP-S => where
0|NOUN|NXN => ram
3|NOUN|NXN => you

На основании этих предположений можно использовать хэш-карту, созданную с использованием записей дерева разбора.
Вам нужно будет поместить анализируемые записи в карту, используя key = <word index>; value = <parse entry>,
Это можно сделать, разделив дерево разбора на записи и затем получив <word index> с каждой записи.

После того, как эта карта построена, вы можете обрабатывать входные предложения и анализировать записи дерева как:

String[] words = "ram where are you".split(" ");

Map<Integer, String> entriesMap = getEntriesMap(parseTree); // assuming parseTree is just a String

for(int i = 0; i < words.length; i++) {
    String x = entriesMap.get(i).replaceAll("^" + i + "|", words[i]);
}

Способ заполнения карты. Есть несколько способов сделать это.
Использование классов Pattern и Matcher с правильным регулярным выражением, вероятно, является лучшим способом.

private Map<Integer, String> getEntriesMap(String parseTree) {
    Map<Integer, String> entriesMap = new LinkedHashMap<Integer, String>();

    // assuming parseTree format as: '<parse entries separated by spaces>', '1'
    // use String.split() to split the parseTree by single quote (')
    // first element in returning array would contain the <parse entries separated by spaces>
    // use String.split() again on that element with space to separate parse entries
    // for each <entry> in <parse entries>
    //     split <entry> with pipe (|) and use first element in resulting array as the key and <entry> as the value to put in entriesMap

    return entriesMap;
}

Не могу понять, что ,'1' в конце разбора дерево соответствует.

Другие вопросы по тегам