Tidy up and auto-format

This commit is contained in:
Ines Montani 2021-01-05 13:41:53 +11:00
parent b57be94c78
commit 991669c934
38 changed files with 963 additions and 4600 deletions

1
.gitignore vendored
View File

@ -51,6 +51,7 @@ env3.*/
.pypyenv .pypyenv
.pytest_cache/ .pytest_cache/
.mypy_cache/ .mypy_cache/
.hypothesis/
# Distribution / packaging # Distribution / packaging
env/ env/

View File

@ -35,7 +35,10 @@ def download_cli(
def download(model: str, direct: bool = False, *pip_args) -> None: def download(model: str, direct: bool = False, *pip_args) -> None:
if not (is_package("spacy") or is_package("spacy-nightly")) and "--no-deps" not in pip_args: if (
not (is_package("spacy") or is_package("spacy-nightly"))
and "--no-deps" not in pip_args
):
msg.warn( msg.warn(
"Skipping pipeline package dependencies and setting `--no-deps`. " "Skipping pipeline package dependencies and setting `--no-deps`. "
"You don't seem to have the spaCy package itself installed " "You don't seem to have the spaCy package itself installed "

View File

@ -172,7 +172,9 @@ def render_parses(
file_.write(html) file_.write(html)
def print_prf_per_type(msg: Printer, scores: Dict[str, Dict[str, float]], name: str, type: str) -> None: def print_prf_per_type(
msg: Printer, scores: Dict[str, Dict[str, float]], name: str, type: str
) -> None:
data = [ data = [
(k, f"{v['p']*100:.2f}", f"{v['r']*100:.2f}", f"{v['f']*100:.2f}") (k, f"{v['p']*100:.2f}", f"{v['r']*100:.2f}", f"{v['f']*100:.2f}")
for k, v in scores.items() for k, v in scores.items()

View File

@ -214,8 +214,22 @@ _macedonian_lower = r"ѓѕјљњќѐѝ"
_macedonian_upper = r"ЃЅЈЉЊЌЀЍ" _macedonian_upper = r"ЃЅЈЉЊЌЀЍ"
_macedonian = r"ѓѕјљњќѐѝЃЅЈЉЊЌЀЍ" _macedonian = r"ѓѕјљњќѐѝЃЅЈЉЊЌЀЍ"
_upper = LATIN_UPPER + _russian_upper + _tatar_upper + _greek_upper + _ukrainian_upper + _macedonian_upper _upper = (
_lower = LATIN_LOWER + _russian_lower + _tatar_lower + _greek_lower + _ukrainian_lower + _macedonian_lower LATIN_UPPER
+ _russian_upper
+ _tatar_upper
+ _greek_upper
+ _ukrainian_upper
+ _macedonian_upper
)
_lower = (
LATIN_LOWER
+ _russian_lower
+ _tatar_lower
+ _greek_lower
+ _ukrainian_lower
+ _macedonian_lower
)
_uncased = ( _uncased = (
_bengali _bengali
@ -230,7 +244,9 @@ _uncased = (
+ _cjk + _cjk
) )
ALPHA = group_chars(LATIN + _russian + _tatar + _greek + _ukrainian + _macedonian + _uncased) ALPHA = group_chars(
LATIN + _russian + _tatar + _greek + _ukrainian + _macedonian + _uncased
)
ALPHA_LOWER = group_chars(_lower + _uncased) ALPHA_LOWER = group_chars(_lower + _uncased)
ALPHA_UPPER = group_chars(_upper + _uncased) ALPHA_UPPER = group_chars(_upper + _uncased)

View File

@ -1,18 +1,11 @@
from .stop_words import STOP_WORDS from .stop_words import STOP_WORDS
from .tag_map import TAG_MAP
from ...language import Language
from ...attrs import LANG
from .lex_attrs import LEX_ATTRS from .lex_attrs import LEX_ATTRS
from ...language import Language from ...language import Language
class CzechDefaults(Language.Defaults): class CzechDefaults(Language.Defaults):
lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
lex_attr_getters.update(LEX_ATTRS)
lex_attr_getters[LANG] = lambda text: "cs"
tag_map = TAG_MAP
stop_words = STOP_WORDS
lex_attr_getters = LEX_ATTRS lex_attr_getters = LEX_ATTRS
stop_words = STOP_WORDS
class Czech(Language): class Czech(Language):

File diff suppressed because it is too large Load Diff

View File

@ -14,7 +14,7 @@ class MacedonianLemmatizer(Lemmatizer):
if univ_pos in ("", "eol", "space"): if univ_pos in ("", "eol", "space"):
return [string.lower()] return [string.lower()]
if string[-3:] == 'јќи': if string[-3:] == "јќи":
string = string[:-3] string = string[:-3]
univ_pos = "verb" univ_pos = "verb"
@ -23,7 +23,13 @@ class MacedonianLemmatizer(Lemmatizer):
index_table = self.lookups.get_table("lemma_index", {}) index_table = self.lookups.get_table("lemma_index", {})
exc_table = self.lookups.get_table("lemma_exc", {}) exc_table = self.lookups.get_table("lemma_exc", {})
rules_table = self.lookups.get_table("lemma_rules", {}) rules_table = self.lookups.get_table("lemma_rules", {})
if not any((index_table.get(univ_pos), exc_table.get(univ_pos), rules_table.get(univ_pos))): if not any(
(
index_table.get(univ_pos),
exc_table.get(univ_pos),
rules_table.get(univ_pos),
)
):
if univ_pos == "propn": if univ_pos == "propn":
return [string] return [string]
else: else:

View File

@ -1,21 +1,104 @@
from ...attrs import LIKE_NUM from ...attrs import LIKE_NUM
_num_words = [ _num_words = [
"нула", "еден", "една", "едно", "два", "две", "три", "четири", "пет", "шест", "седум", "осум", "девет", "десет", "нула",
"единаесет", "дванаесет", "тринаесет", "четиринаесет", "петнаесет", "шеснаесет", "седумнаесет", "осумнаесет", "еден",
"деветнаесет", "дваесет", "триесет", "четириесет", "педесет", "шеесет", "седумдесет", "осумдесет", "деведесет", "една",
"сто", "двесте", "триста", "четиристотини", "петстотини", "шестотини", "седумстотини", "осумстотини", "едно",
"деветстотини", "илјада", "илјади", 'милион', 'милиони', 'милијарда', 'милијарди', 'билион', 'билиони', "два",
"две",
"двајца", "тројца", "четворица", "петмина", "шестмина", "седуммина", "осуммина", "деветмина", "обата", "обајцата", "три",
"четири",
"прв", "втор", "трет", "четврт", "седм", "осм", "двестоти", "пет",
"шест",
"два-три", "два-триесет", "два-триесетмина", "два-тринаесет", "два-тројца", "две-три", "две-тристотини", "седум",
"пет-шеесет", "пет-шеесетмина", "пет-шеснаесетмина", "пет-шест", "пет-шестмина", "пет-шестотини", "петина", "осум",
"осмина", "седум-осум", "седум-осумдесет", "седум-осуммина", "седум-осумнаесет", "седум-осумнаесетмина", "девет",
"три-четириесет", "три-четиринаесет", "шеесет", "шеесетина", "шеесетмина", "шеснаесет", "шеснаесетмина", "десет",
"шест-седум", "шест-седумдесет", "шест-седумнаесет", "шест-седумстотини", "шестоти", "шестотини" "единаесет",
"дванаесет",
"тринаесет",
"четиринаесет",
"петнаесет",
"шеснаесет",
"седумнаесет",
"осумнаесет",
"деветнаесет",
"дваесет",
"триесет",
"четириесет",
"педесет",
"шеесет",
"седумдесет",
"осумдесет",
"деведесет",
"сто",
"двесте",
"триста",
"четиристотини",
"петстотини",
"шестотини",
"седумстотини",
"осумстотини",
"деветстотини",
"илјада",
"илјади",
"милион",
"милиони",
"милијарда",
"милијарди",
"билион",
"билиони",
"двајца",
"тројца",
"четворица",
"петмина",
"шестмина",
"седуммина",
"осуммина",
"деветмина",
"обата",
"обајцата",
"прв",
"втор",
"трет",
"четврт",
"седм",
"осм",
"двестоти",
"два-три",
"два-триесет",
"два-триесетмина",
"два-тринаесет",
"два-тројца",
"две-три",
"две-тристотини",
"пет-шеесет",
"пет-шеесетмина",
"пет-шеснаесетмина",
"пет-шест",
"пет-шестмина",
"пет-шестотини",
"петина",
"осмина",
"седум-осум",
"седум-осумдесет",
"седум-осуммина",
"седум-осумнаесет",
"седум-осумнаесетмина",
"три-четириесет",
"три-четиринаесет",
"шеесет",
"шеесетина",
"шеесетмина",
"шеснаесет",
"шеснаесетмина",
"шест-седум",
"шест-седумдесет",
"шест-седумнаесет",
"шест-седумстотини",
"шестоти",
"шестотини",
] ]

View File

@ -21,8 +21,7 @@ _abbr_exc = [
{ORTH: "хл", NORM: "хектолитар"}, {ORTH: "хл", NORM: "хектолитар"},
{ORTH: "дкл", NORM: "декалитар"}, {ORTH: "дкл", NORM: "декалитар"},
{ORTH: "л", NORM: "литар"}, {ORTH: "л", NORM: "литар"},
{ORTH: "дл", NORM: "децилитар"} {ORTH: "дл", NORM: "децилитар"},
] ]
for abbr in _abbr_exc: for abbr in _abbr_exc:
_exc[abbr[ORTH]] = [abbr] _exc[abbr[ORTH]] = [abbr]
@ -33,7 +32,6 @@ _abbr_line_exc = [
{ORTH: "г-ѓа", NORM: "госпоѓа"}, {ORTH: "г-ѓа", NORM: "госпоѓа"},
{ORTH: "г-ца", NORM: "госпоѓица"}, {ORTH: "г-ца", NORM: "госпоѓица"},
{ORTH: "г-дин", NORM: "господин"}, {ORTH: "г-дин", NORM: "господин"},
] ]
for abbr in _abbr_line_exc: for abbr in _abbr_line_exc:
@ -54,7 +52,6 @@ _abbr_dot_exc = [
{ORTH: "т.", NORM: "точка"}, {ORTH: "т.", NORM: "точка"},
{ORTH: "т.е.", NORM: "то ест"}, {ORTH: "т.е.", NORM: "то ест"},
{ORTH: "т.н.", NORM: "таканаречен"}, {ORTH: "т.н.", NORM: "таканаречен"},
{ORTH: "бр.", NORM: "број"}, {ORTH: "бр.", NORM: "број"},
{ORTH: "гр.", NORM: "град"}, {ORTH: "гр.", NORM: "град"},
{ORTH: "др.", NORM: "другар"}, {ORTH: "др.", NORM: "другар"},
@ -68,7 +65,6 @@ _abbr_dot_exc = [
{ORTH: "с.", NORM: "страница"}, {ORTH: "с.", NORM: "страница"},
{ORTH: "стр.", NORM: "страница"}, {ORTH: "стр.", NORM: "страница"},
{ORTH: "чл.", NORM: "член"}, {ORTH: "чл.", NORM: "член"},
{ORTH: "арх.", NORM: "архитект"}, {ORTH: "арх.", NORM: "архитект"},
{ORTH: "бел.", NORM: "белешка"}, {ORTH: "бел.", NORM: "белешка"},
{ORTH: "гимн.", NORM: "гимназија"}, {ORTH: "гимн.", NORM: "гимназија"},
@ -89,8 +85,6 @@ _abbr_dot_exc = [
{ORTH: "истор.", NORM: "историја"}, {ORTH: "истор.", NORM: "историја"},
{ORTH: "геогр.", NORM: "географија"}, {ORTH: "геогр.", NORM: "географија"},
{ORTH: "литер.", NORM: "литература"}, {ORTH: "литер.", NORM: "литература"},
] ]
for abbr in _abbr_dot_exc: for abbr in _abbr_dot_exc:

View File

@ -45,7 +45,7 @@ _abbr_period_exc = [
{ORTH: "Doç.", NORM: "doçent"}, {ORTH: "Doç.", NORM: "doçent"},
{ORTH: "doğ."}, {ORTH: "doğ."},
{ORTH: "Dr.", NORM: "doktor"}, {ORTH: "Dr.", NORM: "doktor"},
{ORTH: "dr.", NORM:"doktor"}, {ORTH: "dr.", NORM: "doktor"},
{ORTH: "drl.", NORM: "derleyen"}, {ORTH: "drl.", NORM: "derleyen"},
{ORTH: "Dz.", NORM: "deniz"}, {ORTH: "Dz.", NORM: "deniz"},
{ORTH: "Dz.K.K.lığı"}, {ORTH: "Dz.K.K.lığı"},
@ -118,7 +118,7 @@ _abbr_period_exc = [
{ORTH: "Uzm.", NORM: "uzman"}, {ORTH: "Uzm.", NORM: "uzman"},
{ORTH: "Üçvş.", NORM: "üstçavuş"}, {ORTH: "Üçvş.", NORM: "üstçavuş"},
{ORTH: "Üni.", NORM: "üniversitesi"}, {ORTH: "Üni.", NORM: "üniversitesi"},
{ORTH: "Ütğm.", NORM: "üsteğmen"}, {ORTH: "Ütğm.", NORM: "üsteğmen"},
{ORTH: "vb."}, {ORTH: "vb."},
{ORTH: "vs.", NORM: "vesaire"}, {ORTH: "vs.", NORM: "vesaire"},
{ORTH: "Yard.", NORM: "yardımcı"}, {ORTH: "Yard.", NORM: "yardımcı"},
@ -163,19 +163,29 @@ for abbr in _abbr_exc:
_exc[abbr[ORTH]] = [abbr] _exc[abbr[ORTH]] = [abbr]
_num = r"[+-]?\d+([,.]\d+)*" _num = r"[+-]?\d+([,.]\d+)*"
_ord_num = r"(\d+\.)" _ord_num = r"(\d+\.)"
_date = r"(((\d{1,2}[./-]){2})?(\d{4})|(\d{1,2}[./]\d{1,2}(\.)?))" _date = r"(((\d{1,2}[./-]){2})?(\d{4})|(\d{1,2}[./]\d{1,2}(\.)?))"
_dash_num = r"(([{al}\d]+/\d+)|(\d+/[{al}]))".format(al=ALPHA) _dash_num = r"(([{al}\d]+/\d+)|(\d+/[{al}]))".format(al=ALPHA)
_roman_num = "M{0,3}(?:C[MD]|D?C{0,3})(?:X[CL]|L?X{0,3})(?:I[XV]|V?I{0,3})" _roman_num = "M{0,3}(?:C[MD]|D?C{0,3})(?:X[CL]|L?X{0,3})(?:I[XV]|V?I{0,3})"
_roman_ord = r"({rn})\.".format(rn=_roman_num) _roman_ord = r"({rn})\.".format(rn=_roman_num)
_time_exp = r"\d+(:\d+)*" _time_exp = r"\d+(:\d+)*"
_inflections = r"'[{al}]+".format(al=ALPHA_LOWER) _inflections = r"'[{al}]+".format(al=ALPHA_LOWER)
_abbrev_inflected = r"[{a}]+\.'[{al}]+".format(a=ALPHA, al=ALPHA_LOWER) _abbrev_inflected = r"[{a}]+\.'[{al}]+".format(a=ALPHA, al=ALPHA_LOWER)
_nums = r"(({d})|({dn})|({te})|({on})|({n})|({ro})|({rn}))({inf})?".format(d=_date, dn=_dash_num, te=_time_exp, on=_ord_num, n=_num, ro=_roman_ord, rn=_roman_num, inf=_inflections) _nums = r"(({d})|({dn})|({te})|({on})|({n})|({ro})|({rn}))({inf})?".format(
d=_date,
dn=_dash_num,
te=_time_exp,
on=_ord_num,
n=_num,
ro=_roman_ord,
rn=_roman_num,
inf=_inflections,
)
TOKENIZER_EXCEPTIONS = _exc TOKENIZER_EXCEPTIONS = _exc
TOKEN_MATCH = re.compile(r"^({abbr})|({n})$".format(n=_nums, abbr=_abbrev_inflected)).match TOKEN_MATCH = re.compile(
r"^({abbr})|({n})$".format(n=_nums, abbr=_abbrev_inflected)
).match

View File

@ -1,4 +1,3 @@
import numpy
from thinc.api import Model from thinc.api import Model
from ..attrs import LOWER from ..attrs import LOWER

View File

@ -21,14 +21,14 @@ def transition_parser_v1(
nO: Optional[int] = None, nO: Optional[int] = None,
) -> Model: ) -> Model:
return build_tb_parser_model( return build_tb_parser_model(
tok2vec, tok2vec,
state_type, state_type,
extra_state_tokens, extra_state_tokens,
hidden_width, hidden_width,
maxout_pieces, maxout_pieces,
use_upper, use_upper,
nO, nO,
) )
@registry.architectures.register("spacy.TransitionBasedParser.v2") @registry.architectures.register("spacy.TransitionBasedParser.v2")
@ -42,14 +42,15 @@ def transition_parser_v2(
nO: Optional[int] = None, nO: Optional[int] = None,
) -> Model: ) -> Model:
return build_tb_parser_model( return build_tb_parser_model(
tok2vec, tok2vec,
state_type, state_type,
extra_state_tokens, extra_state_tokens,
hidden_width, hidden_width,
maxout_pieces, maxout_pieces,
use_upper, use_upper,
nO, nO,
) )
def build_tb_parser_model( def build_tb_parser_model(
tok2vec: Model[List[Doc], List[Floats2d]], tok2vec: Model[List[Doc], List[Floats2d]],
@ -162,8 +163,8 @@ def _resize_upper(model, new_nO):
# just adding rows here. # just adding rows here.
if smaller.has_dim("nO"): if smaller.has_dim("nO"):
old_nO = smaller.get_dim("nO") old_nO = smaller.get_dim("nO")
larger_W[: old_nO] = smaller_W larger_W[:old_nO] = smaller_W
larger_b[: old_nO] = smaller_b larger_b[:old_nO] = smaller_b
for i in range(old_nO, new_nO): for i in range(old_nO, new_nO):
model.attrs["unseen_classes"].add(i) model.attrs["unseen_classes"].add(i)

View File

@ -70,13 +70,15 @@ def build_text_classifier_v2(
with Model.define_operators({">>": chain, "|": concatenate}): with Model.define_operators({">>": chain, "|": concatenate}):
width = tok2vec.maybe_get_dim("nO") width = tok2vec.maybe_get_dim("nO")
cnn_model = ( cnn_model = (
tok2vec tok2vec
>> list2ragged() >> list2ragged()
>> ParametricAttention(width) # TODO: benchmark performance difference of this layer >> ParametricAttention(
>> reduce_sum() width
>> residual(Maxout(nO=width, nI=width)) ) # TODO: benchmark performance difference of this layer
>> Linear(nO=nO, nI=width) >> reduce_sum()
>> Dropout(0.0) >> residual(Maxout(nO=width, nI=width))
>> Linear(nO=nO, nI=width)
>> Dropout(0.0)
) )
nO_double = nO * 2 if nO else None nO_double = nO * 2 if nO else None
@ -92,6 +94,7 @@ def build_text_classifier_v2(
model.attrs["multi_label"] = not exclusive_classes model.attrs["multi_label"] = not exclusive_classes
return model return model
# TODO: move to legacy # TODO: move to legacy
@registry.architectures.register("spacy.TextCatEnsemble.v1") @registry.architectures.register("spacy.TextCatEnsemble.v1")
def build_text_classifier_v1( def build_text_classifier_v1(

View File

@ -47,8 +47,7 @@ def forward(
except ValueError: except ValueError:
raise RuntimeError(Errors.E896) raise RuntimeError(Errors.E896)
output = Ragged( output = Ragged(
vectors_data, vectors_data, model.ops.asarray([len(doc) for doc in docs], dtype="i")
model.ops.asarray([len(doc) for doc in docs], dtype="i")
) )
mask = None mask = None
if is_train: if is_train:

View File

@ -1,8 +1,10 @@
from thinc.api import Model, noop, use_ops, Linear from thinc.api import Model, noop
from .parser_model import ParserStepModel from .parser_model import ParserStepModel
def TransitionModel(tok2vec, lower, upper, resize_output, dropout=0.2, unseen_classes=set()): def TransitionModel(
tok2vec, lower, upper, resize_output, dropout=0.2, unseen_classes=set()
):
"""Set up a stepwise transition-based model""" """Set up a stepwise transition-based model"""
if upper is None: if upper is None:
has_upper = False has_upper = False
@ -44,4 +46,3 @@ def init(model, X=None, Y=None):
if model.attrs["has_upper"]: if model.attrs["has_upper"]:
statevecs = model.ops.alloc2f(2, lower.get_dim("nO")) statevecs = model.ops.alloc2f(2, lower.get_dim("nO"))
model.get_ref("upper").initialize(X=statevecs) model.get_ref("upper").initialize(X=statevecs)

View File

@ -226,6 +226,7 @@ class AttributeRuler(Pipe):
DOCS: https://nightly.spacy.io/api/tagger#score DOCS: https://nightly.spacy.io/api/tagger#score
""" """
def morph_key_getter(token, attr): def morph_key_getter(token, attr):
return getattr(token, attr).key return getattr(token, attr).key
@ -240,8 +241,16 @@ class AttributeRuler(Pipe):
elif attr == POS: elif attr == POS:
results.update(Scorer.score_token_attr(examples, "pos", **kwargs)) results.update(Scorer.score_token_attr(examples, "pos", **kwargs))
elif attr == MORPH: elif attr == MORPH:
results.update(Scorer.score_token_attr(examples, "morph", getter=morph_key_getter, **kwargs)) results.update(
results.update(Scorer.score_token_attr_per_feat(examples, "morph", getter=morph_key_getter, **kwargs)) Scorer.score_token_attr(
examples, "morph", getter=morph_key_getter, **kwargs
)
)
results.update(
Scorer.score_token_attr_per_feat(
examples, "morph", getter=morph_key_getter, **kwargs
)
)
elif attr == LEMMA: elif attr == LEMMA:
results.update(Scorer.score_token_attr(examples, "lemma", **kwargs)) results.update(Scorer.score_token_attr(examples, "lemma", **kwargs))
return results return results

View File

@ -3,7 +3,7 @@ import numpy as np
from collections import defaultdict from collections import defaultdict
from .training import Example from .training import Example
from .tokens import Token, Doc, Span, MorphAnalysis from .tokens import Token, Doc, Span
from .errors import Errors from .errors import Errors
from .util import get_lang_class, SimpleFrozenList from .util import get_lang_class, SimpleFrozenList
from .morphology import Morphology from .morphology import Morphology
@ -176,7 +176,7 @@ class Scorer:
"token_acc": None, "token_acc": None,
"token_p": None, "token_p": None,
"token_r": None, "token_r": None,
"token_f": None "token_f": None,
} }
@staticmethod @staticmethod
@ -276,7 +276,10 @@ class Scorer:
if gold_i not in missing_indices: if gold_i not in missing_indices:
value = getter(token, attr) value = getter(token, attr)
morph = gold_doc.vocab.strings[value] morph = gold_doc.vocab.strings[value]
if value not in missing_values and morph != Morphology.EMPTY_MORPH: if (
value not in missing_values
and morph != Morphology.EMPTY_MORPH
):
for feat in morph.split(Morphology.FEATURE_SEP): for feat in morph.split(Morphology.FEATURE_SEP):
field, values = feat.split(Morphology.FIELD_SEP) field, values = feat.split(Morphology.FIELD_SEP)
if field not in per_feat: if field not in per_feat:
@ -367,7 +370,6 @@ class Scorer:
f"{attr}_per_type": None, f"{attr}_per_type": None,
} }
@staticmethod @staticmethod
def score_cats( def score_cats(
examples: Iterable[Example], examples: Iterable[Example],
@ -473,7 +475,10 @@ class Scorer:
macro_f = sum(prf.fscore for prf in f_per_type.values()) / n_cats macro_f = sum(prf.fscore for prf in f_per_type.values()) / n_cats
# Limit macro_auc to those labels with gold annotations, # Limit macro_auc to those labels with gold annotations,
# but still divide by all cats to avoid artificial boosting of datasets with missing labels # but still divide by all cats to avoid artificial boosting of datasets with missing labels
macro_auc = sum(auc.score if auc.is_binary() else 0.0 for auc in auc_per_type.values()) / n_cats macro_auc = (
sum(auc.score if auc.is_binary() else 0.0 for auc in auc_per_type.values())
/ n_cats
)
results = { results = {
f"{attr}_score": None, f"{attr}_score": None,
f"{attr}_score_desc": None, f"{attr}_score_desc": None,
@ -485,7 +490,9 @@ class Scorer:
f"{attr}_macro_f": macro_f, f"{attr}_macro_f": macro_f,
f"{attr}_macro_auc": macro_auc, f"{attr}_macro_auc": macro_auc,
f"{attr}_f_per_type": {k: v.to_dict() for k, v in f_per_type.items()}, f"{attr}_f_per_type": {k: v.to_dict() for k, v in f_per_type.items()},
f"{attr}_auc_per_type": {k: v.score if v.is_binary() else None for k, v in auc_per_type.items()}, f"{attr}_auc_per_type": {
k: v.score if v.is_binary() else None for k, v in auc_per_type.items()
},
} }
if len(labels) == 2 and not multi_label and positive_label: if len(labels) == 2 and not multi_label and positive_label:
positive_label_f = results[f"{attr}_f_per_type"][positive_label]["f"] positive_label_f = results[f"{attr}_f_per_type"][positive_label]["f"]
@ -675,8 +682,7 @@ class Scorer:
def get_ner_prf(examples: Iterable[Example]) -> Dict[str, Any]: def get_ner_prf(examples: Iterable[Example]) -> Dict[str, Any]:
"""Compute micro-PRF and per-entity PRF scores for a sequence of examples. """Compute micro-PRF and per-entity PRF scores for a sequence of examples."""
"""
score_per_type = defaultdict(PRFScore) score_per_type = defaultdict(PRFScore)
for eg in examples: for eg in examples:
if not eg.y.has_annotation("ENT_IOB"): if not eg.y.has_annotation("ENT_IOB"):

View File

@ -154,10 +154,10 @@ def test_doc_api_serialize(en_tokenizer, text):
logger = logging.getLogger("spacy") logger = logging.getLogger("spacy")
with mock.patch.object(logger, "warning") as mock_warning: with mock.patch.object(logger, "warning") as mock_warning:
_ = tokens.to_bytes() _ = tokens.to_bytes() # noqa: F841
mock_warning.assert_not_called() mock_warning.assert_not_called()
tokens.user_hooks["similarity"] = inner_func tokens.user_hooks["similarity"] = inner_func
_ = tokens.to_bytes() _ = tokens.to_bytes() # noqa: F841
mock_warning.assert_called_once() mock_warning.assert_called_once()

View File

@ -4,21 +4,21 @@ from spacy.lang.mk.lex_attrs import like_num
def test_tokenizer_handles_long_text(mk_tokenizer): def test_tokenizer_handles_long_text(mk_tokenizer):
text = """ text = """
Во организациските работи или на нашите собранија со членството, никој од нас не зборуваше за Во организациските работи или на нашите собранија со членството, никој од нас не зборуваше за
организацијата и идеологијата. Работна беше нашата работа, а не идеолошка. Што се однесува до социјализмот на организацијата и идеологијата. Работна беше нашата работа, а не идеолошка. Што се однесува до социјализмот на
Делчев, неговата дејност зборува сама за себе - спротивно. Во суштина, водачите си имаа свои основни погледи и Делчев, неговата дејност зборува сама за себе - спротивно. Во суштина, водачите си имаа свои основни погледи и
свои разбирања за положбата и работите, коишто стоеја пред нив и ги завршуваа со голема упорност, настојчивост и свои разбирања за положбата и работите, коишто стоеја пред нив и ги завршуваа со голема упорност, настојчивост и
насоченост. Значи, идеологија имаше, само што нивната идеологија имаше своја оригиналност. Македонија денеска, насоченост. Значи, идеологија имаше, само што нивната идеологија имаше своја оригиналност. Македонија денеска,
чиста рожба на животот и положбата во Македонија, кои му служеа како база на неговите побуди, беше дејност која чиста рожба на животот и положбата во Македонија, кои му служеа како база на неговите побуди, беше дејност која
имаше потреба од ум за да си најде своја смисла. Таквата идеологија и заемното дејство на умот и срцето му имаше потреба од ум за да си најде своја смисла. Таквата идеологија и заемното дејство на умот и срцето му
помогнаа на Делчев да не се занесе по патот на својата идеологија... Во суштина, Организацијата и нејзините помогнаа на Делчев да не се занесе по патот на својата идеологија... Во суштина, Организацијата и нејзините
водачи имаа свои разбирања за работите и положбата во идеен поглед, но тоа беше врската, животот и положбата во водачи имаа свои разбирања за работите и положбата во идеен поглед, но тоа беше врската, животот и положбата во
Македонија и го внесуваа во својата идеологија гласот на своето срце, и на крај, прибегнуваа до умот, Македонија и го внесуваа во својата идеологија гласот на своето срце, и на крај, прибегнуваа до умот,
за да најдат смисла или да ѝ дадат. Тоа содејство и заемен сооднос на умот и срцето му помогнаа на Делчев да ја за да најдат смисла или да ѝ дадат. Тоа содејство и заемен сооднос на умот и срцето му помогнаа на Делчев да ја
држи својата идеологија во сообразност со положбата на работите... Водачите навистина направија една жртва држи својата идеологија во сообразност со положбата на работите... Водачите навистина направија една жртва
бидејќи на населението не му зборуваа за своите мисли и идеи. Тие се одрекоа од секаква субјективност во своите бидејќи на населението не му зборуваа за своите мисли и идеи. Тие се одрекоа од секаква субјективност во своите
мисли. Целта беше да не се зголемуваат целите и задачите како и преданоста во работата. Населението не можеше да мисли. Целта беше да не се зголемуваат целите и задачите како и преданоста во работата. Населението не можеше да
ги разбере овие идеи... ги разбере овие идеи...
""" """
tokens = mk_tokenizer(text) tokens = mk_tokenizer(text)
assert len(tokens) == 297 assert len(tokens) == 297
@ -45,7 +45,7 @@ def test_tokenizer_handles_long_text(mk_tokenizer):
(",", False), (",", False),
("милијарда", True), ("милијарда", True),
("билион", True), ("билион", True),
] ],
) )
def test_mk_lex_attrs_like_number(mk_tokenizer, word, match): def test_mk_lex_attrs_like_number(mk_tokenizer, word, match):
tokens = mk_tokenizer(word) tokens = mk_tokenizer(word)
@ -53,14 +53,7 @@ def test_mk_lex_attrs_like_number(mk_tokenizer, word, match):
assert tokens[0].like_num == match assert tokens[0].like_num == match
@pytest.mark.parametrize( @pytest.mark.parametrize("word", ["двесте", "два-три", "пет-шест"])
"word",
[
"двесте",
"два-три",
"пет-шест"
]
)
def test_mk_lex_attrs_capitals(word): def test_mk_lex_attrs_capitals(word):
assert like_num(word) assert like_num(word)
assert like_num(word.upper()) assert like_num(word.upper())
@ -77,8 +70,8 @@ def test_mk_lex_attrs_capitals(word):
"петто", "петто",
"стоти", "стоти",
"шеесетите", "шеесетите",
"седумдесетите" "седумдесетите",
] ],
) )
def test_mk_lex_attrs_like_number_for_ordinal(word): def test_mk_lex_attrs_like_number_for_ordinal(word):
assert like_num(word) assert like_num(word)

View File

@ -5,24 +5,22 @@ from spacy.lang.tr.lex_attrs import like_num
def test_tr_tokenizer_handles_long_text(tr_tokenizer): def test_tr_tokenizer_handles_long_text(tr_tokenizer):
text = """Pamuk nasıl ipliğe dönüştürülür? text = """Pamuk nasıl ipliğe dönüştürülür?
Sıkıştırılmış balyalar halindeki pamuk, iplik fabrikasına getirildiğinde hem Sıkıştırılmış balyalar halindeki pamuk, iplik fabrikasına getirildiğinde hem
lifleri birbirine dolaşmıştır, hem de tarladan toplanırken araya bitkinin lifleri birbirine dolaşmıştır, hem de tarladan toplanırken araya bitkinin
parçaları karışmıştır. Üstelik balyalardaki pamuğun cinsi aynı olsa bile kalitesi parçaları karışmıştır. Üstelik balyalardaki pamuğun cinsi aynı olsa bile kalitesi
değişeceğinden, önce bütün balyaların birbirine karıştırılarak harmanlanması gerekir. değişeceğinden, önce bütün balyaların birbirine karıştırılarak harmanlanması gerekir.
Daha sonra pamuk yığınları, liflerin ılıp temizlenmesi için tek bir birim halinde Daha sonra pamuk yığınları, liflerin ılıp temizlenmesi için tek bir birim halinde
birleştirilmiş çeşitli makinelerden geçirilir.Bunlardan biri, dönen tokmaklarıyla birleştirilmiş çeşitli makinelerden geçirilir.Bunlardan biri, dönen tokmaklarıyla
pamuğu dövüp kabartarak dağınık yumaklar haline getiren ve liflerin arasındaki yabancı pamuğu dövüp kabartarak dağınık yumaklar haline getiren ve liflerin arasındaki yabancı
maddeleri temizleyen hallaç makinesidir. Daha sonra tarak makinesine giren pamuk demetleri, maddeleri temizleyen hallaç makinesidir. Daha sonra tarak makinesine giren pamuk demetleri,
herbirinin yüzeyinde yüzbinlerce incecik iğne bulunan döner silindirlerin arasından geçerek lif lif ayrılır herbirinin yüzeyinde yüzbinlerce incecik iğne bulunan döner silindirlerin arasından geçerek lif lif ayrılır
ve tül inceliğinde gevşek bir örtüye dönüşür. Ama bir sonraki makine bu lifleri dağınık ve tül inceliğinde gevşek bir örtüye dönüşür. Ama bir sonraki makine bu lifleri dağınık
ve gevşek bir biçimde birbirine yaklaştırarak 2 cm eninde bir pamuk şeridi haline getirir.""" ve gevşek bir biçimde birbirine yaklaştırarak 2 cm eninde bir pamuk şeridi haline getirir."""
tokens = tr_tokenizer(text) tokens = tr_tokenizer(text)
assert len(tokens) == 146 assert len(tokens) == 146
@pytest.mark.parametrize( @pytest.mark.parametrize(
"word", "word",
[ [

View File

@ -2,145 +2,692 @@ import pytest
ABBREV_TESTS = [ ABBREV_TESTS = [
("Dr. Murat Bey ile görüştüm.", ["Dr.", "Murat", "Bey", "ile", "görüştüm", "."]), ("Dr. Murat Bey ile görüştüm.", ["Dr.", "Murat", "Bey", "ile", "görüştüm", "."]),
("Dr.la görüştüm.", ["Dr.la", "görüştüm", "."]), ("Dr.la görüştüm.", ["Dr.la", "görüştüm", "."]),
("Dr.'la görüştüm.", ["Dr.'la", "görüştüm", "."]), ("Dr.'la görüştüm.", ["Dr.'la", "görüştüm", "."]),
("TBMM'de çalışıyormuş.", ["TBMM'de", "çalışıyormuş", "."]), ("TBMM'de çalışıyormuş.", ["TBMM'de", "çalışıyormuş", "."]),
("Hem İst. hem Ank. bu konuda gayet iyi durumda.", ["Hem", "İst.", "hem", "Ank.", "bu", "konuda", "gayet", "iyi", "durumda", "."]), (
("Hem İst. hem Ank.'da yağış var.", ["Hem", "İst.", "hem", "Ank.'da", "yağış", "var", "."]), "Hem İst. hem Ank. bu konuda gayet iyi durumda.",
("Dr.", ["Dr."]), ["Hem", "İst.", "hem", "Ank.", "bu", "konuda", "gayet", "iyi", "durumda", "."],
("Yrd.Doç.", ["Yrd.Doç."]), ),
("Prof.'un", ["Prof.'un"]), (
("Böl.'nde", ["Böl.'nde"]), "Hem İst. hem Ank.'da yağış var.",
["Hem", "İst.", "hem", "Ank.'da", "yağış", "var", "."],
),
("Dr.", ["Dr."]),
("Yrd.Doç.", ["Yrd.Doç."]),
("Prof.'un", ["Prof.'un"]),
("Böl.'nde", ["Böl.'nde"]),
] ]
URL_TESTS = [ URL_TESTS = [
("Bizler de www.duygu.com.tr adında bir websitesi kurduk.", ["Bizler", "de", "www.duygu.com.tr", "adında", "bir", "websitesi", "kurduk", "."]), (
("Bizler de https://www.duygu.com.tr adında bir websitesi kurduk.", ["Bizler", "de", "https://www.duygu.com.tr", "adında", "bir", "websitesi", "kurduk", "."]), "Bizler de www.duygu.com.tr adında bir websitesi kurduk.",
("Bizler de www.duygu.com.tr'dan satın aldık.", ["Bizler", "de", "www.duygu.com.tr'dan", "satın", "aldık", "."]), [
("Bizler de https://www.duygu.com.tr'dan satın aldık.", ["Bizler", "de", "https://www.duygu.com.tr'dan", "satın", "aldık", "."]), "Bizler",
"de",
"www.duygu.com.tr",
"adında",
"bir",
"websitesi",
"kurduk",
".",
],
),
(
"Bizler de https://www.duygu.com.tr adında bir websitesi kurduk.",
[
"Bizler",
"de",
"https://www.duygu.com.tr",
"adında",
"bir",
"websitesi",
"kurduk",
".",
],
),
(
"Bizler de www.duygu.com.tr'dan satın aldık.",
["Bizler", "de", "www.duygu.com.tr'dan", "satın", "aldık", "."],
),
(
"Bizler de https://www.duygu.com.tr'dan satın aldık.",
["Bizler", "de", "https://www.duygu.com.tr'dan", "satın", "aldık", "."],
),
] ]
NUMBER_TESTS = [ NUMBER_TESTS = [
("Rakamla 6 yazılıydı.", ["Rakamla", "6", "yazılıydı", "."]), ("Rakamla 6 yazılıydı.", ["Rakamla", "6", "yazılıydı", "."]),
("Hava -4 dereceydi.", ["Hava", "-4", "dereceydi", "."]), ("Hava -4 dereceydi.", ["Hava", "-4", "dereceydi", "."]),
("Hava sıcaklığı -4ten +6ya yükseldi.", ["Hava", "sıcaklığı", "-4ten", "+6ya", "yükseldi", "."]), (
("Hava sıcaklığı -4'ten +6'ya yükseldi.", ["Hava", "sıcaklığı", "-4'ten", "+6'ya", "yükseldi", "."]), "Hava sıcaklığı -4ten +6ya yükseldi.",
("Yarışta 6. oldum.", ["Yarışta", "6.", "oldum", "."]), ["Hava", "sıcaklığı", "-4ten", "+6ya", "yükseldi", "."],
("Yarışta 438547745. oldum.", ["Yarışta", "438547745.", "oldum", "."]), ),
("Kitap IV. Murat hakkında.",["Kitap", "IV.", "Murat", "hakkında", "."]), (
#("Bana söylediği sayı 6.", ["Bana", "söylediği", "sayı", "6", "."]), "Hava sıcaklığı -4'ten +6'ya yükseldi.",
("Saat 6'da buluşalım.", ["Saat", "6'da", "buluşalım", "."]), ["Hava", "sıcaklığı", "-4'ten", "+6'ya", "yükseldi", "."],
("Saat 6dan sonra buluşalım.", ["Saat", "6dan", "sonra", "buluşalım", "."]), ),
("6.dan sonra saymadım.", ["6.dan", "sonra", "saymadım", "."]), ("Yarışta 6. oldum.", ["Yarışta", "6.", "oldum", "."]),
("6.'dan sonra saymadım.", ["6.'dan", "sonra", "saymadım", "."]), ("Yarışta 438547745. oldum.", ["Yarışta", "438547745.", "oldum", "."]),
("Saat 6'ydı.", ["Saat", "6'ydı", "."]), ("Kitap IV. Murat hakkında.", ["Kitap", "IV.", "Murat", "hakkında", "."]),
("5'te", ["5'te"]), # ("Bana söylediği sayı 6.", ["Bana", "söylediği", "sayı", "6", "."]),
("6'da", ["6'da"]), ("Saat 6'da buluşalım.", ["Saat", "6'da", "buluşalım", "."]),
("9dan", ["9dan"]), ("Saat 6dan sonra buluşalım.", ["Saat", "6dan", "sonra", "buluşalım", "."]),
("19'da", ["19'da"]), ("6.dan sonra saymadım.", ["6.dan", "sonra", "saymadım", "."]),
("VI'da", ["VI'da"]), ("6.'dan sonra saymadım.", ["6.'dan", "sonra", "saymadım", "."]),
("5.", ["5."]), ("Saat 6'ydı.", ["Saat", "6'ydı", "."]),
("72.", ["72."]), ("5'te", ["5'te"]),
("VI.", ["VI."]), ("6'da", ["6'da"]),
("6.'dan", ["6.'dan"]), ("9dan", ["9dan"]),
("19.'dan", ["19.'dan"]), ("19'da", ["19'da"]),
("6.dan", ["6.dan"]), ("VI'da", ["VI'da"]),
("16.dan", ["16.dan"]), ("5.", ["5."]),
("VI.'dan", ["VI.'dan"]), ("72.", ["72."]),
("VI.dan", ["VI.dan"]), ("VI.", ["VI."]),
("Hepsi 1994 yılında oldu.", ["Hepsi", "1994", "yılında", "oldu", "."]), ("6.'dan", ["6.'dan"]),
("Hepsi 1994'te oldu.", ["Hepsi", "1994'te", "oldu", "."]), ("19.'dan", ["19.'dan"]),
("2/3 tarihli faturayı bulamadım.", ["2/3", "tarihli", "faturayı", "bulamadım", "."]), ("6.dan", ["6.dan"]),
("2.3 tarihli faturayı bulamadım.", ["2.3", "tarihli", "faturayı", "bulamadım", "."]), ("16.dan", ["16.dan"]),
("2.3. tarihli faturayı bulamadım.", ["2.3.", "tarihli", "faturayı", "bulamadım", "."]), ("VI.'dan", ["VI.'dan"]),
("2/3/2020 tarihli faturayı bulamadm.", ["2/3/2020", "tarihli", "faturayı", "bulamadm", "."]), ("VI.dan", ["VI.dan"]),
("2/3/1987 tarihinden beri burda yaşıyorum.", ["2/3/1987", "tarihinden", "beri", "burda", "yaşıyorum", "."]), ("Hepsi 1994 yılında oldu.", ["Hepsi", "1994", "yılında", "oldu", "."]),
("2-3-1987 tarihinden beri burdayım.", ["2-3-1987", "tarihinden", "beri", "burdayım", "."]), ("Hepsi 1994'te oldu.", ["Hepsi", "1994'te", "oldu", "."]),
("2.3.1987 tarihinden beri burdayım.", ["2.3.1987", "tarihinden", "beri", "burdayım", "."]), (
("Bu olay 2005-2006 tarihleri arasında oldu.", ["Bu", "olay", "2005", "-", "2006", "tarihleri", "arasında", "oldu", "."]), "2/3 tarihli faturayı bulamadım.",
("Bu olay 4/12/2005-21/3/2006 tarihleri arasında oldu.", ["Bu", "olay", "4/12/2005", "-", "21/3/2006", "tarihleri", "arasında", "oldu", ".",]), ["2/3", "tarihli", "faturayı", "bulamadım", "."],
("Ek fıkra: 5/11/2003-4999/3 maddesine göre uygundur.", ["Ek", "fıkra", ":", "5/11/2003", "-", "4999/3", "maddesine", "göre", "uygundur", "."]), ),
("2/A alanları: 6831 sayılı Kanunun 2nci maddesinin birinci fıkrasının (A) bendine göre", ["2/A", "alanları", ":", "6831", "sayılı", "Kanunun", "2nci", "maddesinin", "birinci", "fıkrasının", "(", "A", ")", "bendine", "göre"]), (
("ŞEHİTTEĞMENKALMAZ Cad. No: 2/311", ["ŞEHİTTEĞMENKALMAZ", "Cad.", "No", ":", "2/311"]), "2.3 tarihli faturayı bulamadım.",
("2-3-2025", ["2-3-2025",]), ["2.3", "tarihli", "faturayı", "bulamadım", "."],
("2/3/2025", ["2/3/2025"]), ),
("Yıllardır 0.5 uç kullanıyorum.", ["Yıllardır", "0.5", "", "kullanıyorum", "."]), (
("Kan değerlerim 0.5-0.7 arasıydı.", ["Kan", "değerlerim", "0.5", "-", "0.7", "arasıydı", "."]), "2.3. tarihli faturayı bulamadım.",
("0.5", ["0.5"]), ["2.3.", "tarihli", "faturayı", "bulamadım", "."],
("1/2", ["1/2"]), ),
("%1", ["%", "1"]), (
("%1lik", ["%", "1lik"]), "2/3/2020 tarihli faturayı bulamadm.",
("%1'lik", ["%", "1'lik"]), ["2/3/2020", "tarihli", "faturayı", "bulamadm", "."],
("%1lik dilim", ["%", "1lik", "dilim"]), ),
("%1'lik dilim", ["%", "1'lik", "dilim"]), (
("%1.5", ["%", "1.5"]), "2/3/1987 tarihinden beri burda yaşıyorum.",
#("%1-%2 arası büyüme bekleniyor.", ["%", "1", "-", "%", "2", "arası", "büyüme", "bekleniyor", "."]), ["2/3/1987", "tarihinden", "beri", "burda", "yaşıyorum", "."],
("%1-2 arası büyüme bekliyoruz.", ["%", "1", "-", "2", "arası", "büyüme", "bekliyoruz", "."]), ),
("%11-12 arası büyüme bekliyoruz.", ["%", "11", "-", "12", "arası", "büyüme", "bekliyoruz", "."]), (
("%1.5luk büyüme bekliyoruz.", ["%", "1.5luk", "büyüme", "bekliyoruz", "."]), "2-3-1987 tarihinden beri burdayım.",
("Saat 1-2 arası gelin lütfen.", ["Saat", "1", "-", "2", "arası", "gelin", "lütfen", "."]), ["2-3-1987", "tarihinden", "beri", "burdayım", "."],
("Saat 15:30 gibi buluşalım.", ["Saat", "15:30", "gibi", "buluşalım", "."]), ),
("Saat 15:30'da buluşalım.", ["Saat", "15:30'da", "buluşalım", "."]), (
("Saat 15.30'da buluşalım.", ["Saat", "15.30'da", "buluşalım", "."]), "2.3.1987 tarihinden beri burdayım.",
("Saat 15.30da buluşalım.", ["Saat", "15.30da", "buluşalım", "."]), ["2.3.1987", "tarihinden", "beri", "burdayım", "."],
("Saat 15 civarı buluşalım.", ["Saat", "15", "civarı", "buluşalım", "."]), ),
("9daki otobüse binsek mi?", ["9daki", "otobüse", "binsek", "mi", "?"]), (
("Okulumuz 3-B şubesi", ["Okulumuz", "3-B", "şubesi"]), "Bu olay 2005-2006 tarihleri arasında oldu.",
("Okulumuz 3/B şubesi", ["Okulumuz", "3/B", "şubesi"]), ["Bu", "olay", "2005", "-", "2006", "tarihleri", "arasında", "oldu", "."],
("Okulumuz 3B şubesi", ["Okulumuz", "3B", "şubesi"]), ),
("Okulumuz 3b şubesi", ["Okulumuz", "3b", "şubesi"]), (
("Antonio Gaudí 20. yüzyılda, 1904-1914 yılları arasında on yıl süren bir reform süreci getirmiştir.", ["Antonio", "Gaudí", "20.", "yüzyılda", ",", "1904", "-", "1914", "yılları", "arasında", "on", "yıl", "süren", "bir", "reform", "süreci", "getirmiştir", "."]), "Bu olay 4/12/2005-21/3/2006 tarihleri arasında oldu.",
("Dizel yakıtın avro bölgesi ortalaması olan 1,165 avroya kıyasla litre başına 1,335 avroya mal olduğunu gösteriyor.", ["Dizel", "yakıtın", "avro", "bölgesi", "ortalaması", "olan", "1,165", "avroya", "kıyasla", "litre", "başına", "1,335", "avroya", "mal", "olduğunu", "gösteriyor", "."]), [
("Marcus Antonius M.Ö. 1 Ocak 49'da, Sezar'dan Vali'nin kendisini barış dostu ilan ettiği bir bildiri yayınlamıştır.", ["Marcus", "Antonius", "M.Ö.", "1", "Ocak", "49'da", ",", "Sezar'dan", "Vali'nin", "kendisini", "barış", "dostu", "ilan", "ettiği", "bir", "bildiri", "yayınlamıştır", "."]) "Bu",
"olay",
"4/12/2005",
"-",
"21/3/2006",
"tarihleri",
"arasında",
"oldu",
".",
],
),
(
"Ek fıkra: 5/11/2003-4999/3 maddesine göre uygundur.",
[
"Ek",
"fıkra",
":",
"5/11/2003",
"-",
"4999/3",
"maddesine",
"göre",
"uygundur",
".",
],
),
(
"2/A alanları: 6831 sayılı Kanunun 2nci maddesinin birinci fıkrasının (A) bendine göre",
[
"2/A",
"alanları",
":",
"6831",
"sayılı",
"Kanunun",
"2nci",
"maddesinin",
"birinci",
"fıkrasının",
"(",
"A",
")",
"bendine",
"göre",
],
),
(
"ŞEHİTTEĞMENKALMAZ Cad. No: 2/311",
["ŞEHİTTEĞMENKALMAZ", "Cad.", "No", ":", "2/311"],
),
(
"2-3-2025",
[
"2-3-2025",
],
),
("2/3/2025", ["2/3/2025"]),
("Yıllardır 0.5 uç kullanıyorum.", ["Yıllardır", "0.5", "", "kullanıyorum", "."]),
(
"Kan değerlerim 0.5-0.7 arasıydı.",
["Kan", "değerlerim", "0.5", "-", "0.7", "arasıydı", "."],
),
("0.5", ["0.5"]),
("1/2", ["1/2"]),
("%1", ["%", "1"]),
("%1lik", ["%", "1lik"]),
("%1'lik", ["%", "1'lik"]),
("%1lik dilim", ["%", "1lik", "dilim"]),
("%1'lik dilim", ["%", "1'lik", "dilim"]),
("%1.5", ["%", "1.5"]),
# ("%1-%2 arası büyüme bekleniyor.", ["%", "1", "-", "%", "2", "arası", "büyüme", "bekleniyor", "."]),
(
"%1-2 arası büyüme bekliyoruz.",
["%", "1", "-", "2", "arası", "büyüme", "bekliyoruz", "."],
),
(
"%11-12 arası büyüme bekliyoruz.",
["%", "11", "-", "12", "arası", "büyüme", "bekliyoruz", "."],
),
("%1.5luk büyüme bekliyoruz.", ["%", "1.5luk", "büyüme", "bekliyoruz", "."]),
(
"Saat 1-2 arası gelin lütfen.",
["Saat", "1", "-", "2", "arası", "gelin", "lütfen", "."],
),
("Saat 15:30 gibi buluşalım.", ["Saat", "15:30", "gibi", "buluşalım", "."]),
("Saat 15:30'da buluşalım.", ["Saat", "15:30'da", "buluşalım", "."]),
("Saat 15.30'da buluşalım.", ["Saat", "15.30'da", "buluşalım", "."]),
("Saat 15.30da buluşalım.", ["Saat", "15.30da", "buluşalım", "."]),
("Saat 15 civarı buluşalım.", ["Saat", "15", "civarı", "buluşalım", "."]),
("9daki otobüse binsek mi?", ["9daki", "otobüse", "binsek", "mi", "?"]),
("Okulumuz 3-B şubesi", ["Okulumuz", "3-B", "şubesi"]),
("Okulumuz 3/B şubesi", ["Okulumuz", "3/B", "şubesi"]),
("Okulumuz 3B şubesi", ["Okulumuz", "3B", "şubesi"]),
("Okulumuz 3b şubesi", ["Okulumuz", "3b", "şubesi"]),
(
"Antonio Gaudí 20. yüzyılda, 1904-1914 yılları arasında on yıl süren bir reform süreci getirmiştir.",
[
"Antonio",
"Gaudí",
"20.",
"yüzyılda",
",",
"1904",
"-",
"1914",
"yılları",
"arasında",
"on",
"yıl",
"süren",
"bir",
"reform",
"süreci",
"getirmiştir",
".",
],
),
(
"Dizel yakıtın avro bölgesi ortalaması olan 1,165 avroya kıyasla litre başına 1,335 avroya mal olduğunu gösteriyor.",
[
"Dizel",
"yakıtın",
"avro",
"bölgesi",
"ortalaması",
"olan",
"1,165",
"avroya",
"kıyasla",
"litre",
"başına",
"1,335",
"avroya",
"mal",
"olduğunu",
"gösteriyor",
".",
],
),
(
"Marcus Antonius M.Ö. 1 Ocak 49'da, Sezar'dan Vali'nin kendisini barış dostu ilan ettiği bir bildiri yayınlamıştır.",
[
"Marcus",
"Antonius",
"M.Ö.",
"1",
"Ocak",
"49'da",
",",
"Sezar'dan",
"Vali'nin",
"kendisini",
"barış",
"dostu",
"ilan",
"ettiği",
"bir",
"bildiri",
"yayınlamıştır",
".",
],
),
] ]
PUNCT_TESTS = [ PUNCT_TESTS = [
("Gitmedim dedim ya!", ["Gitmedim", "dedim", "ya", "!"]), ("Gitmedim dedim ya!", ["Gitmedim", "dedim", "ya", "!"]),
("Gitmedim dedim ya!!", ["Gitmedim", "dedim", "ya", "!", "!"]), ("Gitmedim dedim ya!!", ["Gitmedim", "dedim", "ya", "!", "!"]),
("Gitsek mi?", ["Gitsek", "mi", "?"]), ("Gitsek mi?", ["Gitsek", "mi", "?"]),
("Gitsek mi??", ["Gitsek", "mi", "?", "?"]), ("Gitsek mi??", ["Gitsek", "mi", "?", "?"]),
("Gitsek mi?!?", ["Gitsek", "mi", "?", "!", "?"]), ("Gitsek mi?!?", ["Gitsek", "mi", "?", "!", "?"]),
("Ankara - Antalya arası otobüs işliyor.", ["Ankara", "-", "Antalya", "arası", "otobüs", "işliyor", "."]), (
("Ankara-Antalya arası otobüs işliyor.", ["Ankara", "-", "Antalya", "arası", "otobüs", "işliyor", "."]), "Ankara - Antalya arası otobüs işliyor.",
("Sen--ben, ya da onlar.", ["Sen", "--", "ben", ",", "ya", "da", "onlar", "."]), ["Ankara", "-", "Antalya", "arası", "otobüs", "işliyor", "."],
("Senden, benden, bizden şarkısını biliyor musun?", ["Senden", ",", "benden", ",", "bizden", "şarkısını", "biliyor", "musun", "?"]), ),
("Akif'le geldik, sonra da o ayrıldı.", ["Akif'le", "geldik", ",", "sonra", "da", "o", "ayrıldı", "."]), (
("Bu adam ne dedi şimdi???", ["Bu", "adam", "ne", "dedi", "şimdi", "?", "?", "?"]), "Ankara-Antalya arası otobüs işliyor.",
("Yok hasta olmuş, yok annesi hastaymış, bahaneler işte...", ["Yok", "hasta", "olmuş", ",", "yok", "annesi", "hastaymış", ",", "bahaneler", "işte", "..."]), ["Ankara", "-", "Antalya", "arası", "otobüs", "işliyor", "."],
("Ankara'dan İstanbul'a ... bir aşk hikayesi.", ["Ankara'dan", "İstanbul'a", "...", "bir", "aşk", "hikayesi", "."]), ),
("Ahmet'te", ["Ahmet'te"]), ("Sen--ben, ya da onlar.", ["Sen", "--", "ben", ",", "ya", "da", "onlar", "."]),
("İstanbul'da", ["İstanbul'da"]), (
"Senden, benden, bizden şarkısını biliyor musun?",
["Senden", ",", "benden", ",", "bizden", "şarkısını", "biliyor", "musun", "?"],
),
(
"Akif'le geldik, sonra da o ayrıldı.",
["Akif'le", "geldik", ",", "sonra", "da", "o", "ayrıldı", "."],
),
("Bu adam ne dedi şimdi???", ["Bu", "adam", "ne", "dedi", "şimdi", "?", "?", "?"]),
(
"Yok hasta olmuş, yok annesi hastaymış, bahaneler işte...",
[
"Yok",
"hasta",
"olmuş",
",",
"yok",
"annesi",
"hastaymış",
",",
"bahaneler",
"işte",
"...",
],
),
(
"Ankara'dan İstanbul'a ... bir aşk hikayesi.",
["Ankara'dan", "İstanbul'a", "...", "bir", "aşk", "hikayesi", "."],
),
("Ahmet'te", ["Ahmet'te"]),
("İstanbul'da", ["İstanbul'da"]),
] ]
GENERAL_TESTS = [ GENERAL_TESTS = [
("1914'teki Endurance seferinde, Sir Ernest Shackleton'ın kaptanlığını yaptığı İngiliz Endurance gemisi yirmi sekiz kişi ile Antarktika'yı geçmek üzere yelken açtı.", ["1914'teki", "Endurance", "seferinde", ",", "Sir", "Ernest", "Shackleton'ın", "kaptanlığını", "yaptığı", "İngiliz", "Endurance", "gemisi", "yirmi", "sekiz", "kişi", "ile", "Antarktika'yı", "geçmek", "üzere", "yelken", "açtı", "."]), (
("Danışılan \"%100 Cospedal\" olduğunu belirtti.", ["Danışılan", '"', "%", "100", "Cospedal", '"', "olduğunu", "belirtti", "."]), "1914'teki Endurance seferinde, Sir Ernest Shackleton'ın kaptanlığını yaptığı İngiliz Endurance gemisi yirmi sekiz kişi ile Antarktika'yı geçmek üzere yelken açtı.",
("1976'da parkur artık kullanılmıyordu; 1990'da ise bir yangın, daha sonraları ahırlarla birlikte yıkılacak olan tahta tribünlerden geri kalanları da yok etmişti.", ["1976'da", "parkur", "artık", "kullanılmıyordu", ";", "1990'da", "ise", "bir", "yangın", ",", "daha", "sonraları", "ahırlarla", "birlikte", "yıkılacak", "olan", "tahta", "tribünlerden", "geri", "kalanları", "da", "yok", "etmişti", "."]), [
("Dahiyane bir ameliyat ve zorlu bir rehabilitasyon sürecinden sonra, tamamen iyileştim.", ["Dahiyane", "bir", "ameliyat", "ve", "zorlu", "bir", "rehabilitasyon", "sürecinden", "sonra", ",", "tamamen", "iyileştim", "."]), "1914'teki",
("Yaklaşık iki hafta süren bireysel erken oy kullanma döneminin ardından 5,7 milyondan fazla Floridalı sandık başına gitti.", ["Yaklaşık", "iki", "hafta", "süren", "bireysel", "erken", "oy", "kullanma", "döneminin", "ardından", "5,7", "milyondan", "fazla", "Floridalı", "sandık", "başına", "gitti", "."]), "Endurance",
("Ancak, bu ABD Çevre Koruma Ajansı'nın dünyayı bu konularda uyarmasının ardından ortaya çıktı.", ["Ancak", ",", "bu", "ABD", "Çevre", "Koruma", "Ajansı'nın", "dünyayı", "bu", "konularda", "uyarmasının", "ardından", "ortaya", "çıktı", "."]), "seferinde",
("Ortalama şansa ve 10.000 Sterlin değerinde tahvillere sahip bir yatırımcı yılda 125 Sterlin ikramiye kazanabilir.", ["Ortalama", "şansa", "ve", "10.000", "Sterlin", "değerinde", "tahvillere", "sahip", "bir", "yatırımcı", "yılda", "125", "Sterlin", "ikramiye", "kazanabilir", "."]), ",",
("Granit adaları; Seyşeller ve Tioman ile Saint Helena gibi volkanik adaları kapsar." , ["Granit", "adaları", ";", "Seyşeller", "ve", "Tioman", "ile", "Saint", "Helena", "gibi", "volkanik", "adaları", "kapsar", "."]), "Sir",
("Barış antlaşmasıyla İspanya, Amerika'ya Porto Riko, Guam ve Filipinler kolonilerini devretti.", ["Barış", "antlaşmasıyla", "İspanya", ",", "Amerika'ya", "Porto", "Riko", ",", "Guam", "ve", "Filipinler", "kolonilerini", "devretti", "."]), "Ernest",
("Makedonya\'nın sınır bölgelerini güvence altına alan Philip, büyük bir Makedon ordusu kurdu ve uzun bir fetih seferi için Trakya\'ya doğru yürüdü.", ["Makedonya\'nın", "sınır", "bölgelerini", "güvence", "altına", "alan", "Philip", ",", "büyük", "bir", "Makedon", "ordusu", "kurdu", "ve", "uzun", "bir", "fetih", "seferi", "için", "Trakya\'ya", "doğru", "yürüdü", "."]), "Shackleton'ın",
("Fransız gazetesi Le Figaro'ya göre bu hükumet planı sayesinde 42 milyon Euro kazanç sağlanabilir ve elde edilen paranın 15.5 milyonu ulusal güvenlik için kullanılabilir.", ["Fransız", "gazetesi", "Le", "Figaro'ya", "göre", "bu", "hükumet", "planı", "sayesinde", "42", "milyon", "Euro", "kazanç", "sağlanabilir", "ve", "elde", "edilen", "paranın", "15.5", "milyonu", "ulusal", "güvenlik", "için", "kullanılabilir", "."]), "kaptanlığını",
("Ortalama şansa ve 10.000 Sterlin değerinde tahvillere sahip bir yatırımcı yılda 125 Sterlin ikramiye kazanabilir.", ["Ortalama", "şansa", "ve", "10.000", "Sterlin", "değerinde", "tahvillere", "sahip", "bir", "yatırımcı", "yılda", "125", "Sterlin", "ikramiye", "kazanabilir", "."]), "yaptığı",
("3 Kasım Salı günü, Ankara Belediye Başkanı 2014'te hükümetle birlikte oluşturulan kentsel gelişim anlaşmasını askıya alma kararı verdi.", ["3", "Kasım", "Salı", "günü", ",", "Ankara", "Belediye", "Başkanı", "2014'te", "hükümetle", "birlikte", "oluşturulan", "kentsel", "gelişim", "anlaşmasını", "askıya", "alma", "kararı", "verdi", "."]), "İngiliz",
("Stalin, Abakumov'u Beria'nın enerji bakanlıkları üzerindeki baskınlığına karşı MGB içinde kendi ağını kurmaya teşvik etmeye başlamıştı.", ["Stalin", ",", "Abakumov'u", "Beria'nın", "enerji", "bakanlıkları", "üzerindeki", "baskınlığına", "karşı", "MGB", "içinde", "kendi", "ını", "kurmaya", "teşvik", "etmeye", "başlamıştı", "."]), "Endurance",
("Güney Avrupa'daki kazı alanlarının çoğunluğu gibi, bu bulgu M.Ö. 5. yüzyılın başlar", ["Güney", "Avrupa'daki", "kazı", "alanlarının", "çoğunluğu", "gibi", ",", "bu", "bulgu", "M.Ö.", "5.", "yüzyılın", "başlar"]), "gemisi",
("Sağlığın bozulması Hitchcock hayatının son yirmi yılında üretimini azalttı.", ["Sağlığın", "bozulması", "Hitchcock", "hayatının", "son", "yirmi", "yılında", "üretimini", "azalttı", "."]), "yirmi",
"sekiz",
"kişi",
"ile",
"Antarktika'yı",
"geçmek",
"üzere",
"yelken",
"açtı",
".",
],
),
(
'Danışılan "%100 Cospedal" olduğunu belirtti.',
["Danışılan", '"', "%", "100", "Cospedal", '"', "olduğunu", "belirtti", "."],
),
(
"1976'da parkur artık kullanılmıyordu; 1990'da ise bir yangın, daha sonraları ahırlarla birlikte yıkılacak olan tahta tribünlerden geri kalanları da yok etmişti.",
[
"1976'da",
"parkur",
"artık",
"kullanılmıyordu",
";",
"1990'da",
"ise",
"bir",
"yangın",
",",
"daha",
"sonraları",
"ahırlarla",
"birlikte",
"yıkılacak",
"olan",
"tahta",
"tribünlerden",
"geri",
"kalanları",
"da",
"yok",
"etmişti",
".",
],
),
(
"Dahiyane bir ameliyat ve zorlu bir rehabilitasyon sürecinden sonra, tamamen iyileştim.",
[
"Dahiyane",
"bir",
"ameliyat",
"ve",
"zorlu",
"bir",
"rehabilitasyon",
"sürecinden",
"sonra",
",",
"tamamen",
"iyileştim",
".",
],
),
(
"Yaklaşık iki hafta süren bireysel erken oy kullanma döneminin ardından 5,7 milyondan fazla Floridalı sandık başına gitti.",
[
"Yaklaşık",
"iki",
"hafta",
"süren",
"bireysel",
"erken",
"oy",
"kullanma",
"döneminin",
"ardından",
"5,7",
"milyondan",
"fazla",
"Floridalı",
"sandık",
"başına",
"gitti",
".",
],
),
(
"Ancak, bu ABD Çevre Koruma Ajansı'nın dünyayı bu konularda uyarmasının ardından ortaya çıktı.",
[
"Ancak",
",",
"bu",
"ABD",
"Çevre",
"Koruma",
"Ajansı'nın",
"dünyayı",
"bu",
"konularda",
"uyarmasının",
"ardından",
"ortaya",
"çıktı",
".",
],
),
(
"Ortalama şansa ve 10.000 Sterlin değerinde tahvillere sahip bir yatırımcı yılda 125 Sterlin ikramiye kazanabilir.",
[
"Ortalama",
"şansa",
"ve",
"10.000",
"Sterlin",
"değerinde",
"tahvillere",
"sahip",
"bir",
"yatırımcı",
"yılda",
"125",
"Sterlin",
"ikramiye",
"kazanabilir",
".",
],
),
(
"Granit adaları; Seyşeller ve Tioman ile Saint Helena gibi volkanik adaları kapsar.",
[
"Granit",
"adaları",
";",
"Seyşeller",
"ve",
"Tioman",
"ile",
"Saint",
"Helena",
"gibi",
"volkanik",
"adaları",
"kapsar",
".",
],
),
(
"Barış antlaşmasıyla İspanya, Amerika'ya Porto Riko, Guam ve Filipinler kolonilerini devretti.",
[
"Barış",
"antlaşmasıyla",
"İspanya",
",",
"Amerika'ya",
"Porto",
"Riko",
",",
"Guam",
"ve",
"Filipinler",
"kolonilerini",
"devretti",
".",
],
),
(
"Makedonya'nın sınır bölgelerini güvence altına alan Philip, büyük bir Makedon ordusu kurdu ve uzun bir fetih seferi için Trakya'ya doğru yürüdü.",
[
"Makedonya'nın",
"sınır",
"bölgelerini",
"güvence",
"altına",
"alan",
"Philip",
",",
"büyük",
"bir",
"Makedon",
"ordusu",
"kurdu",
"ve",
"uzun",
"bir",
"fetih",
"seferi",
"için",
"Trakya'ya",
"doğru",
"yürüdü",
".",
],
),
(
"Fransız gazetesi Le Figaro'ya göre bu hükumet planı sayesinde 42 milyon Euro kazanç sağlanabilir ve elde edilen paranın 15.5 milyonu ulusal güvenlik için kullanılabilir.",
[
"Fransız",
"gazetesi",
"Le",
"Figaro'ya",
"göre",
"bu",
"hükumet",
"planı",
"sayesinde",
"42",
"milyon",
"Euro",
"kazanç",
"sağlanabilir",
"ve",
"elde",
"edilen",
"paranın",
"15.5",
"milyonu",
"ulusal",
"güvenlik",
"için",
"kullanılabilir",
".",
],
),
(
"Ortalama şansa ve 10.000 Sterlin değerinde tahvillere sahip bir yatırımcı yılda 125 Sterlin ikramiye kazanabilir.",
[
"Ortalama",
"şansa",
"ve",
"10.000",
"Sterlin",
"değerinde",
"tahvillere",
"sahip",
"bir",
"yatırımcı",
"yılda",
"125",
"Sterlin",
"ikramiye",
"kazanabilir",
".",
],
),
(
"3 Kasım Salı günü, Ankara Belediye Başkanı 2014'te hükümetle birlikte oluşturulan kentsel gelişim anlaşmasını askıya alma kararı verdi.",
[
"3",
"Kasım",
"Salı",
"günü",
",",
"Ankara",
"Belediye",
"Başkanı",
"2014'te",
"hükümetle",
"birlikte",
"oluşturulan",
"kentsel",
"gelişim",
"anlaşmasını",
"askıya",
"alma",
"kararı",
"verdi",
".",
],
),
(
"Stalin, Abakumov'u Beria'nın enerji bakanlıkları üzerindeki baskınlığına karşı MGB içinde kendi ağını kurmaya teşvik etmeye başlamıştı.",
[
"Stalin",
",",
"Abakumov'u",
"Beria'nın",
"enerji",
"bakanlıkları",
"üzerindeki",
"baskınlığına",
"karşı",
"MGB",
"içinde",
"kendi",
"ını",
"kurmaya",
"teşvik",
"etmeye",
"başlamıştı",
".",
],
),
(
"Güney Avrupa'daki kazı alanlarının çoğunluğu gibi, bu bulgu M.Ö. 5. yüzyılın başlar",
[
"Güney",
"Avrupa'daki",
"kazı",
"alanlarının",
"çoğunluğu",
"gibi",
",",
"bu",
"bulgu",
"M.Ö.",
"5.",
"yüzyılın",
"başlar",
],
),
(
"Sağlığın bozulması Hitchcock hayatının son yirmi yılında üretimini azalttı.",
[
"Sağlığın",
"bozulması",
"Hitchcock",
"hayatının",
"son",
"yirmi",
"yılında",
"üretimini",
"azalttı",
".",
],
),
] ]
TESTS = ABBREV_TESTS + URL_TESTS + NUMBER_TESTS + PUNCT_TESTS + GENERAL_TESTS
TESTS = (ABBREV_TESTS + URL_TESTS + NUMBER_TESTS + PUNCT_TESTS + GENERAL_TESTS)
@pytest.mark.parametrize("text,expected_tokens", TESTS) @pytest.mark.parametrize("text,expected_tokens", TESTS)
@ -149,4 +696,3 @@ def test_tr_tokenizer_handles_allcases(tr_tokenizer, text, expected_tokens):
token_list = [token.text for token in tokens if not token.is_space] token_list = [token.text for token in tokens if not token.is_space]
print(token_list) print(token_list)
assert expected_tokens == token_list assert expected_tokens == token_list

View File

@ -7,7 +7,6 @@ from spacy.tokens import Doc
from spacy.pipeline._parser_internals.nonproj import projectivize from spacy.pipeline._parser_internals.nonproj import projectivize
from spacy.pipeline._parser_internals.arc_eager import ArcEager from spacy.pipeline._parser_internals.arc_eager import ArcEager
from spacy.pipeline.dep_parser import DEFAULT_PARSER_MODEL from spacy.pipeline.dep_parser import DEFAULT_PARSER_MODEL
from spacy.pipeline._parser_internals.stateclass import StateClass
def get_sequence_costs(M, words, heads, deps, transitions): def get_sequence_costs(M, words, heads, deps, transitions):
@ -59,7 +58,7 @@ def test_oracle_four_words(arc_eager, vocab):
["S"], ["S"],
["L-left"], ["L-left"],
["S"], ["S"],
["D"] ["D"],
] ]
assert state.is_final() assert state.is_final()
for i, state_costs in enumerate(cost_history): for i, state_costs in enumerate(cost_history):
@ -185,9 +184,9 @@ def test_oracle_dev_sentence(vocab, arc_eager):
"L-nn", # Attach 'Cars' to 'Inc.' "L-nn", # Attach 'Cars' to 'Inc.'
"L-nn", # Attach 'Motor' to 'Inc.' "L-nn", # Attach 'Motor' to 'Inc.'
"L-nn", # Attach 'Rolls-Royce' to 'Inc.' "L-nn", # Attach 'Rolls-Royce' to 'Inc.'
"S", # Shift "Inc." "S", # Shift "Inc."
"L-nsubj", # Attach 'Inc.' to 'said' "L-nsubj", # Attach 'Inc.' to 'said'
"S", # Shift 'said' "S", # Shift 'said'
"S", # Shift 'it' "S", # Shift 'it'
"L-nsubj", # Attach 'it.' to 'expects' "L-nsubj", # Attach 'it.' to 'expects'
"R-ccomp", # Attach 'expects' to 'said' "R-ccomp", # Attach 'expects' to 'said'
@ -251,7 +250,7 @@ def test_oracle_bad_tokenization(vocab, arc_eager):
is root is is root is
bad comp is bad comp is
""" """
gold_words = [] gold_words = []
gold_deps = [] gold_deps = []
gold_heads = [] gold_heads = []
@ -268,7 +267,9 @@ def test_oracle_bad_tokenization(vocab, arc_eager):
arc_eager.add_action(2, dep) # Left arc_eager.add_action(2, dep) # Left
arc_eager.add_action(3, dep) # Right arc_eager.add_action(3, dep) # Right
reference = Doc(Vocab(), words=gold_words, deps=gold_deps, heads=gold_heads) reference = Doc(Vocab(), words=gold_words, deps=gold_deps, heads=gold_heads)
predicted = Doc(reference.vocab, words=["[", "catalase", "]", ":", "that", "is", "bad"]) predicted = Doc(
reference.vocab, words=["[", "catalase", "]", ":", "that", "is", "bad"]
)
example = Example(predicted=predicted, reference=reference) example = Example(predicted=predicted, reference=reference)
ae_oracle_actions = arc_eager.get_oracle_sequence(example, _debug=False) ae_oracle_actions = arc_eager.get_oracle_sequence(example, _debug=False)
ae_oracle_actions = [arc_eager.get_class_name(i) for i in ae_oracle_actions] ae_oracle_actions = [arc_eager.get_class_name(i) for i in ae_oracle_actions]

View File

@ -301,9 +301,7 @@ def test_block_ner():
assert [token.ent_type_ for token in doc] == expected_types assert [token.ent_type_ for token in doc] == expected_types
@pytest.mark.parametrize( @pytest.mark.parametrize("use_upper", [True, False])
"use_upper", [True, False]
)
def test_overfitting_IO(use_upper): def test_overfitting_IO(use_upper):
# Simple test to try and quickly overfit the NER component - ensuring the ML models work correctly # Simple test to try and quickly overfit the NER component - ensuring the ML models work correctly
nlp = English() nlp = English()

View File

@ -1,13 +1,9 @@
# coding: utf8
from __future__ import unicode_literals
import pytest import pytest
import hypothesis import hypothesis
import hypothesis.strategies import hypothesis.strategies
import numpy import numpy
from spacy.vocab import Vocab from spacy.vocab import Vocab
from spacy.language import Language from spacy.language import Language
from spacy.pipeline import DependencyParser
from spacy.pipeline._parser_internals.arc_eager import ArcEager from spacy.pipeline._parser_internals.arc_eager import ArcEager
from spacy.tokens import Doc from spacy.tokens import Doc
from spacy.pipeline._parser_internals._beam_utils import BeamBatch from spacy.pipeline._parser_internals._beam_utils import BeamBatch
@ -44,7 +40,7 @@ def docs(vocab):
words=["Rats", "bite", "things"], words=["Rats", "bite", "things"],
heads=[1, 1, 1], heads=[1, 1, 1],
deps=["nsubj", "ROOT", "dobj"], deps=["nsubj", "ROOT", "dobj"],
sent_starts=[True, False, False] sent_starts=[True, False, False],
) )
] ]
@ -77,10 +73,12 @@ def batch_size(docs):
def beam_width(): def beam_width():
return 4 return 4
@pytest.fixture(params=[0.0, 0.5, 1.0]) @pytest.fixture(params=[0.0, 0.5, 1.0])
def beam_density(request): def beam_density(request):
return request.param return request.param
@pytest.fixture @pytest.fixture
def vector_size(): def vector_size():
return 6 return 6
@ -100,7 +98,9 @@ def scores(moves, batch_size, beam_width):
numpy.random.uniform(-0.1, 0.1, (beam_width, moves.n_moves)) numpy.random.uniform(-0.1, 0.1, (beam_width, moves.n_moves))
for _ in range(batch_size) for _ in range(batch_size)
] ]
), dtype="float32") ),
dtype="float32",
)
def test_create_beam(beam): def test_create_beam(beam):
@ -128,8 +128,6 @@ def test_beam_parse(examples, beam_width):
parser(doc) parser(doc)
@hypothesis.given(hyp=hypothesis.strategies.data()) @hypothesis.given(hyp=hypothesis.strategies.data())
def test_beam_density(moves, examples, beam_width, hyp): def test_beam_density(moves, examples, beam_width, hyp):
beam_density = float(hyp.draw(hypothesis.strategies.floats(0.0, 1.0, width=32))) beam_density = float(hyp.draw(hypothesis.strategies.floats(0.0, 1.0, width=32)))

