Конвертировать словари Python в MATLAB

1

У меня есть список словарей python, сохраненных текстовыми файлами в такой форме:

TEST BayesianSearch: Fold 1 results: {'AUC': 0.02361111111111111, 'precision': 0.012, 'recall': 0.0034607372805101266, 'map': 0.006173611111111111, 'NDCG': 0.0038391623343341052, 'MRR': 0.024472222222222218, 'F1': 0.005372169077405249, 'HR': 0.048, 'ARHR': 0.02458333333333333}

TEST BayesianSearch: Fold 2 results: {'AUC': 0.034277777777777775, 'precision': 0.016416666666666666, 'recall': 0.003939761087163834, 'map': 0.009020833333333329, 'NDCG': 0.0052255728628175955, 'MRR': 0.035861111111111094, 'F1': 0.006354527945317168, 'HR': 0.06566666666666666, 'ARHR': 0.0359722222222222}

В MATLAB,

  • Как я могу найти, начиная с TEST BayesianSearch: Fold я results, где я = 1, 2, 3, 4, 5?
  • С этих строк, как я могу получить номера?
  • 0
    Это звучит как вопрос Matlab, а не как вопрос Python, поскольку ваши данные сохраняются в формате txt, и вы хотите загрузить и проанализировать их в Matlab.
Теги:
parsing

1 ответ

1

Задача может быть выполнена хорошо с использованием регулярных выражений Matlab, которая поддерживает именованные группы захвата. Использование именованных групп захвата в Matlab удобно, потому что regexp автоматически создает для вас структуру с названными группами захвата в качестве полей при использовании правильных names ключевых слов.

Для векторных символов ул и регулярное выражение выражения с names ключевое слово, определенное в документации говорится:

Если str и выражение являются символьными векторами или строковыми скалярами, выход представляет собой 1-на-структуру структуры, где n - количество совпадений. Имена полей структуры соответствуют именам токенов.

Регулярное выражение, которое я использовал для задачи, следующее:

(?:TEST.*?(?=\d\.))(?<AUC>\d*\.\d*)(?:[,\s'a-z:]*)(?<precision>\d*\.\d*)(?:[,\s'a-z:]*)(?<recall>\d*\.\d*)(?:[,\s'a-z:]*)(?<map>\d*\.\d*)(?:[,\s'AZ:]*)(?<NDCG>\d*\.\d*)(?:[,\s'AZ:]*)(?<MMR>\d*\.\d*)(?:[,\s'AZ:]*\d':\s)(?<F1>\d*\.\d*)(?:[,\s'AZ:]*)(?<HR>\d*\.\d*)(?:[,\s'AZ:]*)(?<ARHR>\d*\.\d*)

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


Объяснение регулярного выражения:

  • (?:TEST.*?(?=\d\.)) Сопоставьте, но не фиксируйте TEST, и используйте положительный результат, чтобы соответствовать всем, вплоть до первого числа, за которым следует десятичная точка.
  • (?<AUC>\d*\.\d*) Захват группы с именем AUC, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'a-z:]*) Совпадают, но не захватывают все в классе символов, который включает в себя: запятую, пробел, апостроф, символы ASCII в нижнем регистре и двоеточие.
  • (?<precision>\d*\.\d*) Захват группы с именем precision, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'a-z:]*) Совпадают, но не захватывают все в классе символов, который включает в себя: запятую, пробел, апостроф, символы ASCII в нижнем регистре и двоеточие.
  • (?<recall>\d*\.\d*) Захват группы с именем recall, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'a-z:]*) Совпадают, но не захватывают все в классе символов, который включает в себя: запятую, пробел, апостроф, символы ASCII в нижнем регистре и двоеточие.
  • (?<map>\d*\.\d*) Захват группы с именем map, захватывает цифры, десятичную точку и другие цифры.
  • (?:[,\s'AZ:]*) но не захватывает все в классе символов, который включает в себя: запятую, пробел, апостроф, символы ASCII верхнего регистра и двоеточие.
  • (?<NDCG>\d*\.\d*) Захват группы с именем NDCG, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'AZ:]*) но не захватывает все в классе символов, который включает в себя: запятую, пробел, апостроф, символы ASCII верхнего регистра и двоеточие.
  • (?<MMR>\d*\.\d*) Захват группы с именем MMR, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'AZ:]*\d':\s) Совпадают, но не захватывают все в классе символов, которое включает в себя: запятую, пробел, апостроф, символы ASCII более высокого кода и двоеточие. Затем следует цифра, апостроф, двоеточие и пробелы.
  • (?<F1>\d*\.\d*) Захват группы с именем F1, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'AZ:]*) но не захватывает все в классе символов, который включает в себя: запятую, пробел, апостроф, символы ASCII верхнего регистра и двоеточие.
  • (?<HR>\d*\.\d*) Захват группы с именем HR, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'AZ:]*) но не захватывает все в классе символов, который включает в себя: запятую, пробел, апостроф, символы ASCII верхнего регистра и двоеточие.
  • (?<ARHR>\d*\.\d*) Захват группы с именем ARHR, фиксирует цифры, десятичную точку и другие цифры.

Реализация Matlab:

Прочитайте свой текстовый файл с fileread и реализуйте регулярное выражение.

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

data = fileread('mytext.txt');
alldata = regexp(data,"(?:TEST.*?(?=\d\.))(?<AUC>\d*\.\d*)(?:[,\s'a-z:]*)(?<precision>\d*\.\d*)(?:[,\s'a-z:]*)(?<recall>\d*\.\d*)(?:[,\s'a-z:]*)(?<map>\d*\.\d*)(?:[,\s'A-Z:]*)(?<NDCG>\d*\.\d*)(?:[,\s'A-Z:]*)(?<MMR>\d*\.\d*)(?:[,\s'A-Z:]*\d':\s)(?<F1>\d*\.\d*)(?:[,\s'A-Z:]*)(?<HR>\d*\.\d*)(?:[,\s'A-Z:]*)(?<ARHR>\d*\.\d*)",'names')

Результатом реализованного кода является массив структур 1 × 2 с названными группами захвата в виде полей.

alldata(1):

AUC: '0.02361111111111111'
precision: '0.012'
recall: '0.0034607372805101266'
map: '0.006173611111111111'
NDCG: '0.0038391623343341052'
MMR: '0.024472222222222218'
F1: '0.005372169077405249'
HR: '0.048'
ARHR: '0.02458333333333333'

alldata(2):

AUC: '0.034277777777777775'
precision: '0.016416666666666666'
recall: '0.003939761087163834'
map: '0.009020833333333329'
NDCG: '0.0052255728628175955'
MMR: '0.035861111111111094'
F1: '0.006354527945317168'
HR: '0.06566666666666666'
ARHR: '0.0359722222222222'

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню