【发布时间】:2016-03-12 01:20:30
【问题描述】:
给定一个来自Moses Machine Translation Toolkit的配置文件:
#########################
### 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]}
当前的解决方案涉及从配置文件中读取一些疯狂的反转行,然后读取非常复杂的正则表达式来获取参数。
是否有更简单或更简单的方法来读取文件并实现所需的参数字典输出?
是否可以更改 configparser 使其读取 moses 配置文件?这很难,因为它有一些实际上是参数的错误部分,例如[distortion-limit] 并且没有值 6 的密钥。在经过验证的 configparse-able 文件中,它应该是 distortion-limit = 6。
注意:原生 python configparser 无法处理 moses.ini 配置文件。 How to read and write INI file with Python3? 的回答无效。
【问题讨论】:
-
如果this post 不适合您,请告知。
-
@stribizhev,答案不起作用,如问题中所述,标准配置解析器无法使用没有密钥的错误参数。
-
[input-factors]\\n0\\n之类的东西会导致ConfigParser失败。 -
这很简单。可以使用正则表达式来完成。不同之处在于它可以有不同的键/值形式,机器人单个和多个,具体取决于哪个部分。这意味着这些表格是基于恒定部分预先设计的。我是对的吗?那么,您是要解析整个内容,还是只解析
weight部分?如果您只是在寻找该部分,则可以使用import regex然后使用\G锚来查找键/值。无需将其分解并加入特殊形式。
标签: python regex parsing configparser moses