View File

@ -4,14 +4,17 @@ from spacy.tokens.doc import Doc
from spacy.vocab import Vocab from spacy.vocab import Vocab
from spacy.pipeline._parser_internals.stateclass import StateClass from spacy.pipeline._parser_internals.stateclass import StateClass
@pytest.fixture @pytest.fixture
def vocab(): def vocab():
return Vocab() return Vocab()
@pytest.fixture @pytest.fixture
def doc(vocab): def doc(vocab):
return Doc(vocab, words=["a", "b", "c", "d"]) return Doc(vocab, words=["a", "b", "c", "d"])
def test_init_state(doc): def test_init_state(doc):
state = StateClass(doc) state = StateClass(doc)
assert state.stack == [] assert state.stack == []
@ -19,6 +22,7 @@ def test_init_state(doc):
assert not state.is_final() assert not state.is_final()
assert state.buffer_length() == 4 assert state.buffer_length() == 4
def test_push_pop(doc): def test_push_pop(doc):
state = StateClass(doc) state = StateClass(doc)
state.push() state.push()
@ -33,6 +37,7 @@ def test_push_pop(doc):
assert state.stack == [0] assert state.stack == [0]
assert 1 not in state.queue assert 1 not in state.queue
def test_stack_depth(doc): def test_stack_depth(doc):
state = StateClass(doc) state = StateClass(doc)
assert state.stack_depth() == 0 assert state.stack_depth() == 0

