Member 13310574 Ответов: 0

Могу ли я создать список перестановок для ключа, а затем вызвать этот список в программе, чтобы любой из этих вариантов был принят?


Новичок в программировании :/

внутри программного обеспечения у меня есть значение, связанное с ключом. Иногда используются различные вариации этого ключа (например, lens left, left lens, Lens_L и т. д.). Я использую скрипт для оценки этого значения, связанного с этим ключом, но жестко кодирую каждую возможную вариацию.

Могу ли я создать список (или словарь, коллекцию и т. д.), который я могу вызвать в скрипте, чтобы любая вариация этого ключа была распознана? Вместо того, чтобы вручную вводить каждую вариацию в каждом сценарии?

Я также задаюсь вопросом, Могу ли я создать список вариаций ключа, а затем вызвать этот список в словаре, назначенном ключу? Если да...могу ли я вызвать словарь просто в скрипте, чтобы принять все варианты желаемого ключа?

Заранее спасибо.

Что я уже пробовал:

Я попытался создать хэш-таблицу, но у меня сложилось впечатление, что я могу присвоить только одно значение каждому ключу в хэш-таблице. Это то, что я начал создавать до того, как понял, что у меня может быть только одно значение в каждом ключе...

using System;
using System.Collections;

class Example
{
    public static void Main()
    {
        // create a hash table for structureSetAnatomicalArea

        Hashtable structureSetBrain = new Hashtable();

        // example brain structure set template
        structureSetBrain.Add('brain', 'Brain');
        structureSetBrain.Add('BrainStem', 'brainstem', 'brain stem', 'Brain Stem', 'Brainstem');
        structureSetBrain.Add('BrainStem+3mm', 'Brainstem+3mm', 'BS_3mm', 'BS_3', 'Brainstem_3', 'BrainStem_3', 'BrainStem_PRV', 'Brainstem_PRV', 'Brainstem PRV', 'BrainStem PRV')
        structureSetBrain.Add('Cerebellum', 'cerebellum');
        structureSetBrain.Add('Cerebrum', 'cerebrum');
        structureSetBrain.Add('Chiasm', 'chiasm', 'optic chiasm', 'Optic Chiasm', 'OpticChiasm');
        structureSetBrain.Add('CranialNerve', 'CN', 'Cranial Nerve', 'nerve_cranial', 'CranialNerves', 'cranial nerve');
        structureSetBrain.Add('CN_VII', 'CranialNerve7', 'Seventh Cranial Nerve', 'SeventhCN');
        structureSetBrain.Add('CN_VIII', 'CranialNerve8', 'Eighth Cranial Nerve', 'EighthCN');
        structureSetBrain.Add('Cochlea', 'cochlea');
        structureSetBrain.Add('Cochleas', 'cochleas');
        structureSetBrain.Add('Cochlea_L', 'Left Cochlea', 'Cochlea LT', 'Cochlea_LT', 'Cochlea_Left', 'cochlea_L', 'cochlea_LT', 'left cochlea', 'cochlea lt', 'cochlea_lt', 'cochlea_left');
        structureSetBrain.Add('Cochlea_R', 'Right Cochlea', 'Cochlea RT', 'Cochlea_RT', 'Cochlea_Right', 'cochlea_R', 'cochlea_RT', 'right cochlea', 'cochlea rt', 'cochlea_rt', 'cochlea_right');
        structureSetBrain.Add('Cornea', 'cornea');
        structureSetBrain.Add('Corneas', 'corneas');
        structureSetBrain.Add('Cornea_L', 'Left Cornea', 'Cornea LT', 'Cornea_LT', 'Cornea_Left', 'cornea_L', 'cornea_LT', 'left cornea', 'cornea lt', 'cornea_lt', 'cornea_left');
        structureSetBrain.Add('Cornea_R', 'Right Cornea', 'Cornea RT', 'Cornea_RT', 'Cornea_Right', 'cornea_R', 'cornea_RT', 'right cornea', 'cornea rt', 'cornea_rt', 'cornea_right');
        structureSetBrain.Add('Eye', 'eye', 'Globe', 'globe');
        structureSetBrain.Add('Eyes', 'eyes', 'Globes', 'globes');
        structureSetBrain.Add('Eye_L', 'Left Eye', 'Eye LT', 'Eye_LT', 'Eye_Left', 'eye_L', 'eye_LT', 'left eye', 'eye lt', 'eye_lt', 'eye_left', 'Globe_L', 'Left Globe', 'Globe LT', 'Globe_LT', 'Globe_Left', 'globe_L', 'globe_LT', 'left globe', 'globe lt', 'globe_lt', 'globe_left');
        structureSetBrain.Add('Eye_R', 'Right Eye', 'Eye RT', 'Eye_RT', 'Eye_Right', 'eye_R', 'eye_RT', 'right eye', 'eye rt', 'eye_rt', 'eye_right', 'Globe_R', 'Right Globe', 'Globe RT', 'Globe_RT', 'Globe_Right', 'globe_R', 'globe_RT', 'right globe', 'globe rt', 'globe_rt', 'globe_right');
        structureSetBrain.Add('FrontalLobe', 'frontalLobe', 'frontallobe', 'frontal lobe', 'Frontal_Lobe', 'frontal_lobe');
        structureSetBrain.Add('Hippocampus', 'hippocampus');
        structureSetBrain.Add('Hypothalamus', 'hypothalamus');
        structureSetBrain.Add('LacrimalGland', 'lacrimalgland', 'lacrimal gland');
        structureSetBrain.Add('LacrimalGlands', 'lacrimalglands', 'lacrimal glands');
        structureSetBrain.Add('Lacrimal_L', 'Left Lacrimal', 'Lacrimal LT', 'Lacrimal_LT', 'Lacrimal_Left', 'lacrimal_L', 'lacrimal_LT', 'left lacrimal', 'lacrimal lt', 'lacrimal_lt', 'lacrimal_left');
        structureSetBrain.Add('Lacrimal_R', 'Right Lacrimal', 'Lacrimal RT', 'Lacrimal_RT', 'Lacrimal_Right', 'lacrimal_R', 'lacrimal_RT', 'right lacrimal', 'lacrimal rt', 'lacrimal_rt', 'lacrimal_right');
        structureSetBrain.Add('Lens', 'lens');
        structureSetBrain.Add('Lenses', 'lenses');
        structureSetBrain.Add('Lens_L', 'Left Lens', 'Lens LT', 'Lens_LT', 'Lens_Left', 'lens_L', 'lens_LT', 'left lens', 'lens lt', 'lens_lt', 'lens_left');
        structureSetBrain.Add('Lens_R', 'Right Lens', 'Lens RT', 'Lens_RT', 'Lens_Right', 'lens_R', 'lens_RT', 'right lens', 'lens rt', 'lens_rt', 'lens_right');
        structureSetBrain.Add('OccipitalLobe', 'Occipital Lobe', 'occ lobe', 'occ_lobe', 'occipitalLobe', 'occLobe');
        structureSetBrain.Add('OpticNerve', 'Optic Nerve', 'optic nerve', 'opticNerve', 'Optic nerve');
        structureSetBrain.Add('OpticNerves', 'Optic Nerves', 'optic nerves', 'opticNerves', 'Optic nerves');
        structureSetBrain.Add('OpticNerve_L', 'OpticNerve_LT', 'opticnerve_L', 'opticnerve_LT', 'ON_L', 'ON_LT', 'ON_lt', 'ON_Left', 'ON_left', 'on_L', 'on_LT', 'on_left', 'on_Left');
        structureSetBrain.Add('OpticNerve_R', 'OpticNerve_RT', 'opticnerve_R', 'opticnerve_RT', 'ON_R', 'ON_RT', 'ON_rt', 'ON_Right', 'ON_right', 'on_R', 'on_RT', 'on_right', 'on_Right');
        structureSetBrain.Add('ParietalLobe', 'Parietal Lobe', 'parietallobe', 'parietalLobe', 'parLobe');
        structureSetBrain.Add('ParietLobe_L', 'ParLobe_L', 'ParietLobe_LT', 'ParLobe_LT', 'ParietLobe Lt', 'ParietLobe_Lt', 'ParietLobe_l', 'ParietLobe_lt, Parietal_L', 'Parietal_LT', 'Parietal_l', 'Parietal_lt', 'parlobe_L', 'parietlobe_LT', 'parlobe_LT', 'parietlobe_l', 'parietlobe_lt, parietal_L', 'parietal_LT', 'parietal_l', 'parietal_lt');
        structureSetBrain.Add('ParietLobe_R', 'ParLobe_R', 'ParietLobe_RT', 'ParLobe_RT', 'ParietLobe Rt', 'ParietLobe_Rt', 'ParietLobe_r', 'ParietLobe_rt, Parietal_R', 'Parietal_RT', 'Parietal_r', 'Parietal_rt', 'parlobe_R', 'parietlobe_RT', 'parlobe_RT', 'parietlobe_r', 'parietlobe_rt, parietal_R', 'parietal_RT', 'parietal_r', 'parietal_rt');
        structureSetBrain.Add('Pituitary', 'pituitary');
        structureSetBrain.Add('Retina', 'retina');
        structureSetBrain.Add('Retinae', 'Retinas', 'retinae', 'retinas');
        structureSetBrain.Add('Retina_L', 'Left Retina', 'Retina LT', 'Retina_LT', 'Retina Lt', 'Retina_Lt', 'Retina_Left', 'retina_L', 'retina_LT', 'left retina', 'retina lt', 'retina_lt', 'retina_left');
        structureSetBrain.Add('Retina_R', 'Right Retina', 'Retina RT', 'Retina_RT', 'Retina Rt', 'Retina_Rt', 'Retina_Right', 'retina_R', 'retina_RT', 'right retina', 'retina rt', 'retina_rt', 'retina_right');
        structureSetBrain.Add('SpinalCord', 'Spinal Cord', 'spinalcord', 'spinal cord', 'Cord', 'cord');
        structureSetBrain.Add('SpinalCord+5mm', 'spinalcord+5mm', 'Spinal Cord+5', 'Cord+5mm', 'cord+5mm', 'Cord PRV', 'cord PRV', 'cord_PRV', 'cord_5', 'cord_5mm', 'SpinalCord_5', 'SpinalCord_5mm', 'spinalcord_5');
        structureSetBrain.Add('TemporalLobe', 'Temporal Lobe', 'temporallobe', 'temporalLobe', 'tempLobe');
        structureSetBrain.Add('TempLobe_L', 'TempLobe_L', 'TempLobe_LT', 'TempLobe Lt', 'TempLobe_Lt', 'TempLobe_l', 'TempLobe_lt, Temporal_L', 'Temporal_LT', 'Temporal_l', 'Temporal_lt', 'templobe_L', 'templobe_LT', 'templobe_LT', 'templobe_l', 'templobe_lt, temporal_L', 'temporal_LT', 'temporal_l', 'temporal_lt');
        structureSetBrain.Add('TempLobe_R', 'TempLobe_R', 'TempLobe_RT', 'TempLobe Rt', 'TempLobe_Rt', 'TempLobe_r', 'TempLobe_rt, Temporal_R', 'Temporal_RT', 'Temporal_r', 'Temporal_rt', 'templobe_R', 'templobe_RT', 'templobe_RT', 'templobe_r', 'templobe_rt, temporal_R', 'temporal_RT', 'temporal_r', 'temporal_rt');
    }
}
}

Dave Kreskowiak

Откуда берутся входные данные, которые должны быть сопоставлены с этим "словарем"? Это файл? Текстовое поле на странице / форме? Пользователь, введенный в какое-то другое программное обеспечение?

Самый простой способ избавиться от текста в свободной форме-использовать поля со списком или другие структурированные входные данные для поддержания согласованности.

Member 13310574

Спасибо за ваш ответ!

Прошу прощения за отсутствие ясности. Я думаю, что изложить проблему более просто поможет. Поэтому я работаю в программном обеспечении, которое присваивает числовое значение вокселям в 3D-наборах данных. Создаются структуры, которые расширяют части этих наборов данных. Эти структуры имеют фундаментальное название, например, спинной мозг,но могут быть названы различными способами, например, спинной мозг, спинной мозг, спинной мозг и т. д. [или для более боковой структуры , например, глобус ЛТ Globe_L, слева нормальный вентиль, etc.]

В настоящее время мы запускаем скрипт, который будет искать структуру в программном обеспечении, а затем создает отчет со значениями, связанными с каждой структурой. Я хотел бы иметь возможность создать словарь, коллекцию, модуль и т. д., который будет перечислять имена переменных для каждой структуры, которую я затем могу вызвать в скрипте, чтобы мне не приходилось каждый раз жестко кодировать каждый из вариантов. (и я предполагаю, что это позволит мне каждый раз вносить изменения в списки вместо кода, если это необходимо.)

