Я пытаюсь сгенерировать данные, которые будут совместимы с форматом, используемым в проекте MedNLI ( MedNLI - Естественный язык в клинических текстах ). Мне известно, что этот проект уже содержит несколько наборов данных (таких как SNLI, MultiNLI и MedNLI), но я хочу воспроизвести те же результаты в своем собственном наборе данных.
Проблема в том, что я не могу кажется, можно создать входные данные в том же формате. Согласно этой статье , образец записи из обучающего набора выглядит так:
{
"sentence1":"Labs were notable for Cr 1.7 (baseline 0.5 per old records) and lactate 2.4.",
"pairID":"23eb94b8-66c7-11e7-a8dc-f45c89b91419",
"sentence1_parse":"(ROOT (S (NP (NNPS Labs)) (VP (VBD were) (ADJP (JJ notable) (PP (IN for) (NP (NP (NP (NN Cr) (CD 1.7)) (PRN (-LRB- -LRB-) (NP (NP (NN baseline) (CD 0.5)) (PP (IN per) (NP (JJ old) (NNS records)))) (-RRB- -RRB-))) (CC and) (NP (NN lactate) (CD 2.4)))))) (. .)))",
"sentence1_binary_parse":"( Labs ( ( were ( notable ( for ( ( ( ( Cr 1.7 ) ( -LRB- ( ( ( baseline 0.5 ) ( per ( old records ) ) ) -RRB- ) ) ) and ) ( lactate 2.4 ) ) ) ) ) . ) )",
"sentence2":" Patient has elevated Cr",
"sentence2_parse":"(ROOT (S (NP (NN Patient)) (VP (VBZ has) (NP (JJ elevated) (NN Cr)))))",
"sentence2_binary_parse":"( Patient ( has ( elevated Cr ) ) )",
"gold_label":"entailment"
}
Это означает, что для каждого предложения я должен сгенерировать sentence_parse
и sentence_binary_parse
. Я использую библиотеку Stanford Parser (в настоящее время Python интерфейс , созданный с использованием JPype Стефаном ie Tellex), чтобы генерировать результаты на моих собственных предложениях.
Мне удалось решить проблему создания sentence_parse
: я использовал синтаксический анализатор Стэнфордского университета, чтобы сгенерировать этот синтаксический анализ; и удалил избыточные данные с помощью простого регулярного выражения.
Но я потратил много времени и не смог сгенерировать часть sentence_binary_parse
. Я пробовал следующие методы:
Я попытался найти соответствующий код в гитхабе MedNLI. Не повезло :( Боюсь, в репозитории нет кода, отвечающего за создание набора данных.
Я попытался взять sentence_parse
и удалить все токены, кроме токенов, из исходное предложение, затем удалив лишние скобки, чтобы получить упрощенный результат. Эта обработка оказалась очень сложной и включает в себя множество крайних случаев, которые, как я беспокоюсь, пропустить.
Потому что я получить объект дерева в анализаторе, я думал, что просто итерация по дереву и его текстовая печать будут работать. Простой фрагмент python для этого:
from stanford_parser.parser import Parser
target_sentence = "Labs were notable for Cr 1.7 (baseline 0.5 per old records) and lactate 2.4."
parser = Parser()
_, tree = parser.parse(target_sentence)
def tree_to_binary_parse(tree):
if tree.isLeaf():
return tree.value() + " "
if len(tree.children()) == 1:
return tree_to_binary_parse(tree.children()[0])
binary_parse = ""
binary_parse += "( "
for child in tree.children():
binary_parse += tree_to_binary_parse(child)
binary_parse += ") "
return binary_parse
print(tree_to_binary_parse(tree))
Но результат неверен - я не получаю того же результата, что и в этом примере записи. Это заставляет меня думать, что я не понимаю, что именно это за формат. Я использовал stanford-parser-corenlp GUI для визуализации дерева Я пытался отформатировать.
Одно предположение, которое у меня было, заключалось в том, что, поскольку дерево не двоичное, я получаю неверные результаты. Поэтому я использовал класс парсера TreeBinarizer
в или der, чтобы преобразовать дерево в двоичное, но результаты все равно неверны.
Я чувствую, что есть что-то тривиальное, чего я здесь скучаю. быть стандартным способом (поскольку SNLI, MultiNLI и MedNLI используют один и тот же формат), но я просто не могу найти документацию или какой-либо простой способ сгенерировать данные таким же образом для моих собственных настраиваемых предложений.
Я очень ценю вашу помощь. Спасибо!