View File

@ -161,7 +161,7 @@ def test_attributeruler_score(nlp, pattern_dicts):
# "cat" is the only correct lemma # "cat" is the only correct lemma
assert scores["lemma_acc"] == pytest.approx(0.2) assert scores["lemma_acc"] == pytest.approx(0.2)
# no morphs are set # no morphs are set
assert scores["morph_acc"] == None assert scores["morph_acc"] is None
def test_attributeruler_rule_order(nlp): def test_attributeruler_rule_order(nlp):

View File

@ -201,13 +201,9 @@ def test_entity_ruler_overlapping_spans(nlp):
@pytest.mark.parametrize("n_process", [1, 2]) @pytest.mark.parametrize("n_process", [1, 2])
def test_entity_ruler_multiprocessing(nlp, n_process): def test_entity_ruler_multiprocessing(nlp, n_process):
texts = [ texts = ["I enjoy eating Pizza Hut pizza."]
"I enjoy eating Pizza Hut pizza."
]
patterns = [ patterns = [{"label": "FASTFOOD", "pattern": "Pizza Hut", "id": "1234"}]
{"label": "FASTFOOD", "pattern": "Pizza Hut", "id": "1234"}
]
ruler = nlp.add_pipe("entity_ruler") ruler = nlp.add_pipe("entity_ruler")
ruler.add_patterns(patterns) ruler.add_patterns(patterns)

