170 lines
6.6 KiB
Go
170 lines
6.6 KiB
Go
package domain
|
|
|
|
import "time"
|
|
|
|
// EntityType classifies an extracted subject.
|
|
type EntityType string
|
|
|
|
const (
|
|
EntityPerson EntityType = "person"
|
|
EntityOrganisation EntityType = "organisation"
|
|
EntityLocation EntityType = "location"
|
|
EntityProduct EntityType = "product"
|
|
EntityEvent EntityType = "event"
|
|
EntityDate EntityType = "date"
|
|
EntitySubject EntityType = "subject"
|
|
EntityConcept EntityType = "concept"
|
|
)
|
|
|
|
// ValidEntityTypes is the closed set of accepted entity types.
|
|
var ValidEntityTypes = []EntityType{
|
|
EntityPerson, EntityOrganisation, EntityLocation, EntityProduct,
|
|
EntityEvent, EntityDate, EntitySubject, EntityConcept,
|
|
}
|
|
|
|
// Valid reports whether t is a recognised entity type.
|
|
func (t EntityType) Valid() bool {
|
|
for _, v := range ValidEntityTypes {
|
|
if v == t {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// ExtractionMethod records how a derived record was produced.
|
|
type ExtractionMethod string
|
|
|
|
const (
|
|
MethodDeterministic ExtractionMethod = "deterministic"
|
|
MethodModel ExtractionMethod = "model"
|
|
MethodUser ExtractionMethod = "user"
|
|
)
|
|
|
|
// SourceRef points at the exact place a derived record came from.
|
|
// A claim or entity must never lose this link back to original text.
|
|
type SourceRef struct {
|
|
ItemID string `bson:"item_id" json:"item_id"`
|
|
ChunkID string `bson:"chunk_id,omitempty" json:"chunk_id,omitempty"`
|
|
// Start and End are byte offsets into the item's extracted text.
|
|
Start int `bson:"start" json:"start"`
|
|
End int `bson:"end" json:"end"`
|
|
// Quote is the verbatim text at those offsets.
|
|
Quote string `bson:"quote,omitempty" json:"quote,omitempty"`
|
|
Page int `bson:"page,omitempty" json:"page,omitempty"`
|
|
}
|
|
|
|
// Entity is an identifiable subject extracted from source material.
|
|
//
|
|
// Entities are keyed on (workspace, type, normalised name). Two entities whose
|
|
// names merely look alike are never merged automatically; a candidate alias is
|
|
// proposed instead and awaits confirmation.
|
|
type Entity struct {
|
|
ID string `bson:"_id" json:"id"`
|
|
WorkspaceID string `bson:"workspace_id" json:"workspace_id"`
|
|
|
|
CanonicalName string `bson:"canonical_name" json:"canonical_name"`
|
|
NormalisedKey string `bson:"normalised_key" json:"normalised_key"`
|
|
Type EntityType `bson:"type" json:"type"`
|
|
|
|
Aliases []string `bson:"aliases,omitempty" json:"aliases,omitempty"`
|
|
SourceRefs []SourceRef `bson:"source_refs,omitempty" json:"source_refs,omitempty"`
|
|
ItemIDs []string `bson:"item_ids" json:"item_ids"`
|
|
|
|
Method ExtractionMethod `bson:"method" json:"method"`
|
|
// EvidenceScore reflects how well-attested the entity is (mention count,
|
|
// extraction agreement). It is not a probability.
|
|
EvidenceScore float64 `bson:"evidence_score" json:"evidence_score"`
|
|
Mentions int `bson:"mentions" json:"mentions"`
|
|
ModelVersion string `bson:"model_version,omitempty" json:"model_version,omitempty"`
|
|
|
|
CreatedAt time.Time `bson:"created_at" json:"created_at"`
|
|
UpdatedAt time.Time `bson:"updated_at" json:"updated_at"`
|
|
Deleted bool `bson:"deleted" json:"deleted"`
|
|
}
|
|
|
|
// AliasStatus tracks whether a proposed alias link has been adjudicated.
|
|
type AliasStatus string
|
|
|
|
const (
|
|
AliasCandidate AliasStatus = "candidate"
|
|
AliasConfirmed AliasStatus = "confirmed"
|
|
AliasRejected AliasStatus = "rejected"
|
|
)
|
|
|
|
// EntityAlias is a proposed "these two names may be the same thing" link.
|
|
// It exists precisely so that name similarity does not silently merge entities.
|
|
type EntityAlias struct {
|
|
ID string `bson:"_id" json:"id"`
|
|
WorkspaceID string `bson:"workspace_id" json:"workspace_id"`
|
|
|
|
EntityID string `bson:"entity_id" json:"entity_id"`
|
|
Alias string `bson:"alias" json:"alias"`
|
|
Normalised string `bson:"normalised" json:"normalised"`
|
|
// CandidateEntityID is set when the alias points at another existing entity.
|
|
CandidateEntityID string `bson:"candidate_entity_id,omitempty" json:"candidate_entity_id,omitempty"`
|
|
|
|
Status AliasStatus `bson:"status" json:"status"`
|
|
Method ExtractionMethod `bson:"method" json:"method"`
|
|
Similarity float64 `bson:"similarity" json:"similarity"`
|
|
Reason string `bson:"reason,omitempty" json:"reason,omitempty"`
|
|
|
|
CreatedAt time.Time `bson:"created_at" json:"created_at"`
|
|
UpdatedAt time.Time `bson:"updated_at" json:"updated_at"`
|
|
}
|
|
|
|
// ClaimNature distinguishes how faithfully a claim reproduces its source.
|
|
type ClaimNature string
|
|
|
|
const (
|
|
ClaimQuoted ClaimNature = "quoted"
|
|
ClaimParaphrased ClaimNature = "paraphrased"
|
|
ClaimInferred ClaimNature = "inferred"
|
|
)
|
|
|
|
// Valid reports whether n is a recognised claim nature.
|
|
func (n ClaimNature) Valid() bool {
|
|
switch n {
|
|
case ClaimQuoted, ClaimParaphrased, ClaimInferred:
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// Claim is a statement made by a source item. A claim is not a fact: it is a
|
|
// record that some source said something, and it always retains the exact text.
|
|
type Claim struct {
|
|
ID string `bson:"_id" json:"id"`
|
|
WorkspaceID string `bson:"workspace_id" json:"workspace_id"`
|
|
ItemID string `bson:"item_id" json:"item_id"`
|
|
ChunkID string `bson:"chunk_id,omitempty" json:"chunk_id,omitempty"`
|
|
|
|
// Statement is a short normalised rendering; SourceRef.Quote is the original.
|
|
Statement string `bson:"statement" json:"statement"`
|
|
SourceRef SourceRef `bson:"source_ref" json:"source_ref"`
|
|
|
|
// Attribution is who the source says is making the claim, where known.
|
|
Attribution string `bson:"attribution,omitempty" json:"attribution,omitempty"`
|
|
Nature ClaimNature `bson:"nature" json:"nature"`
|
|
|
|
// Subject and Predicate are coarse normalised keys used to find claims that
|
|
// talk about the same thing, which is how support/contradiction candidates
|
|
// are located without comparing every claim to every other claim.
|
|
Subject string `bson:"subject,omitempty" json:"subject,omitempty"`
|
|
Predicate string `bson:"predicate,omitempty" json:"predicate,omitempty"`
|
|
// Numbers and Dates hold normalised values mentioned in the claim, used to
|
|
// detect disagreement about the same quantity or date.
|
|
Numbers []float64 `bson:"numbers,omitempty" json:"numbers,omitempty"`
|
|
Dates []string `bson:"dates,omitempty" json:"dates,omitempty"`
|
|
// Polarity is +1 for affirmative, -1 for negated statements.
|
|
Polarity int `bson:"polarity" json:"polarity"`
|
|
|
|
Method ExtractionMethod `bson:"method" json:"method"`
|
|
ModelVersion string `bson:"model_version,omitempty" json:"model_version,omitempty"`
|
|
Confidence float64 `bson:"confidence" json:"confidence"`
|
|
DedupeKey string `bson:"dedupe_key" json:"-"`
|
|
|
|
CreatedAt time.Time `bson:"created_at" json:"created_at"`
|
|
Deleted bool `bson:"deleted" json:"deleted"`
|
|
}
|