Смогу ли я это сделать?

BillWoodruff

Вопрос Дейва об источнике данных очень важен !

Вам нужно решить, нужен ли вам "плоский" список пар ключ-значение или какая-то древовидная/графовая структура, воплощающая иерархию. Мне кажется, вы имеете дело с классификационной системой, с таксономией. Это наводит меня на мысль о простой древовидной структуре. А ты как думаешь ?

Member 13310574

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

Dave Kreskowiak

Нет, это не так. Создается впечатление, что вы допускаете свободный ввод текста в то, что генерирует эти структуры. Так ли это на самом деле?

Если это так, то это огромная проблема для вас, потому что "словарь" любого рода не будет улавливать орфографические ошибки. Это потребовало бы какого-то нечеткого сопоставления строк, которое не будет совпадать в 100% случаев.

Поэтому возникает еще один вопрос. Насколько точным должен быть ваш процесс?

Member 13310574

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

if (searchString.IndexOf ("плечевое сплетение LT", StringComparison.OrdinalIgnoreCase) &ГТ;= 0) { строка[] выход = { "BrachialPlexus", "плечевое сплетение ЛТ", "на плечевом ЛТ", "сплетение ЛТ" };
if (searchString.IndexOf ("плечевое сплетение RT", StringComparison.OrdinalIgnoreCase) &ГТ;= 0) { строка[] выход = { "BrachialPlexus", "плечевое сплетение РТ", "на плечевом РТ", "РТ сплетения" };
...прием

Dave Kreskowiak

Ладно, вы совершенно упускаете суть и не отвечаете на важные вопросы.

Если человек участвует, набирая эти имена, которые вы пытаетесь проверить, ваша работа невероятно трудна и не для новичка.

Member 13310574

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

Мне просто любопытно, есть ли инструмент (коллекции, словари, списки и т. д.), который я мог бы создать (который включал бы все структуры, которые я хочу, чтобы программа искала и извлекала данные), который затем мог бы быть вызван в строке кода, которая позволила бы мне попросить программу найти весь список имен и сопоставить их с другим списком, коллекцией и т. д. variations...as в отличие от написания каждой строки кода для каждой структуры.

или, возможно, список определений для каждой отдельной структуры (в отличие от списка множества структур), которые могут быть вызваны для упрощения блоков пишущегося кода.


И на ваш первый вопрос...это от входа пользователя в другое программное обеспечение. (это та часть, которая стандартизирована)

Кажется, что для этого по-прежнему требуется строка кода для каждого запроса моей программы для поиска имени структуры, а затем для возврата значения, связанного с этой структурой в другой программе ... только для этого потребуется меньше вариантов для поиска с стандартизированное соглашение об именах. Я хотел бы иметь возможность писать строки кода, которые будут искать структуры из списка (на простом английском языке, например, спинной мозг, ствол мозга, левый зрительный нерв) и сопоставлять их с соответствующим списком приемлемых соответствующих определений (например, SpinalCord , BrainStem, OpticNerve_L), а не из уникальной структуры, указанной в этой строке кода.

что-то вроде (на простом английском)

если какие-либо структуры найдены в (dict(structureSetBrain)
возврат (значения дозы, связанные с каждой найденной структурой)

в отличие от блока кода для каждой уникальной структуры.

Еще раз спасибо за ваше время и терпение с моим "новичком"

Dave Kreskowiak

Хорошо, если вы не можете изменить другое приложение, вы можете "стандартизировать" вещи все, что хотите. Вы не можете контролировать отсутствие у пользователей способности правильно печатать и писать, не говоря уже о том, чтобы заставить их следовать "правилам".

Работа с текстом в свободной форме-это, одним словом, ад. Это заведомо сложно из-за бесчисленных способов, которыми пользователь может испортить его. Судя по коду, который вы уже показали, и по обсуждению до сих пор, вы действительно не представляете, насколько сложна эта задача.

Во-первых, я согласен с Биллом, что наилучшим подходом будет древовидная структура, или граф. Вам также понадобится алгоритм нечеткого сопоставления строк. Это вернет одно или несколько возможных совпадений, обычно с уровнем уверенности, который алгоритм считает лучшим совпадением.

Эта древовидная структура может быть заполнена начальным набором значений того, что, как вы знаете, должно использоваться (нет, вы не выходите из набора набора идентификаторов!). Вы будете "тренировать" алгоритм по мере его использования, потому что в самом начале он не будет знать, сколько элементов он не может сопоставить. Вам придется научить его, что это за нестандартные имена, выстраивая дерево.

Данные дерева могут быть сериализованы на диск или в базу данных.

Вы не будете вводить все возможные идентификаторы, которые он может видеть. Только те, которые вы стандартизируете.

Как я уже сказал, это не то, что "новичок в программировании" сможет легко провернуть. Это, вероятно, займет у вас месяцы, чтобы узнать и понять.

Member 13310574

Я прошу прощения за то, что не дал вам всей информации. Я пытался задавать свои вопросы без объяснения используемого программного обеспечения и т. д. В основном потому, что я работаю в случайной области здравоохранения.

Таким образом, можно сделать некоторые предположения относительно входных данных. 1) пользователь действительно имеет свободу ввода, но я и другие люди в моем офисе и/или конкретной области также являются пользователями. 2) из-за этого мы можем стандартизировать имена для ввода, что должно сделать его проще. 3) я не единственный человек, работающий над подобными проблемами в нашем отделе, и есть несколько человек, которые намного превосходят меня в программировании, машинном обучении и т. д. (Я просто пытаюсь учиться).