View File

@ -159,8 +159,12 @@ def test_pipe_class_component_model():
"model": { "model": {
"@architectures": "spacy.TextCatEnsemble.v2", "@architectures": "spacy.TextCatEnsemble.v2",
"tok2vec": DEFAULT_TOK2VEC_MODEL, "tok2vec": DEFAULT_TOK2VEC_MODEL,
"linear_model": {"@architectures": "spacy.TextCatBOW.v1", "exclusive_classes": False, "ngram_size": 1, "linear_model": {
"no_output_layer": False}, "@architectures": "spacy.TextCatBOW.v1",
"exclusive_classes": False,
"ngram_size": 1,
"no_output_layer": False,
},
}, },
"value1": 10, "value1": 10,
} }

View File

@ -126,6 +126,7 @@ def test_incomplete_data():
assert doc[1].tag_ is "V" assert doc[1].tag_ is "V"
assert doc[2].tag_ is "J" assert doc[2].tag_ is "J"
def test_overfitting_IO(): def test_overfitting_IO():
# Simple test to try and quickly overfit the tagger - ensuring the ML models work correctly # Simple test to try and quickly overfit the tagger - ensuring the ML models work correctly
nlp = English() nlp = English()

View File

@ -1,4 +1,3 @@
import pydantic
import pytest import pytest
from pydantic import ValidationError from pydantic import ValidationError
from spacy.schemas import TokenPattern, TokenPatternSchema from spacy.schemas import TokenPattern, TokenPatternSchema

