Just to clarify a bit the answer by Lishu (which is correct but might confuse other readers as it did to me until I tried it). This:
{“string_key”: float_weight, ...} dict where keys are observed features and values are their weights
could have been written as
{“feature_template_name”: feature_value, ...} dict where keys are feature names and values are their values
i.e. with this you're not setting the weight for the CRF corresponding to this feature_template, but the value of this feature. I prefer to refer to them feature templates that have feature values, so that everything is more clear than just "features". Then, the CRF will learn a weight associated to each of the possible feature_values for this feature_template