2019-03-19 23:43:48 +03:00
|
|
|
# coding: utf-8
|
2019-03-22 18:18:04 +03:00
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
2019-03-19 19:39:35 +03:00
|
|
|
import pytest
|
|
|
|
|
|
|
|
from spacy.kb import KnowledgeBase
|
2019-03-22 01:17:25 +03:00
|
|
|
from spacy.lang.en import English
|
2019-03-19 19:39:35 +03:00
|
|
|
|
|
|
|
|
2019-03-22 01:17:25 +03:00
|
|
|
@pytest.fixture
|
|
|
|
def nlp():
|
|
|
|
return English()
|
|
|
|
|
|
|
|
|
|
|
|
def test_kb_valid_entities(nlp):
|
|
|
|
"""Test the valid construction of a KB with 3 entities and two aliases"""
|
2019-06-05 19:29:18 +03:00
|
|
|
mykb = KnowledgeBase(nlp.vocab, entity_vector_length=1)
|
2019-03-19 19:39:35 +03:00
|
|
|
|
|
|
|
# adding entities
|
2019-06-05 19:29:18 +03:00
|
|
|
mykb.add_entity(entity=u'Q1', prob=0.9, entity_vector=[1])
|
|
|
|
mykb.add_entity(entity=u'Q2', prob=0.5, entity_vector=[2])
|
|
|
|
mykb.add_entity(entity=u'Q3', prob=0.5, entity_vector=[3])
|
2019-03-19 19:39:35 +03:00
|
|
|
|
|
|
|
# adding aliases
|
2019-03-22 16:15:18 +03:00
|
|
|
mykb.add_alias(alias=u'douglas', entities=[u'Q2', u'Q3'], probabilities=[0.8, 0.2])
|
|
|
|
mykb.add_alias(alias=u'adam', entities=[u'Q2'], probabilities=[0.9])
|
2019-03-19 23:50:32 +03:00
|
|
|
|
|
|
|
# test the size of the corresponding KB
|
|
|
|
assert(mykb.get_size_entities() == 3)
|
|
|
|
assert(mykb.get_size_aliases() == 2)
|
2019-03-19 19:39:35 +03:00
|
|
|
|
|
|
|
|
2019-03-22 01:17:25 +03:00
|
|
|
def test_kb_invalid_entities(nlp):
|
2019-03-19 23:43:48 +03:00
|
|
|
"""Test the invalid construction of a KB with an alias linked to a non-existing entity"""
|
2019-06-05 19:29:18 +03:00
|
|
|
mykb = KnowledgeBase(nlp.vocab, entity_vector_length=1)
|
2019-03-19 19:39:35 +03:00
|
|
|
|
|
|
|
# adding entities
|
2019-06-05 19:29:18 +03:00
|
|
|
mykb.add_entity(entity=u'Q1', prob=0.9, entity_vector=[1])
|
|
|
|
mykb.add_entity(entity=u'Q2', prob=0.2, entity_vector=[2])
|
|
|
|
mykb.add_entity(entity=u'Q3', prob=0.5, entity_vector=[3])
|
2019-03-19 19:39:35 +03:00
|
|
|
|
|
|
|
# adding aliases - should fail because one of the given IDs is not valid
|
|
|
|
with pytest.raises(ValueError):
|
2019-03-22 16:15:18 +03:00
|
|
|
mykb.add_alias(alias=u'douglas', entities=[u'Q2', u'Q342'], probabilities=[0.8, 0.2])
|
2019-03-19 19:39:35 +03:00
|
|
|
|
2019-03-19 23:43:48 +03:00
|
|
|
|
2019-03-22 01:17:25 +03:00
|
|
|
def test_kb_invalid_probabilities(nlp):
|
2019-03-19 23:43:48 +03:00
|
|
|
"""Test the invalid construction of a KB with wrong prior probabilities"""
|
2019-06-05 19:29:18 +03:00
|
|
|
mykb = KnowledgeBase(nlp.vocab, entity_vector_length=1)
|
2019-03-19 23:43:48 +03:00
|
|
|
|
|
|
|
# adding entities
|
2019-06-05 19:29:18 +03:00
|
|
|
mykb.add_entity(entity=u'Q1', prob=0.9, entity_vector=[1])
|
|
|
|
mykb.add_entity(entity=u'Q2', prob=0.2, entity_vector=[2])
|
|
|
|
mykb.add_entity(entity=u'Q3', prob=0.5, entity_vector=[3])
|
2019-03-19 23:43:48 +03:00
|
|
|
|
|
|
|
# adding aliases - should fail because the sum of the probabilities exceeds 1
|
|
|
|
with pytest.raises(ValueError):
|
2019-03-22 16:15:18 +03:00
|
|
|
mykb.add_alias(alias=u'douglas', entities=[u'Q2', u'Q3'], probabilities=[0.8, 0.4])
|
2019-03-19 23:43:48 +03:00
|
|
|
|
2019-03-19 23:55:10 +03:00
|
|
|
|
2019-03-22 01:17:25 +03:00
|
|
|
def test_kb_invalid_combination(nlp):
|
2019-03-19 23:55:10 +03:00
|
|
|
"""Test the invalid construction of a KB with non-matching entity and probability lists"""
|
2019-06-05 19:29:18 +03:00
|
|
|
mykb = KnowledgeBase(nlp.vocab, entity_vector_length=1)
|
2019-03-19 23:55:10 +03:00
|
|
|
|
|
|
|
# adding entities
|
2019-06-05 19:29:18 +03:00
|
|
|
mykb.add_entity(entity=u'Q1', prob=0.9, entity_vector=[1])
|
|
|
|
mykb.add_entity(entity=u'Q2', prob=0.2, entity_vector=[2])
|
|
|
|
mykb.add_entity(entity=u'Q3', prob=0.5, entity_vector=[3])
|
2019-03-19 23:55:10 +03:00
|
|
|
|
|
|
|
# adding aliases - should fail because the entities and probabilities vectors are not of equal length
|
|
|
|
with pytest.raises(ValueError):
|
2019-03-22 16:15:18 +03:00
|
|
|
mykb.add_alias(alias=u'douglas', entities=[u'Q2', u'Q3'], probabilities=[0.3, 0.4, 0.1])
|
2019-03-19 23:55:10 +03:00
|
|
|
|
2019-03-21 14:48:59 +03:00
|
|
|
|
2019-06-05 19:29:18 +03:00
|
|
|
def test_kb_invalid_entity_vector(nlp):
|
|
|
|
"""Test the invalid construction of a KB with non-matching entity vector lengths"""
|
|
|
|
mykb = KnowledgeBase(nlp.vocab, entity_vector_length=3)
|
|
|
|
|
|
|
|
# adding entities
|
|
|
|
mykb.add_entity(entity=u'Q1', prob=0.9, entity_vector=[1, 2, 3])
|
|
|
|
|
|
|
|
# this should fail because the kb's expected entity vector length is 3
|
|
|
|
with pytest.raises(ValueError):
|
|
|
|
mykb.add_entity(entity=u'Q2', prob=0.2, entity_vector=[2])
|
|
|
|
|
|
|
|
|
2019-03-22 01:17:25 +03:00
|
|
|
def test_candidate_generation(nlp):
|
2019-03-21 14:48:59 +03:00
|
|
|
"""Test correct candidate generation"""
|
2019-06-05 19:29:18 +03:00
|
|
|
mykb = KnowledgeBase(nlp.vocab, entity_vector_length=1)
|
2019-03-21 14:48:59 +03:00
|
|
|
|
|
|
|
# adding entities
|
2019-06-05 19:29:18 +03:00
|
|
|
mykb.add_entity(entity=u'Q1', prob=0.9, entity_vector=[1])
|
|
|
|
mykb.add_entity(entity=u'Q2', prob=0.2, entity_vector=[2])
|
|
|
|
mykb.add_entity(entity=u'Q3', prob=0.5, entity_vector=[3])
|
2019-03-21 14:48:59 +03:00
|
|
|
|
|
|
|
# adding aliases
|
2019-03-22 16:15:18 +03:00
|
|
|
mykb.add_alias(alias=u'douglas', entities=[u'Q2', u'Q3'], probabilities=[0.8, 0.2])
|
|
|
|
mykb.add_alias(alias=u'adam', entities=[u'Q2'], probabilities=[0.9])
|
2019-03-21 14:48:59 +03:00
|
|
|
|
|
|
|
# test the size of the relevant candidates
|
2019-03-22 16:15:18 +03:00
|
|
|
assert(len(mykb.get_candidates(u'douglas')) == 2)
|
|
|
|
assert(len(mykb.get_candidates(u'adam')) == 1)
|
|
|
|
assert(len(mykb.get_candidates(u'shrubbery')) == 0)
|