View File

@ -207,7 +207,7 @@ def test_create_nlp_from_pretraining_config():
config = Config().from_str(pretrain_config_string) config = Config().from_str(pretrain_config_string)
pretrain_config = load_config(DEFAULT_CONFIG_PRETRAIN_PATH) pretrain_config = load_config(DEFAULT_CONFIG_PRETRAIN_PATH)
filled = config.merge(pretrain_config) filled = config.merge(pretrain_config)
resolved = registry.resolve(filled["pretraining"], schema=ConfigSchemaPretrain) registry.resolve(filled["pretraining"], schema=ConfigSchemaPretrain)
def test_create_nlp_from_config_multiple_instances(): def test_create_nlp_from_config_multiple_instances():
@ -291,7 +291,6 @@ def test_serialize_parser(parser_config_string):
assert model.get_ref("lower").get_dim("nI") == 66 assert model.get_ref("lower").get_dim("nI") == 66
def test_config_nlp_roundtrip(): def test_config_nlp_roundtrip():
"""Test that a config prduced by the nlp object passes training config """Test that a config prduced by the nlp object passes training config
validation.""" validation."""

View File

@ -24,7 +24,7 @@ def parser(en_vocab):
"update_with_oracle_cut_size": 100, "update_with_oracle_cut_size": 100,
"beam_width": 1, "beam_width": 1,
"beam_update_prob": 1.0, "beam_update_prob": 1.0,
"beam_density": 0.0 "beam_density": 0.0,
} }
cfg = {"model": DEFAULT_PARSER_MODEL} cfg = {"model": DEFAULT_PARSER_MODEL}
model = registry.resolve(cfg, validate=True)["model"] model = registry.resolve(cfg, validate=True)["model"]
@ -41,7 +41,7 @@ def blank_parser(en_vocab):
"update_with_oracle_cut_size": 100, "update_with_oracle_cut_size": 100,
"beam_width": 1, "beam_width": 1,
"beam_update_prob": 1.0, "beam_update_prob": 1.0,
"beam_density": 0.0 "beam_density": 0.0,
} }
cfg = {"model": DEFAULT_PARSER_MODEL} cfg = {"model": DEFAULT_PARSER_MODEL}
model = registry.resolve(cfg, validate=True)["model"] model = registry.resolve(cfg, validate=True)["model"]
@ -66,7 +66,7 @@ def test_serialize_parser_roundtrip_bytes(en_vocab, Parser):
"update_with_oracle_cut_size": 100, "update_with_oracle_cut_size": 100,
"beam_width": 1, "beam_width": 1,
"beam_update_prob": 1.0, "beam_update_prob": 1.0,
"beam_density": 0.0 "beam_density": 0.0,
} }
cfg = {"model": DEFAULT_PARSER_MODEL} cfg = {"model": DEFAULT_PARSER_MODEL}
model = registry.resolve(cfg, validate=True)["model"] model = registry.resolve(cfg, validate=True)["model"]
@ -90,7 +90,7 @@ def test_serialize_parser_strings(Parser):
"update_with_oracle_cut_size": 100, "update_with_oracle_cut_size": 100,
"beam_width": 1, "beam_width": 1,
"beam_update_prob": 1.0, "beam_update_prob": 1.0,
"beam_density": 0.0 "beam_density": 0.0,
} }
cfg = {"model": DEFAULT_PARSER_MODEL} cfg = {"model": DEFAULT_PARSER_MODEL}
model = registry.resolve(cfg, validate=True)["model"] model = registry.resolve(cfg, validate=True)["model"]
@ -112,7 +112,7 @@ def test_serialize_parser_roundtrip_disk(en_vocab, Parser):
"update_with_oracle_cut_size": 100, "update_with_oracle_cut_size": 100,
"beam_width": 1, "beam_width": 1,
"beam_update_prob": 1.0, "beam_update_prob": 1.0,
"beam_density": 0.0 "beam_density": 0.0,
} }
cfg = {"model": DEFAULT_PARSER_MODEL} cfg = {"model": DEFAULT_PARSER_MODEL}
model = registry.resolve(cfg, validate=True)["model"] model = registry.resolve(cfg, validate=True)["model"]

