У меня есть список словарей 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? Задача может быть выполнена хорошо с использованием регулярных выражений 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
. Обратите внимание, что для численных расчетов вам нужно будет преобразовать поля из символьных векторов в двойные.