Похоже, что нечеткая строка, соответствующая alg, может быть полезна! Спасибо за предложение!

Наверное, я надеялся, что если у вас есть анатомический участок (например, мозг) со списком структур, для которых вам нужна программа для поиска и сбора конкретных данных, то вы можете попросить ее найти все структуры из списка потенциальных структур, а затем извлечь данные для каждой из них. вместо того чтобы просить его искать каждую структуру по отдельности, попросите его извлекать данные, а затем повторять для каждой дополнительной структуры, которую вы хотели, чтобы он искал.

// похоже, мне нужно написать строку кода для каждого
найти мозг, собрать данные
найдите левый зрительный нерв, соберите данные
найти хиазм, собрать данные
и т.д.

// в то время как я хотел бы написать что-то вроде этого
находите структуры из structureSetBrain, собирайте данные

или есть что-то, что будет выглядеть так?

//structureName = (idealName: 'variantName1', 'variantName2' и т. д)
structureLeftGlobe = (Globe_L: 'левый шар", "Globe_Lt', 'Глобус ЛТ', 'Глобус, л', 'Eye_L', 'левый глаз', 'Eye_Lt', 'глаз л', 'глаз л')

это позволило бы мне вставить structureLeftGLobe, и он знал бы, что может принять другие имена, связанные с ним?