View File

@ -83,6 +83,7 @@ def test_PrecomputableAffine(nO=4, nI=5, nF=3, nP=2):
def test_prefer_gpu(): def test_prefer_gpu():
try: try:
import cupy # noqa: F401 import cupy # noqa: F401
prefer_gpu() prefer_gpu()
assert isinstance(get_current_ops(), CupyOps) assert isinstance(get_current_ops(), CupyOps)
except ImportError: except ImportError:
@ -92,17 +93,20 @@ def test_prefer_gpu():
def test_require_gpu(): def test_require_gpu():
try: try:
import cupy # noqa: F401 import cupy # noqa: F401
require_gpu() require_gpu()
assert isinstance(get_current_ops(), CupyOps) assert isinstance(get_current_ops(), CupyOps)
except ImportError: except ImportError:
with pytest.raises(ValueError): with pytest.raises(ValueError):
require_gpu() require_gpu()
def test_require_cpu(): def test_require_cpu():
require_cpu() require_cpu()
assert isinstance(get_current_ops(), NumpyOps) assert isinstance(get_current_ops(), NumpyOps)
try: try:
import cupy # noqa: F401 import cupy # noqa: F401
require_gpu() require_gpu()
assert isinstance(get_current_ops(), CupyOps) assert isinstance(get_current_ops(), CupyOps)
except ImportError: except ImportError:

