Skip to content

Commit

Permalink
Merge pull request #319 from snipsco/develop
Browse files Browse the repository at this point in the history
Release 0.8.11
  • Loading branch information
ClemDoum authored Jun 27, 2017
2 parents 68413c5 + aa3ae0f commit 52dee6d
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 16 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Snips NLU (0.8.10)
# Snips NLU (0.8.11)

[![Build Status](https://jenkins2.snips.ai/buildStatus/icon?job=SDK/snips-nlu/master)](https://jenkins2.snips.ai/job/SDK/job/snips-nlu/view/Branches/job/master)

Expand Down
2 changes: 1 addition & 1 deletion snips_nlu/__version__
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.8.10
0.8.11
24 changes: 11 additions & 13 deletions snips_nlu/slot_filler/crf_tagger.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,29 +178,27 @@ def from_dict(cls, tagger_config):
return cls(crf_model=crf, features_signatures=features_signatures,
tagging_scheme=tagging_scheme, language=language)

def __del__(self):
if self.crf_model.modelfile.auto \
or self.crf_model.modelfile.name is None:
return
try:
os.remove(self.crf_model.modelfile.name)
except OSError:
pass


def serialize_crf_model(crf_model):
# Make sure there is an existing filename
crf_model.modelfile.ensure_name()
with io.open(crf_model.modelfile.name, mode='rb') as f:
crfsuite_data = base64.b64encode(f.read()).decode('ascii')
# Clean up temp file afterwards
crf_model.modelfile.cleanup()
return crfsuite_data


def deserialize_crf_model(crf_model_data):
b64_data = base64.b64decode(crf_model_data)
with tempfile.NamedTemporaryFile() as f:
with tempfile.NamedTemporaryFile(suffix=".crfsuite", prefix="model",
delete=False) as f:
f.write(b64_data)
f.flush()
crf = CRF(model_filename=f.name)
# We need this line in order to initialize the tagger while the
# tempfile still exists
_ = crf.tagger_
# We then need to set a new file resource for the `modelfile` attribute
# to make sure the model can still be serialized after
crf.modelfile = FileResource(suffix=".crfsuite", prefix="model")
crf.modelfile.ensure_name()

return crf
16 changes: 15 additions & 1 deletion snips_nlu/tests/test_nlu_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ def test_should_use_fitted_tagger(self):

def test_should_be_serializable_after_fitted_tagger_is_added(self):
# Given
text = "Give me 3 cups of hot tea please"
trained_engine = SnipsNLUEngine(Language.EN).fit(BEVERAGE_DATASET)
taggers = trained_engine.probabilistic_parser.crf_taggers
trained_tagger_coffee = taggers["MakeCoffee"]
Expand All @@ -258,8 +259,21 @@ def test_should_be_serializable_after_fitted_tagger_is_added(self):
engine.add_fitted_tagger("MakeCoffee", trained_tagger_data_coffee)
engine.add_fitted_tagger("MakeTea", trained_tagger_data_tea)
engine.fit(BEVERAGE_DATASET, intents=[])

# Then
try:
engine.to_dict()
engine_dict = engine.to_dict()
new_engine = SnipsNLUEngine.from_dict(engine_dict)
result = new_engine.parse(text)
expected_slots = [
ParsedSlot((8, 9), '3', 'snips/number',
'number_of_cups').as_dict(),
ParsedSlot((18, 21), 'hot', 'Temperature',
'beverage_temperature').as_dict()
]
self.assertEqual(result['text'], text)
self.assertEqual(result['intent']['intent_name'], 'MakeTea')
self.assertListEqual(result['slots'], expected_slots)
except Exception, e:
self.fail('Exception raised: %s' % e.message)

Expand Down

0 comments on commit 52dee6d

Please sign in to comment.