Если да, то должен ли я определить эти имена переменных структур в самом коде или могу создать отдельный список в другом месте, а затем вызвать этот список в коде?

//что-то вроде
от structureSetBrain
найдите structureLeftGlobe, соберите данные

Dave Kreskowiak

Ты думаешь об этом неправильно. Вы продолжаете вводить явные данные в код, и вы должны научиться не делать этого. Код должен управлять данными, а не быть их хранилищем.

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

Как я уже сказал, вам не нужно иметь опыт, чтобы написать это приложение. Дело не в том, что у вас нет возможности писать код. Это отсутствие способности правильно разбивать проблемы для решения на все меньшие и меньшие разрешимые части.

Member 13310574

Да, это деф имеет смысл! Я просто пытаюсь написать сценарий, который я могу запустить в программном обеспечении, которое создаст отчет для меня. Не обязательно отдельная часть программного обеспечения.

Как мне написать менее явную строку кода, которая будет делать то, что я хочу? Есть ли конкретное направление, в котором я должен смотреть?

Спасибо за вашу помощь! Я действительно ценю все то время, которое вы потратили на это :)

Dave Kreskowiak

Вы, очевидно, не читали то, что мы опубликовали.

Это никогда не будет "сценарием". То, что вы описываете, диктует, что это собственная часть программного обеспечения и довольно большой проект.

Member 13310574

Да, я думаю, что есть какое-то недопонимание. Было бы намного проще, если бы я мог показать тебе.

В настоящее время мы используем сценарий, который проверяет рецепт на наличие уникальных структур, и если он их находит, он переходит в другое программное обеспечение (они находятся в той же среде и могут взаимодействовать друг с другом) и собирает желаемые данные для структур. В настоящее время мы пишем строки кода, чтобы указать каждую уникальную структуру (не обращая внимания на тот факт, что мы должны учитывать различные варианты). Все, что мне было интересно, это то, могу ли я создать список структур, которые я хотел бы найти в рецепте при запуске скрипта, а затем написать более простую строку кода, которая будет искать структуры в указанном списке, а не необходимость писать строки кода для каждой уникальной структуры.

Dave Kreskowiak

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

Вы все еще не обходите проблему, что вы должны ввести каждую перестановку в файл, и вы все еще не обходите проблему, что чем больше вы помещаете в этот файл, тем медленнее будет работать код.

Member 13310574

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

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

Я понимаю, что раздражаю вас своим незнанием предмета, и ценю ваше время. Спасибо.

0 Ответов