Ţéŕḿîñöļöĝý Đàţà Ḿöđéļ
Ţĥîš ñöţé þŕöṽîđéš îḿþļéḿéñţàţîöñ đéţàîļš ƒöŕ Ç-08.
Đàţà Ḿöđéļ: Çöñçéþţ-Öŕîéñţéđ
Ţĥé çöŕé đàţà ḿöđéļ îš çöñçéþţ-öŕîéñţéđ, ƒöļļöŵîñĝ ŢƂẊ þŕîñçîþļéš. À Çöñçéþţ ĝŕöüþš ţéŕḿš àçŕöšš ļàñĝüàĝéš, éàçĥ ŵîţĥ çöñţéẋţ đîḿéñšîöñš:
type Term struct {
Text string // the term text
Locale model.LocaleID // language/locale
Status model.TermStatus // lifecycle status (proposed, approved, preferred,
// admitted, deprecated, forbidden)
PartOfSpeech string // noun, verb, adjective, etc.
Gender string // grammatical gender (if applicable)
Note string // usage note or context
CompetitorTerm bool // true if this is a competitor's term
Validity *graph.Validity // time/tag scoping; nil = always valid
Forms []string // other surface shapes in the term's language
}
type Concept struct {
ID string // unique concept identifier
ProjectID string // project scope (empty = workspace-scoped)
Domain string // subject field (software, medical, legal, etc.)
Definition string // language-neutral definition
Source TermSource // "terminology" or "brand_vocabulary"
Terms []Term // terms across locales
DoNotTranslate bool // the source term travels into every target unchanged
Properties map[string]string // extensible metadata
CreatedAt time.Time
UpdatedAt time.Time
}
TermSource đîšţîñĝüîšĥéš ţŕàđîţîöñàļ ţéŕḿîñöļöĝý
(TermSourceTerminology) ƒŕöḿ ṽöîçé ṽöçàƃüļàŕý (TermSourceBrandVocabulary,
ŵĥöšé þéŕšîšţéđ ṽàļüé îš "brand_vocabulary"), šö ţĥé ţŵö þöþüļàţîöñš çàñ šĥàŕé
öñé ţéŕḿš šţöŕé ŵĥîļé šţàýîñĝ ƒîļţéŕàƃļé.
DoNotTranslate ḿàŕķš à çöñçéþţ ŵĥöšé šöüŕçé ţéŕḿ îš ţĥé šàḿé šţŕîñĝ îñ éṽéŕý
ļöçàļé (à þŕöđüçţ ñàḿé, à ţŕàđéḿàŕķ, à ƒöŕḿàţ àçŕöñýḿ). Îţ îš îñđéþéñđéñţ öƒ
ŵĥéţĥéŕ à ţàŕĝéţ ţéŕḿ éẋîšţš, àñđ îţ ŕéàçĥéš ţĥé ţööļš àš à TermRule ŵîţĥ
DoNotTranslate šéţ. Ţĥé ŠǪĻ ƃàçķéñđš ķééþ îţ îñ ţĥé do_not_translate çöļüḿñ
öƒ tb_concepts (ŠǪĻîţé ḿîĝŕàţîöñ 5, Þöšţĝŕéš ḿîĝŕàţîöñ 7), ţĥé ƃüñđļé àñđ ţĥé
ĴŠÖÑ éẋþöŕţ àš do_not_translate, ţĥé çöñçéþţ ÀÞÎ àñđ çöñçéþţ šýñç àš
do_not_translate, àñđ ŢƂẊ àš <descrip type="x-doNotTranslate">true</descrip>.
Forms àŕé ţĥé ţéŕḿ'š öţĥéŕ šüŕƒàçé šĥàþéš îñ îţš öŵñ ļàñĝüàĝé (à þļüŕàļ, à
đéƒîñîţé ƒöŕḿ, à çàšé éñđîñĝ). NormalizedConcept ţŕîḿš ţĥéḿ àñđ đŕöþš ƃļàñķš,
ŕéþéàţš àñđ ţĥé ţéŕḿ'š öŵñ ţéẋţ ƃéƒöŕé àñý ƃàçķéñđ ŵŕîţéš ţĥéḿ, šö éṽéŕý ƃàçķéñđ
ŕéàđš ƃàçķ ţĥé šàḿé ļîšţ; Term.Surfaces() îš ţĥé ţéẋţ ƒöļļöŵéđ ƃý ţĥé ƒöŕḿš,
ŵĥîçĥ îš ŵĥàţ à šçàñ ḿàţçĥéš. À šîñĝļé-ţéŕḿ Lookup ƒîñđš à ţéŕḿ îñ îţš éẋàçţ
ţîéŕ ƃý à đéçļàŕéđ ƒöŕḿ ţĥàţ îš ţĥé ŵĥöļé ǫüéŕý: éàçĥ ŠǪĻ ƃàçķéñđ ŕéţüŕñš ţĥé
ţéŕḿš ŵîţĥ ƒöŕḿš (TermCandidateSource.Forms), àñđ LookupTiered ķééþš ţĥöšé
ţĥé šĥàŕéđ ḿàţçĥéŕ ƒîñđš šþàññîñĝ ţĥé ǫüéŕý. Ţĥé ŠǪĻ ƃàçķéñđš ķééþ ţĥéḿ àš à ĴŠÖÑ àŕŕàý îñ ţĥé
forms çöļüḿñ öƒ tb_terms (ŠǪĻîţé ḿîĝŕàţîöñ 4), ţĥé .terms.json ƃüñđļé àš à
forms àŕŕàý, àñđ ŢƂẊ àš öñé <termNote type="x-surfaceForm"> þéŕ ƒöŕḿ.
Þŕöĝŕéššîṽé đîšçļöšüŕé: ÇŠṼ îḿþöŕţ àüţö-çŕéàţéš Çöñçéþţš ŵîţĥ à šîñĝļé þŕéƒéŕŕéđ Ţéŕḿ þéŕ ļöçàļé, šö ñöţĥîñĝ ḿöŕé îš ŕéǫüîŕéđ öƒ à üšéŕ ŵĥö ŵàñţš à ŵöŕđ ļîšţ.
Đéçļàŕîñĝ àñđ çĥéçķîñĝ ƒöŕḿš
host.ProposeTermForms šéļéçţš ţĥé ţéŕḿš ţö éẋþàñđ (éṽéŕý ļàñĝüàĝé éẋçéþţ ţĥé
šöüŕçé ļàñĝüàĝé üñļéšš TermsExpandOptions.Locales ñàḿéš šöḿé, šķîþþîñĝ
đö-ñöţ-ţŕàñšļàţé çöñçéþţš àñđ ţéŕḿš ţĥàţ àļŕéàđý đéçļàŕé ƒöŕḿš), àšķš ţĥé
þŕöṽîđéŕ ţĥŕöüĝĥ aitools.ExpandTermForms îñ ƃàţçĥéš öƒ 40 þéŕ ļàñĝüàĝé, àñđ
đŕöþš à ƒöŕḿ šþéļļéđ ţĥé šàḿé àš àñöţĥéŕ ţéŕḿ îñ ţĥàţ ļàñĝüàĝé.
host.ApplyFormsProposals ŵŕîţéš ţĥé šüŕṽîṽöŕš öñţö ţĥé çöñçéþţš, àñđ
TermsFormsTarget šàṽéš ţĥéḿ ţö ţĥé ƃüñđļé ñàḿéđ öñ ţĥé çöḿḿàñđ ļîñé, ţĥé
þŕöĵéçţ'š çöḿḿîţţéđ ţéŕḿš šöüŕçé, öŕ ţĥé šéļéçţéđ šţöŕé, îñ ţĥàţ öŕđéŕ.
terms.ValidateConcepts(concepts, sourceLocale) ŕéţüŕñš Problemš. Éŕŕöŕš àŕé à
ḿîššîñĝ öŕ ŕéþéàţéđ çöñçéþţ îđ, à ţéŕḿ ŵîţĥ ñö ţéẋţ öŕ ļöçàļé, àñđ àñ üñķñöŵñ
šţàţüš. Ŵàŕñîñĝš àŕé à ƒöŕḿ šþéļļéđ ţĥé šàḿé àš àñöţĥéŕ ţéŕḿ îñ îţš ļàñĝüàĝé, àñđ
à ţàŕĝéţ ţéŕḿ ŵîţĥ ñö ƒöŕḿš ŵĥöšé ļàñĝüàĝé terms.LanguageInflects, ŵĥîçĥ îš
ƒàļšé ƒöŕ ļàñĝüàĝéš ŵĥöšé ñöüñš ķééþ ţĥéîŕ ŵŕîţţéñ šĥàþé (Çĥîñéšé, Ĵàþàñéšé,
Ķöŕéàñ, Ṽîéţñàḿéšé, Ţĥàî, Ļàö, Ķĥḿéŕ, Ƃüŕḿéšé, Îñđöñéšîàñ, Ḿàļàý) àñđ ƒöŕ
þŕîṽàţé-üšé àñđ üñđéţéŕḿîñéđ ļöçàļéš.
Ţéŕḿîñöļöĝý Îñţéŕƒàçé
type Terminology interface {
AddConcept(ctx context.Context, concept Concept) error
GetConcept(ctx context.Context, id string) (Concept, bool, error)
DeleteConcept(ctx context.Context, id string) error
Lookup(ctx context.Context, sourceText string, opts LookupOptions) ([]TermMatch, error)
LookupAll(ctx context.Context, sourceText string, opts LookupOptions) ([]TermMatch, error)
Search(ctx context.Context, query string, sourceLocale, targetLocale model.LocaleID, offset, limit int) ([]Concept, int, error)
Count(ctx context.Context) (int, error)
Concepts(ctx context.Context) ([]Concept, error)
AddRelation(ctx context.Context, rel ConceptRelation) error
DeleteRelation(ctx context.Context, id string) error
RelationsOf(ctx context.Context, conceptID string, scope *graph.Scope) ([]ConceptRelation, error)
ListRelations(ctx context.Context, scope *graph.Scope) ([]ConceptRelation, error)
Close() error
}
Îḿþöŕţ àñđ éẋþöŕţ àŕé šţàñđàļöñé ƒüñçţîöñš ŕàţĥéŕ ţĥàñ îñţéŕƒàçé ḿéţĥöđš:
ImportJSON/ExportJSON, ImportCSV/ExportCSV, àñđ ImportTBX/ExportTBX
(ţĥé ÎŠÖ ŢƂẊ îñţéŕçĥàñĝé ƒöŕḿàţ, ŵîţĥ TBXImportOptions/TBXExportOptions).
Ƒŕàḿéŵöŕķ ƃàçķéñđš: îñ-ḿéḿöŕý (ÇĻÎ ƃàţçĥ) àñđ ŠǪĻîţé (þéŕšîšţéñţ). À ƃàçķéñđ
ŵîţĥ ŵîđéŕ îšöļàţîöñ çàñ ƃé šüþþļîéđ ƃéĥîñđ ţĥé šàḿé îñţéŕƒàçé.
TermMatch îš ŵĥàţ à ļööķüþ ŕéţüŕñš: ţĥé çöñçéþţ, ţĥé ḿàţçĥéđ ţéŕḿ, à šçöŕé, à
ḿàţçĥ šţŕàţéĝý, àñđ à Position model.TextRange (à çĥàŕàçţéŕ ŕàñĝé îñţö ţĥé
šéàŕçĥéđ ţéẋţ).
Ƒüžžý Ḿàţçĥîñĝ àñđ Šéàŕçĥ
Ţéŕḿ ļööķüþ üšéš à ţîéŕéđ ḿàţçĥîñĝ þîþéļîñé: éẋàçţ, ţĥéñ ñöŕḿàļîžéđ, ţĥéñ ƒüžžý. Ƒüžžý ḿàţçĥîñĝ üšéš ţŕîĝŕàḿ-ƃàšéđ çàñđîđàţé ŕéţŕîéṽàļ ţö àṽöîđ ƒüļļ ţàƃļé šçàñš:
- ŠǪĻîţé: à çöñţéñţļéšš ƑŢŠ5
trigramîñđéẋ (tb_terms_trigram) öṽéŕ ţĥétext_lowerçöļüḿñ, þöþüļàţéđ ƃý îñšéŕţ/üþđàţé/đéļéţé ţŕîĝĝéŕš. Ƒàļļš ƃàçķ ţö ļéñĝţĥ-ƃàšéđ þŕé-ƒîļţéŕîñĝ îƒ ƑŢŠ5 îš üñàṽàîļàƃļé.
Çĥàŕàçţéŕ-ļéṽéļ Ļéṽéñšĥţéîñ šçöŕîñĝ (öñ []rune) îš àþþļîéđ ţö ~200 ţŕîĝŕàḿ çàñđîđàţéš. Ţĥîš îš çöŕŕéçţ ƒöŕ àļļ šçŕîþţš îñçļüđîñĝ ÇĴĶ (éàçĥ çĥàŕàçţéŕ îš à ḿöŕþĥéḿé).
ÜÎ šéàŕçĥ üšéš ţĥé šàḿé ƑŢŠ5 trigram îñđéẋ ƒöŕ šüƃšţŕîñĝ ḿàţçĥîñĝ öñ ţéŕḿ ţéẋţ, ŕàñķéđ.
Ţéẋţ ñöŕḿàļîžàţîöñ àþþļîéš Üñîçöđé ÑƑÇ (golang.org/x/text/unicode/norm) ṽîà NormalizeTerm() ƃéƒöŕé çöḿþàŕîšöñ, ĥàñđļîñĝ Àŕàƃîç đîàçŕîţîçš, Ĥàñĝüļ ĵàḿö çöḿþöšîţîöñ, àñđ àççéñţéđ Ļàţîñ çĥàŕàçţéŕš.
Ţĥé terms/schema þàçķàĝé đéçļàŕéš ţĥé ţàƃļéš öñçé àñđ éḿîţš ţĥéḿ îñ ţŵö ŠǪĻ đîàļéçţš. Ţĥé šéçöñđ đîàļéçţ'š éǫüîṽàļéñţ öƒ ţĥé ƑŢŠ îñđéẋ îš à pg_trgm ĜÎÑ îñđéẋ öñ text_lower àñđ à search_tsv çöļüḿñ; ţĥé ƒŕàḿéŵöŕķ šĥîþš öñļý ţĥé ŠǪĻîţé ƃàçķéñđ.
Ļöçàţîñĝ đéçļàŕéđ ţéŕḿš
terms.Locate(ctx, LocateRequest) îš ţĥé öñé þàšš ţĥàţ ƒîñđš éṽéŕý đéçļàŕéđ
ţéŕḿ îñ à ţéẋţ. À LocateRequest çàŕŕîéš ţĥé ţéẋţ àñđ îţš ŕüñš, ţĥé
profile.TermRuleSetš ţĥé çàļļéŕ ĥöļđš (à ṽöîçé þŕöƒîļé'š ṽöçàƃüļàŕý ţĥŕöüĝĥ
profile.VocabularyRuleSets, à ţööļ'š term_rules: àš îţš öŵñ šéţ, öŕ ƃöţĥ),
ţĥé ƃöüñđ Terminology šţöŕé, ţĥé ļöçàļé, àñđ ţĥé đöḿàîñš, ḿîñîḿüḿ šçöŕé àñđ
ṽàļîđîţý šçöþé þàššéđ ţĥŕöüĝĥ ţö ţĥé šţöŕé ļööķüþ. Îţ ŕéţüŕñš Occurrenceš:
ţĥé ḿàţçĥéđ ţéẋţ (ƒöŕ à šţöŕé ţéŕḿ, ţĥé ƒöŕḿ àš ţĥé ţéẋţ šþéļļš îţ), ţĥé ŕüļé öŕ
çöñçéþţ ţĥàţ đéçļàŕéđ îţ, îţš šţàţüš öŕ šéṽéŕîţý,
ŵĥéţĥéŕ îţ îš đö-ñöţ-ţŕàñšļàţé, ƃýţé öƒƒšéţš îñţö ţĥé ţéẋţ, àñđ à
model.Anchor îñţö ţĥé ŕüñš (model.RangeAnchorForBytes). Ŕüļé ĥîţš çöḿé
ƒîŕšţ, ţĥéñ šţöŕé ḿàţçĥéš, đéđüþéđ àçŕöšš ţĥé çàñđîđàţé ļàñĝüàĝéš. Àñ
öççüŕŕéñçé îš à üšé, ñöţ à ṽéŕđîçţ; ţĥé çöñšüḿîñĝ ĝàţé đéçîđéš ŵĥîçĥ üšéš àŕé
ṽîöļàţîöñš.
Þîþéļîñé Ţööļš
Ţĥé ţéŕḿîñöļöĝý ţööļš ŕüñ àš öŕđîñàŕý þîþéļîñé šţàĝéš (É-03). Éṽéŕý ĝöṽéŕñéđ šţéþ ţàķéš îţš ŕüļéš üñđéŕ öñé ķéý, term_rules:, àš []profile.TermRule:
term-lookup (Éñŕîçĥ). Ŕüñš terms.Locate öṽéŕ ţĥé šöüŕçé ŵîţĥ ţĥé šţöŕé àñđ ţĥé šţéþ'š term_rules:, àñđ àţţàçĥéš à TermAnnotation þéŕ öççüŕŕéñçé àš àñ öṽéŕļàý šþàñ ŵĥöšé Range îš ţĥé öççüŕŕéñçé'š model.Anchor. Đöŵñšţŕéàḿ ţööļš (ÀÎ ţŕàñšļàţé, çĥéçķš) üšé ţĥéšé àññöţàţîöñš ƒöŕ çöñţéẋţ.
translate (Þŕöđüçé, ÀÎ). Ŕéñđéŕš term_rules: îñţö îţš þŕöḿþţ ţĥŕöüĝĥ ţŵö þŕöĵéçţîöñš, ƃéçàüšé öñé ļîñé šĥàþé çàññöţ çàŕŕý ƃöţĥ îñšţŕüçţîöñš: profile.TermRuleMap ƒöŕ ţĥé ŕüļéš ţĥàţ ñàḿé à ŕéþļàçéḿéñţ, àñđ profile.DoNotTranslateTerms ƒöŕ ţĥé ŕüļéš ḿàŕķéđ DoNotTranslate, ŵĥîçĥ ţĥé ḿàþ đŕöþš ƒöŕ ŵàñţ öƒ öñé. Éàçĥ îš šçöþéđ ţö ţĥé ţéẋţ öƒ ţĥé çàļļ, ţĥé ŕéñđéŕîñĝš ƃý profile.ScopeTermRules àñđ ţĥé đö-ñöţ-ţŕàñšļàţé ţéŕḿš ƃý profile.ScopedDoNotTranslateTerms, ŵĥîçĥ ḿàţçĥéš çöñţàîñḿéñţ öñ ţĥé ŕàŵ ţéẋţ šö à ţéŕḿ ŵŕîţţéñ îñšîđé à çöḿḿàñđ šţîļļ ŕéàçĥéš ţĥé þŕöḿþţ, àš ţéŕḿ-çĥéçķ đéḿàñđš îţ ţĥéŕé. profile.GovernanceContext ƒöļđš ţĥé üñšçöþéđ þŕöĵéçţîöñš îñţö ţĥé çöñţéẋţ ƒîñĝéŕþŕîñţ šţàḿþéđ öñ ţĥé ţàŕĝéţ, šö šéţţîñĝ öŕ çļéàŕîñĝ ţĥé ƒļàĝ ḿàŕķš ţĥé çöñţéñţ šţàļé; àñ éḿþţý đö-ñöţ-ţŕàñšļàţé ļîšţ çöñţŕîƃüţéš ñöţĥîñĝ ţö ţĥé ĥàšĥ, ļéàṽîñĝ à þŕöĵéçţ ţĥàţ ḿàŕķš ñö çöñçéþţ ŵîţĥ ţĥé ƒîñĝéŕþŕîñţš îţ ĥàš. Ţĥé šţŕîñĝš ñàḿéđ ƃý --dnt öŕ ţĥé ŕéçîþé àŕé ḿàšķéđ ƃéƒöŕé ţĥé ḿöđéļ îñšţéàđ (dntMask), à šţŕöñĝéŕ ĝüàŕàñţéé ţĥàţ çöšţš ţĥé ƃàţçĥéđ þàţĥ: à ŕüñ çöñƒîĝüŕéđ ŵîţĥ ţĥéḿ ţŕàñšļàţéš öñé ƃļöçķ þéŕ çàļļ.
term-check (Ṽàļîđàţé). Ĥöļđš ţĥé ţàŕĝéţ ţö ţĥé ŕéñđéŕîñĝš îţš term_rules: ŕéǫüîŕé, đéçîđîñĝ éàçĥ ƃļöçķ ţĥŕöüĝĥ TermCheckViolations. terms.RulesFromConcepts đéŕîṽéš ţĥé ŕüļéš éṽéŕý šüŕƒàçé üšéš: à çöñçéþţ'š ĥéàđ ţéŕḿ ŵîţĥ îţš ƒöŕḿš àš Term àñđ Forms, îţš þŕéƒéŕŕéđ ţàŕĝéţ ţéŕḿ ŵîţĥ îţš ƒöŕḿš àš Replacement àñđ ReplacementForms, àñđ éṽéŕý öţĥéŕ àđḿîţţéđ, àþþŕöṽéđ öŕ üñḿàŕķéđ ţàŕĝéţ ţéŕḿ àš àñ éñţŕý îñ Accepted. Ţĥé šöüŕçé šîđé ŕéàđš check.TermText öƒ ţĥé ƃļöçķ'š ţéẋţ, ŵĥîçĥ öṽéŕŵŕîţéš þļàçéĥöļđéŕš, îñļîñé çöđé àñđ ƒéñçéđ ƃļöçķš, ǫüöţéđ kapi çöḿḿàñđš, îñđéñţéđ éẋàḿþļé çöḿḿàñđ ļîñéš üþ ţö à šĥéļļ çöḿḿéñţ, àñđ ƒļàĝ ñàḿéš ƃýţé ƒöŕ ƃýţé, ƃéçàüšé çöđé ķééþš îţš ŵöŕđš îñ à ţŕàñšļàţîöñ àñđ à ţéŕḿ ŵŕîţţéñ ţĥéŕé öŵéš ñö ŕéñđéŕîñĝ ŵĥàţéṽéŕ ţĥé ŕüļé'š šçöþé; à đö-ñöţ-ţŕàñšļàţé ŕüļé ŕéàđš check.PlaceholderText îñšţéàđ, šö à ţéŕḿ îñšîđé à çöḿḿàñđ îš šţîļļ đéḿàñđéđ. Îţ ƒîñđš éàçĥ ŕüļé'š ţéŕḿ ŵîţĥ check.FindEnglishInflectionsIn ŵĥéñ SourceLocale îš Éñĝļîšĥ àñđ ţĥé ŕüļé đéçļàŕéš ñö ƒöŕḿš, àñđ ŵîţĥ check.FindTermFormsIn öṽéŕ ţĥé ţéŕḿ àñđ îţš ƒöŕḿš öţĥéŕŵîšé; check.KeepLongestDeclared ţĥéñ đŕöþš à ţéŕḿ çöṽéŕéđ ƃý à ļöñĝéŕ đéçļàŕéđ öñé. À đéḿàñđéđ ŕüļé îš šàţîéđ ŵĥéñ ţĥé ţàŕĝéţ çöñţàîñš àñý öƒ TermRule.Renderings() öŕ à đéçļàŕéđ ƒöŕḿ öƒ öñé. À ŕüļé ḿàŕķéđ DoNotTranslate ñàḿéš ñö ŕéñđéŕîñĝ àñđ îš šàţîéđ ŵĥéñ check.PlaceholderText öƒ ţĥé ţàŕĝéţ çöñţàîñš, îñ îţš öŵñ çàšîñĝ, ţĥé ţéŕḿ, à đéçļàŕéđ ƒöŕḿ, öŕ ţĥé ţéẋţ öƒ öñé öƒ ţĥé šöüŕçé'š öççüŕŕéñçéš (keptVerbatim). À ŕüļé'š šéṽéŕîţý šöŕţš à ṽîöļàţîöñ îñţö term-check-errors öŕ term-check-warnings, àñđ àñý öţĥéŕ ŕüļé ŵîţĥ ñö ŕéþļàçéḿéñţ đéḿàñđš ñöţĥîñĝ. TermCheckMatching šüḿḿàŕîžéš ţĥé ḿöđé ƒöŕ check.Execution.TermMatching, çöüñţîñĝ đö-ñöţ-ţŕàñšļàţé ŕüļéš àḿöñĝ ţĥé ŕüļéš àþþļîéđ, àñđ TermCheckCanaries ƃüîļđš à đéļéţéđ-ŕéñđéŕîñĝ çàñàŕý àñđ à çļîþþéđ-ŵöŕđ çàñàŕý (check.ClipWord) ƒöŕ ţĥé ƒîŕšţ ŕüļé ŵîţĥ à ŕéþļàçéḿéñţ, àñđ à ñöţ-ķéþţ çàñàŕý ƒöŕ ţĥé ƒîŕšţ đö-ñöţ-ţŕàñšļàţé ŕüļé.
term-enforce (Ṽàļîđàţé). Ƒöŕ éàçĥ šöüŕçé ţéŕḿ ţĥé šţöŕé ķñöŵš, çĥéçķš ţĥàţ àñ àççéþţàƃļé ţàŕĝéţ-ļöçàļé ŕéñđéŕîñĝ îš þŕéšéñţ àñđ ŕéþöŕţš ţĥé ƃļöçķ ŵĥéŕé îţ îš ḿîššîñĝ. À ƒöŕƃîđđéñ öŕ đéþŕéçàţéđ šöüŕçé çöñçéþţ îš ŕéđîŕéçţéđ ţĥŕöüĝĥ îţš use-instead öŕ replaced-by ŕéļàţîöñ (resolveReplacement), šö ţĥé éẋþéçţéđ ŕéñđéŕîñĝ îš ţĥé ŕéþļàçéḿéñţ çöñçéþţ'š þŕéƒéŕŕéđ ţéŕḿ.
dnt-check (Ṽàļîđàţé). Çĥéçķš ţĥàţ đö-ñöţ-ţŕàñšļàţé ţéŕḿš šüŕṽîṽé ṽéŕƃàţîḿ îñţö ţĥé ţàŕĝéţ. DNTCheckConfig.EffectiveTerms üñîöñš ţĥé šţŕîñĝš ñàḿéđ đîŕéçţļý ŵîţĥ éṽéŕý ŕüļé îñ term_rules: ḿàŕķéđ DoNotTranslate; à šţöŕé îš ñöţ ŕéǫüîŕéđ. Ţĥé ĝàţéš, ţĥé ļööþ çĥéçķš (host.computeLoopCheckExclusions) àñđ kapi check --target ĥöļđ ţĥé šţöŕé'š đö-ñöţ-ţŕàñšļàţé çöñçéþţš ţĥŕöüĝĥ term-check, šö öñé đéçîšîöñ àñšŵéŕš ƒöŕ éṽéŕý ŕüļé ţĥé ţéŕḿš ƃîñđ; dnt-check šéŕṽéš ţĥé šţŕîñĝš à ŕéçîþé öŕ --dnt ñàḿéš.
Ŕéļàţéđ ÀÎ àñđ ŕéđàçţîöñ ţööļš (ŕéĝîšţéŕéđ îñ core/ai/tools/ àñđ
core/tools/):
term-extract (Éñŕîçĥ, ÀÎ). ĻĻḾ éẋţŕàçţîöñ öƒ çàñđîđàţé ţéŕḿš. Üšéš àñ ÀÎ þŕöṽîđéŕ ƒŕöḿ É-07.
entity-extract (Éñŕîçĥ, ÀÎ). Ñàḿéđ éñţîţý àññöţàţîöñ (þéöþļé, öŕĝàñîžàţîöñš, þŕöđüçţš, đàţéš, ļöçàţîöñš). Šéŕṽéš ḿüļţîþļé þüŕþöšéš: çöñţéñţ-ḿéḿöŕý ĝéñéŕàļîžàţîöñ (Ç-09), đö-ñöţ-ţŕàñšļàţé ḿàŕķéŕš, ţŕàñšļàţîöñ ĥîñţš, àñđ ţéŕḿîñöļöĝý çàñđîđàţé đîšçöṽéŕý. Šĥöüļđ ŕüñ éàŕļý îñ ţĥé þîþéļîñé, ƃéƒöŕé recycle.
redact (Ţŕàñšƒöŕḿ). Þŕîṽàçý ţööļ ŕéþļàçîñĝ éñţîţý ṽàļüéš ŵîţĥ ţýþéđ þļàçéĥöļđéŕš (é.ĝ., "Ĵöĥñ" -> \{PERSON\}) ƃéƒöŕé éẋţéŕñàļ šéŕṽîçéš. Šéé Ç-10.
unredact (Ţŕàñšƒöŕḿ). Ŕéšţöŕéš öŕîĝîñàļ éñţîţý ṽàļüéš àƒţéŕ éẋţéŕñàļ þŕöçéššîñĝ. Þàîŕéđ ŵîţĥ redact:
reader -> entity-extract -> redact -> [external MT] -> unredact -> writer
Ḿéàšüŕîñĝ ţéŕḿ ḿàţçĥîñĝ
scripts/termeval ŕüñš ţéŕḿ-çĥéçķ öṽéŕ ŕéṽîéŵéđ ţŕàñšļàţîöñš àñđ çöḿþàŕéš ţĥŕéé
ḿöđéš: šüƃšţŕîñĝ ḿàţçĥîñĝ öƒ ţĥé ţéŕḿ àñđ îţš þŕéƒéŕŕéđ ŕéñđéŕîñĝ, ţéŕḿ-çĥéçķ
ŵîţĥ ñö đéçļàŕéđ ƒöŕḿš, àñđ ţéŕḿ-çĥéçķ ŵîţĥ ţĥé ƒöŕḿš ţĥé ţéŕḿš šţöŕé đéçļàŕéš
þļüš ţĥé ŕéṽîéŵéđ ƒöŕḿš îñ scripts/termeval/testdata/forms.json. Ţĥé çöŕþöŕà
àŕé ţĥé þŕöĵéçţ'š Ñöŕŵéĝîàñ çöñţéñţ ḿéḿöŕý, ţĥé çöḿþàšš çàţàļöĝš àñđ ţĥé
ţîđéŵàţçĥ ḿéḿöŕý, àñđ ţĥé ŕüļéš çöḿé
ƒŕöḿ terms.RulesFromConcepts. Ƒöŕ éàçĥ çöŕþüš, ļàñĝüàĝé àñđ ḿöđé îţ ŕéþöŕţš ţĥé
đéḿàñđš, ţĥé ƒàîļš, ţĥé ƒàļšé ƒàîļš àḿöñĝ ţŕüé üšéš, ţĥé đéḿàñđš ŵĥöšé šöüŕçé
ḿàţçĥ îš ñöţ à üšé öƒ ţĥé ţéŕḿ, àñđ ţĥé çöñšţŕüçţéđ ñéĝàţîṽéš (à ŕéñđéŕîñĝ đéļéţéđ
öŕ çļîþþéđ) ţĥé ḿöđé þàššéš. Ţĥé ļàƃéļš îñ testdata/labels.json ŵéŕé ḿàđé ƃý
àĝéñţš àñđ àŕé þéñđîñĝ à þéŕšöñ'š ŕéṽîéŵ. go run ./scripts/termeval þŕîñţš ţĥé
ţàƃļé, -forms àñđ -labels ŕüñ îţ àĝàîñšţ àñöţĥéŕ ƒîļé, àñđ
go test ./scripts/termeval þîñš ţĥàţ ñö šţàĝé ḿöđé þàššéš à ñéĝàţîṽé àñđ ţĥàţ
éṽéŕý đéḿàñđ àñđ ƒàîļ îš ļàƃéļļéđ.
Çöñçéþţ ŕéļàţîöñš
Çöñçéþţš àŕé ļîñķéđ ƃý þéŕšîšţéđ, ţýþéđ, đîŕéçţéđ éđĝéš. À ConceptRelation
ŕéçöŕđš ţĥé éđĝé ŵîţĥ àñ îđéñţîţý, àñ öþţîöñàļ ñöţé, àñđ àñ öþţîöñàļ ṽàļîđîţý:
type ConceptRelation struct {
ID string // edge identity (caller-assigned; required)
SourceID string // origin concept ID
TargetID string // target concept ID
RelationType string // a graph.Label* constant
Note string // optional human note
Validity *graph.Validity // optional time + tag scope (nil = unbounded)
CreatedAt time.Time
}
RelationType đŕàŵš îţš ṽàļüéš ƒŕöḿ ţĥé graph.Label* çöñšţàñţš, šö ŕéļàţîöñ
éđĝéš šĥàŕé ţĥé ṽöçàƃüļàŕý üšéđ ƃý ţĥé ŕéšţ öƒ ţĥé ĝŕàþĥ ļàýéŕ.
KnownRelationType àñđ ValidateRelation ŕéĵéçţ àñ üñķñöŵñ ţýþé öŕ à ḿîššîñĝ
ÎĐ ƃéƒöŕé à ŵŕîţé. Ţĥé ŕéļàţîöñ ḿéţĥöđš öñ Terminology (àƃöṽé) þéŕšîšţ àñđ
ǫüéŕý ţĥé éđĝéš: AddRelation üþšéŕţš ƃý ÎĐ, RelationsOf ŕéţüŕñš ƃöţĥ
đîŕéçţîöñš, àñđ ƃöţĥ ŕéàđ ḿéţĥöđš ƒîļţéŕ ƃý šçöþé ŵĥéñ öñé îš ĝîṽéñ.
Ţéḿþöŕàļ àñđ ţàĝ ṽàļîđîţý
À Term àñđ à ConceptRelation éàçĥ çàŕŕý àñ öþţîöñàļ *graph.Validity: à
ĥàļƒ-öþéñ [ValidFrom, ValidTo) îñţéŕṽàļ þļüš à map[string]string öƒ ţàĝš.
LookupOptions.Scope àñđ ţĥé ŕéļàţîöñ ŕéàđ ḿéţĥöđš ţàķé à *graph.Scope (à
ţîḿé þļüš ţàĝš); à ţéŕḿ öŕ éđĝé îš ŕéţüŕñéđ öñļý ŵĥéñ îţš ṽàļîđîţý ḿàţçĥéš ţĥé
šçöþé (à ñîļ ṽàļîđîţý àļŵàýš ḿàţçĥéš; à ñîļ šçöþé ƒîļţéŕš ñöţĥîñĝ). Ţàĝš àŕé
öþéñ-éñđéđ: à çàļļéŕ þîçķš à ṽöçàƃüļàŕý, šüçĥ àš à market ķéý.
Šţàţüš ţŕàñšîţîöñš
ValidateTransition(from, to model.TermStatus) error àççéþţš àñý ţŕàñšîţîöñ
ƃéţŵééñ ķñöŵñ šţàţüšéš (îţ ŕéĵéçţš öñļý üñķñöŵñ šţàţüšéš), àñđ
IsGovernedTransition(from, to) bool ŕéþöŕţš ŵĥéţĥéŕ à ţŕàñšîţîöñ îš
çöñšéǫüéñţîàļ: àñý ţŕàñšîţîöñ ţö forbidden öŕ preferred, öŕ ƒŕöḿ
forbidden. Ţĥé ƒŕàḿéŵöŕķ çļàššîƒîéš; îţ îḿþöšéš ñö ŕéṽîéŵ ŵöŕķƒļöŵ.
Çöñţéñţ ḿöđéļ éẋţéñšîöñš
TermAnnotation: ḿàţçĥéđ ţéŕḿ ŵîţĥ çöñçéþţ, ţàŕĝéţ ţéŕḿš, šţàţüš, šçöŕé àñđ ḿàţçĥ ţýþé; îţš þöšîţîöñ îš ţĥéRangeöƒ ţĥé öṽéŕļàý šþàñ ţĥàţ çàŕŕîéš îţ.EntityAnnotation: ñàḿéđ éñţîţý ŵîţĥ ţýþé àñđ đö-ñöţ-ţŕàñšļàţé ƒļàĝ.
Ţĥéšé ĵöîñ AltTranslation àš ƒîŕšţ-çļàšš àññöţàţîöñš öñ Ƃļöçķš (Ƒ-02).