Данный конфигурационный файл как таковой из Moses Machine Translation Toolkit:Разбор Moses конфигурационный файл
#########################
### MOSES CONFIG FILE ###
#########################
# input factors
[input-factors]
0
# mapping steps
[mapping]
0 T 0
[distortion-limit]
6
# feature functions
[feature]
UnknownWordPenalty
WordPenalty
PhrasePenalty
PhraseDictionaryMemory name=TranslationModel0 num-features=4 path=/home/gillin/jojomert/phrase-jojo/work.src-ref/training/model/phrase-table.gz input-factor=0 output-factor=0
LexicalReordering name=LexicalReordering0 num-features=6 type=wbe-msd-bidirectional-fe-allff input-factor=0 output-factor=0 path=/home/gillin/jojomert/phrase-jojo/work.src-ref/training/model/reordering-table.wbe-msd-bidirectional-fe.gz
Distortion
KENLM lazyken=0 name=LM0 factor=0 path=/home/gillin/jojomert/ru.kenlm order=5
# dense weights for feature functions
[weight]
UnknownWordPenalty0= 1
WordPenalty0= -1
PhrasePenalty0= 0.2
TranslationModel0= 0.2 0.2 0.2 0.2
LexicalReordering0= 0.3 0.3 0.3 0.3 0.3 0.3
Distortion0= 0.3
LM0= 0.5
Мне нужно прочитать параметры из [weights]
раздела:
UnknownWordPenalty0= 1
WordPenalty0= -1
PhrasePenalty0= 0.2
TranslationModel0= 0.2 0.2 0.2 0.2
LexicalReordering0= 0.3 0.3 0.3 0.3 0.3 0.3
Distortion0= 0.3
LM0= 0.5
Я делал это как таковой :
def read_params_from_moses_ini(mosesinifile):
parameters_string = ""
for line in reversed(open(mosesinifile, 'r').readlines()):
if line.startswith('[weight]'):
return parameters_string
else:
parameters_string+=line.strip() + ' '
, чтобы получить этот результат:
LM0= 0.5 Distortion0= 0.3 LexicalReordering0= 0.3 0.3 0.3 0.3 0.3 0.3 TranslationModel0= 0.2 0.2 0.2 0.2 PhrasePenalty0= 0.2 WordPenalty0= -1 UnknownWordPenalty0= 1
Затем с помощью анализа вывода с
moses_param_pattern = re.compile(r'''([^\s=]+)=\s*((?:[^\s=]+(?:\s|$))*)''')
def parse_parameters(parameters_string):
return dict((k, list(map(float, v.split())))
for k, v in moses_param_pattern.findall(parameters_string))
mosesinifile = 'mertfiles/moses.ini'
print (parse_parameters(read_params_from_moses_ini(mosesinifile)))
получить:
{'UnknownWordPenalty0': [1.0], 'PhrasePenalty0': [0.2], 'WordPenalty0': [-1.0], 'Distortion0': [0.3], 'LexicalReordering0': [0.3, 0.3, 0.3, 0.3, 0.3, 0.3], 'TranslationModel0': [0.2, 0.2, 0.2, 0.2], 'LM0': [0.5]}
В настоящее время решения включать некоторые сумасшедший разворотных линий чтения из файла конфигурации, а затем довольно сложного чтение регулярных выражений, чтобы получить параметры.
Есть ли более простой или менее хакерский/подробный способ чтения файла и достижения желаемого результата словаря параметров?
Возможно ли изменить конфигурационный файл таким образом, чтобы он считывал файл конфигурации moses? Это довольно сложно, потому что в нем есть некоторые ошибочные разделы, которые фактически являются параметрами, например. [distortion-limit]
и нет ключа к значению 6
. В проверенном файле configparse-able это было бы distortion-limit = 6
.
Примечание: Уроженец питон configparser
не может обработать файл с moses.ini
конфигурации. Ответы от How to read and write INI file with Python3? не будут работать.
Если [это сообщение] (http://stackoverflow.com/questions/8884188/how-to-read-and-write-ini- file-with-python) не работает для вас, сообщите об этом. –
@stribizhev, ответ не работает, как указано в вопросе, стандартный configparser не будет работать с ошибочным параметром без ключа. – alvas
Что-то вроде '[входных факторов] \\ n0 \\ n' приведет к сбою' ConfigParser'. – alvas