View File

@ -294,7 +294,7 @@ def test_partial_annotation(en_tokenizer):
# cats doesn't have an unset state # cats doesn't have an unset state
if key.startswith("cats"): if key.startswith("cats"):
continue continue
assert scores[key] == None assert scores[key] is None
# partially annotated reference, not overlapping with predicted annotation # partially annotated reference, not overlapping with predicted annotation
ref_doc = en_tokenizer("a b c d e") ref_doc = en_tokenizer("a b c d e")
@ -306,13 +306,13 @@ def test_partial_annotation(en_tokenizer):
example = Example(pred_doc, ref_doc) example = Example(pred_doc, ref_doc)
scorer = Scorer() scorer = Scorer()
scores = scorer.score([example]) scores = scorer.score([example])
assert scores["token_acc"] == None assert scores["token_acc"] is None
assert scores["tag_acc"] == 0.0 assert scores["tag_acc"] == 0.0
assert scores["pos_acc"] == 0.0 assert scores["pos_acc"] == 0.0
assert scores["morph_acc"] == 0.0 assert scores["morph_acc"] == 0.0
assert scores["dep_uas"] == 1.0 assert scores["dep_uas"] == 1.0
assert scores["dep_las"] == 0.0 assert scores["dep_las"] == 0.0
assert scores["sents_f"] == None assert scores["sents_f"] is None
# partially annotated reference, overlapping with predicted annotation # partially annotated reference, overlapping with predicted annotation
ref_doc = en_tokenizer("a b c d e") ref_doc = en_tokenizer("a b c d e")
@ -324,13 +324,13 @@ def test_partial_annotation(en_tokenizer):
example = Example(pred_doc, ref_doc) example = Example(pred_doc, ref_doc)
scorer = Scorer() scorer = Scorer()
scores = scorer.score([example]) scores = scorer.score([example])
assert scores["token_acc"] == None assert scores["token_acc"] is None
assert scores["tag_acc"] == 1.0 assert scores["tag_acc"] == 1.0
assert scores["pos_acc"] == 1.0 assert scores["pos_acc"] == 1.0
assert scores["morph_acc"] == 0.0 assert scores["morph_acc"] == 0.0
assert scores["dep_uas"] == 1.0 assert scores["dep_uas"] == 1.0
assert scores["dep_las"] == 0.0 assert scores["dep_las"] == 0.0
assert scores["sents_f"] == None assert scores["sents_f"] is None
def test_roc_auc_score(): def test_roc_auc_score():
@ -391,7 +391,7 @@ def test_roc_auc_score():
score.score_set(0.25, 0) score.score_set(0.25, 0)
score.score_set(0.75, 0) score.score_set(0.75, 0)
with pytest.raises(ValueError): with pytest.raises(ValueError):
s = score.score _ = score.score # noqa: F841
y_true = [1, 1] y_true = [1, 1]
y_score = [0.25, 0.75] y_score = [0.25, 0.75]
@ -402,4 +402,4 @@ def test_roc_auc_score():
score.score_set(0.25, 1) score.score_set(0.25, 1)
score.score_set(0.75, 1) score.score_set(0.75, 1)
with pytest.raises(ValueError): with pytest.raises(ValueError):
s = score.score _ = score.score # noqa: F841

View File

@ -73,7 +73,7 @@ def test_cat_readers(reader, additional_config):
nlp_config_string = """ nlp_config_string = """
[training] [training]
seed = 0 seed = 0
[training.score_weights] [training.score_weights]
cats_macro_auc = 1.0 cats_macro_auc = 1.0

View File

@ -37,9 +37,17 @@ def init_nlp(config: Config, *, use_gpu: int = -1) -> "Language":
T = registry.resolve(config["training"], schema=ConfigSchemaTraining) T = registry.resolve(config["training"], schema=ConfigSchemaTraining)
dot_names = [T["train_corpus"], T["dev_corpus"]] dot_names = [T["train_corpus"], T["dev_corpus"]]
if not isinstance(T["train_corpus"], str): if not isinstance(T["train_corpus"], str):
raise ConfigValidationError(desc=Errors.E897.format(field="training.train_corpus", type=type(T["train_corpus"]))) raise ConfigValidationError(
desc=Errors.E897.format(
field="training.train_corpus", type=type(T["train_corpus"])
)
)
if not isinstance(T["dev_corpus"], str): if not isinstance(T["dev_corpus"], str):
raise ConfigValidationError(desc=Errors.E897.format(field="training.dev_corpus", type=type(T["dev_corpus"]))) raise ConfigValidationError(
desc=Errors.E897.format(
field="training.dev_corpus", type=type(T["dev_corpus"])
)
)
train_corpus, dev_corpus = resolve_dot_names(config, dot_names) train_corpus, dev_corpus = resolve_dot_names(config, dot_names)
optimizer = T["optimizer"] optimizer = T["optimizer"]
# Components that shouldn't be updated during training # Components that shouldn't be updated during training

View File

@ -10,7 +10,7 @@ from wasabi import Printer
from .example import Example from .example import Example
from ..tokens import Doc from ..tokens import Doc
from ..schemas import ConfigSchemaTraining, ConfigSchemaPretrain from ..schemas import ConfigSchemaPretrain
from ..util import registry, load_model_from_config, dot_to_object from ..util import registry, load_model_from_config, dot_to_object
@ -30,7 +30,6 @@ def pretrain(
set_gpu_allocator(allocator) set_gpu_allocator(allocator)
nlp = load_model_from_config(config) nlp = load_model_from_config(config)
_config = nlp.config.interpolate() _config = nlp.config.interpolate()
T = registry.resolve(_config["training"], schema=ConfigSchemaTraining)
P = registry.resolve(_config["pretraining"], schema=ConfigSchemaPretrain) P = registry.resolve(_config["pretraining"], schema=ConfigSchemaPretrain)
corpus = dot_to_object(_config, P["corpus"]) corpus = dot_to_object(_config, P["corpus"])
corpus = registry.resolve({"corpus": corpus})["corpus"] corpus = registry.resolve({"corpus": corpus})["corpus"]

View File

@ -69,7 +69,7 @@ CONFIG_SECTION_ORDER = ["paths", "variables", "system", "nlp", "components", "co
logger = logging.getLogger("spacy") logger = logging.getLogger("spacy")
logger_stream_handler = logging.StreamHandler() logger_stream_handler = logging.StreamHandler()
logger_stream_handler.setFormatter(logging.Formatter('%(message)s')) logger_stream_handler.setFormatter(logging.Formatter("%(message)s"))
logger.addHandler(logger_stream_handler) logger.addHandler(logger_stream_handler)