Skip to main content

Linear-chain conditional random fields for natural language processing

Project description

Chaine

downloads downloads/month downloads/week

Chaine is a modern, fast and lightweight Python library implementing linear-chain conditional random fields. Use it for sequence labeling tasks like named entity recognition or part-of-speech tagging.

The main goals of this project are:

  • Usability: Designed with special focus on usability and a beautiful high-level API.
  • Efficiency: Performance critical parts are written in C and thus blazingly fast. Loading a model from disk and retrieving feature weights for inference is optimized for both speed and memory.
  • Persistency: No pickle or joblib is used for serialization. A trained model will be compatible with all versions for eternity, because the underlying C library will not change. I promise.
  • Compatibility: There are wheels for Linux, macOS and Windows. No compiler needed.
  • Minimalism: No code bloat, no external dependencies.

Install the latest stable version from PyPI:

pip install chaine

Table of contents

Algorithms

You can train models using the following methods:

Please refer to the paper by Lafferty et al. for a general introduction to conditional random fields or the respective chapter in Speech and Language Processing.

Usage

Training and using a conditional random field for inference is easy as:

>>> import chaine
>>> tokens = [[{"index": 0, "text": "John"}, {"index": 1, "text": "Lennon"}]]
>>> labels = [["B-PER", "I-PER"]]
>>> model = chaine.train(tokens, labels)
>>> model.predict(tokens)
[['B-PER', 'I-PER']]

You can control verbosity with the argument verbose, where 0 will set the log level to ERROR, 1 to INFO (which is the default) and 2 to DEBUG.

Features

One token in a sequence is represented as a dictionary with describing feature names as keys and respective values of type string, integer, float or boolean:

{
    "text": "John",
    "num_characters": 4,
    "relative_index": 0.0,
    "is_number": False,
}

One sequence is represented as a list of feature dictionaries:

[
    {"text": "John", "num_characters": 4}, 
    {"text": "Lennon", "num_characters": 6}
]

One data set is represented as an iterable of a list of feature dictionaries:

[
    [
        {"text": "John", "num_characters": 4}, 
        {"text": "Lennon", "num_characters": 6}
    ],
    [
        {"text": "Paul", "num_characters": 4}, 
        {"text": "McCartney", "num_characters": 9}
    ],
    ...
]

This is the expected input format for training. For inference, you can also process a single sequence rather than a batch of multiple sequences.

Generators

Depending on the size of your data set, it probably makes sense to use generators. Something like this would be totally fine for both training and inference:

([extract_features(token) for token in tokens] for tokens in dataset)

Assuming dataset is a generator as well, only one sequence is loaded into memory at a time.

Training

You can either use the high-level function to train a model (which also loads and returns it):

>>> import chaine
>>> chaine.train(tokens, labels)

or the lower-level Trainer class:

>>> from chaine import Trainer
>>> trainer = Trainer()

A Trainer object has a method train() to learn states and transitions from the given data set. You have to provide a filepath to serialize the model to:

>>> trainer.train(tokens, labels, model_filepath="model.chaine")

Hyperparameters

Before training a model, you might want to find out the ideal hyperparameters first. You can just set the respective argument to True:

>>> import chaine
>>> model = chaine.train(tokens, labels, optimize_hyperparameters=True)

This might be very memory and time consuming, because 5-fold cross validation for each of the 10 trials for each of the algorithms is performed.

or use the HyperparameterOptimizer class and have more control over the optimization process:

>>> from chaine import HyperparameterOptimizer
>>> from chaine.optimization import L2SGDSearchSpace
>>> optimizer = HyperparameterOptimizer(trials=50, folds=3, spaces=[L2SGDSearchSpace()])
>>> optimizer.optimize_hyperparameters(tokens, labels, sample_size=1000)

This will make 50 trials with 3-fold cross validation for the Stochastic Gradient Descent algorithm and return a sorted list of hyperparameters with evaluation stats. The given data set is downsampled to 1000 instances.

Example of a hyperparameter optimization report
[
    {
        "hyperparameters": {
            "algorithm": "lbfgs",
            "min_freq": 0,
            "all_possible_states": true,
            "all_possible_transitions": true,
            "num_memories": 8,
            "c1": 0.9,
            "c2": 0.31,
            "epsilon": 0.00011,
            "period": 17,
            "delta": 0.00051,
            "linesearch": "Backtracking",
            "max_linesearch": 31
        },
        "stats": {
            "mean_precision": 0.4490952380952381,
            "stdev_precision": 0.16497993418839532,
            "mean_recall": 0.4554858934169279,
            "stdev_recall": 0.20082402876210334,
            "mean_f1": 0.45041435392087253,
            "stdev_f1": 0.17914435056760908,
            "mean_time": 0.3920876979827881,
            "stdev_time": 0.0390961164333519
        }
    },
    {
        "hyperparameters": {
            "algorithm": "lbfgs",
            "min_freq": 5,
            "all_possible_states": true,
            "all_possible_transitions": false,
            "num_memories": 9,
            "c1": 1.74,
            "c2": 0.09,
            "epsilon": 0.0008600000000000001,
            "period": 1,
            "delta": 0.00045000000000000004,
            "linesearch": "StrongBacktracking",
            "max_linesearch": 34
        },
        "stats": {
            "mean_precision": 0.4344436335328176,
            "stdev_precision": 0.15542689556199216,
            "mean_recall": 0.4385174258109041,
            "stdev_recall": 0.19873733310765845,
            "mean_f1": 0.43386496201052716,
            "stdev_f1": 0.17225578421967264,
            "mean_time": 0.12209572792053222,
            "stdev_time": 0.0236177196325414
        }
    },
    {
        "hyperparameters": {
            "algorithm": "lbfgs",
            "min_freq": 2,
            "all_possible_states": true,
            "all_possible_transitions": true,
            "num_memories": 1,
            "c1": 0.91,
            "c2": 0.4,
            "epsilon": 0.0008400000000000001,
            "period": 13,
            "delta": 0.00018,
            "linesearch": "MoreThuente",
            "max_linesearch": 43
        },
        "stats": {
            "mean_precision": 0.41963433149859447,
            "stdev_precision": 0.16363544501259455,
            "mean_recall": 0.4331173486012196,
            "stdev_recall": 0.21344965207006913,
            "mean_f1": 0.422038027332145,
            "stdev_f1": 0.18245844823319127,
            "mean_time": 0.2586916446685791,
            "stdev_time": 0.04341208573100539
        }
    },
    {
        "hyperparameters": {
            "algorithm": "l2sgd",
            "min_freq": 5,
            "all_possible_states": true,
            "all_possible_transitions": true,
            "c2": 1.68,
            "period": 2,
            "delta": 0.00047000000000000004,
            "calibration_eta": 0.0006900000000000001,
            "calibration_rate": 2.9000000000000004,
            "calibration_samples": 1400,
            "calibration_candidates": 25,
            "calibration_max_trials": 23
        },
        "stats": {
            "mean_precision": 0.2571428571428571,
            "stdev_precision": 0.43330716823151716,
            "mean_recall": 0.01,
            "stdev_recall": 0.022360679774997897,
            "mean_f1": 0.01702127659574468,
            "stdev_f1": 0.038060731531911314,
            "mean_time": 0.15442829132080077,
            "stdev_time": 0.051750737506044905
        }
    }
]

Inference

The high-level function chaine.train() returns a Model object. You can load an already trained model from disk by initializing a Model object with the model's filepath:

>>> from chaine import Model
>>> model = Model("model.chaine")

You can predict labels for a batch of sequences:

>>> tokens = [
...     [{"index": 0, "text": "John"}, {"index": 1, "text": "Lennon"}],
...     [{"index": 0, "text": "Paul"}, {"index": 1, "text": "McCartney"}],
...     [{"index": 0, "text": "George"}, {"index": 1, "text": "Harrison"}],
...     [{"index": 0, "text": "Ringo"}, {"index": 1, "text": "Starr"}]
... ]
>>> model.predict(tokens)
[['B-PER', 'I-PER'], ['B-PER', 'I-PER'], ['B-PER', 'I-PER'], ['B-PER', 'I-PER']]

or only for a single sequence:

>>> model.predict_single(tokens[0])
['B-PER', 'I-PER']

If you are interested in the model's probability distribution for a given sequence, you can:

>>> model.predict_proba_single(tokens[0])
[[{'B-PER': 0.99, 'I-PER': 0.01}, {'B-PER': 0.01, 'I-PER': 0.99}]]

Use the model.predict_proba() method for a batch of sequences.

Weights

After loading a trained model, you can inspect the learned transition and state weights:

>>> model = Model("model.chaine")
>>> model.transitions
[{'from': 'B-PER', 'to': 'I-PER', 'weight': 1.430506540616852e-06}]
>>> model.states
[{'feature': 'text:John', 'label': 'B-PER', 'weight': 9.536710877105517e-07}, ...]

You can also dump both transition and state weights as JSON:

>>> model.dump_states("states.json")
>>> model.dump_transitions("transitions.json")

Credits

This project makes use of and is partially based on:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

chaine-3.12.1-cp312-cp312-win_amd64.whl (417.3 kB view details)

Uploaded CPython 3.12 Windows x86-64

chaine-3.12.1-cp312-cp312-win32.whl (395.9 kB view details)

Uploaded CPython 3.12 Windows x86

chaine-3.12.1-cp312-cp312-musllinux_1_1_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.1+ x86-64

chaine-3.12.1-cp312-cp312-musllinux_1_1_i686.whl (1.8 MB view details)

Uploaded CPython 3.12 musllinux: musl 1.1+ i686

chaine-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

chaine-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux_2_12_i686.manylinux2010_i686.manylinux2014_i686.whl (1.2 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

chaine-3.12.1-cp312-cp312-macosx_12_0_x86_64.whl (453.3 kB view details)

Uploaded CPython 3.12 macOS 12.0+ x86-64

chaine-3.12.1-cp311-cp311-win_amd64.whl (417.5 kB view details)

Uploaded CPython 3.11 Windows x86-64

chaine-3.12.1-cp311-cp311-win32.whl (395.8 kB view details)

Uploaded CPython 3.11 Windows x86

chaine-3.12.1-cp311-cp311-musllinux_1_1_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

chaine-3.12.1-cp311-cp311-musllinux_1_1_i686.whl (1.8 MB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

chaine-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

chaine-3.12.1-cp311-cp311-manylinux_2_17_i686.manylinux_2_12_i686.manylinux2010_i686.manylinux2014_i686.whl (1.2 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

chaine-3.12.1-cp311-cp311-macosx_12_0_x86_64.whl (453.5 kB view details)

Uploaded CPython 3.11 macOS 12.0+ x86-64

chaine-3.12.1-cp310-cp310-win_amd64.whl (417.7 kB view details)

Uploaded CPython 3.10 Windows x86-64

chaine-3.12.1-cp310-cp310-win32.whl (395.9 kB view details)

Uploaded CPython 3.10 Windows x86

chaine-3.12.1-cp310-cp310-musllinux_1_1_x86_64.whl (1.8 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

chaine-3.12.1-cp310-cp310-musllinux_1_1_i686.whl (1.8 MB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

chaine-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

chaine-3.12.1-cp310-cp310-manylinux_2_17_i686.manylinux_2_12_i686.manylinux2010_i686.manylinux2014_i686.whl (1.2 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ i686 manylinux: glibc 2.17+ i686

chaine-3.12.1-cp310-cp310-macosx_12_0_x86_64.whl (453.1 kB view details)

Uploaded CPython 3.10 macOS 12.0+ x86-64

File details

Details for the file chaine-3.12.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: chaine-3.12.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 417.3 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.11.5 Windows/10

File hashes

Hashes for chaine-3.12.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 077b81d1b9851be34157bff90af4f97b7a9e711e030d2c596c863a360255b160
MD5 4c9233642d00cbd424ad6bed4eecb27c
BLAKE2b-256 61413cd582b2ee02668a3dcbca49c3e9640a2bf9352676bcdfce8676fd39cbe2

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp312-cp312-win32.whl.

File metadata

  • Download URL: chaine-3.12.1-cp312-cp312-win32.whl
  • Upload date:
  • Size: 395.9 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.11.5 Windows/10

File hashes

Hashes for chaine-3.12.1-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 cdcaf554f3653ca574a20838aa6b94c68c1d6a99ee33cf56e54856864c32a204
MD5 499be9356a7b69a00bfa18ff71f04993
BLAKE2b-256 7c4f1f690e7607ea7bb51d178c1bde3a6477ab925f7713dbed0f978e7467a0bd

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp312-cp312-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 d05364965bd15dd1d83e7ccabc1213468f90ebb131bedfc75f32b20de1d4c127
MD5 f927a06774d7071b85e45344e68107ff
BLAKE2b-256 c4cfbfdf96843b2e2b31e07829e1530913bdd15b3909a7fea966f3cefe9f7bf7

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp312-cp312-musllinux_1_1_i686.whl.

File metadata

  • Download URL: chaine-3.12.1-cp312-cp312-musllinux_1_1_i686.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.12, musllinux: musl 1.1+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.11.5 Linux/6.2.0-1012-azure

File hashes

Hashes for chaine-3.12.1-cp312-cp312-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 7e004bb5558b25dc847952fe5349ef8e69eb002fa6f28a78c2b0d9f58ae2ec2a
MD5 41549e389c9d8cca45814ecdedceb471
BLAKE2b-256 2495e2adf190fa163681f958d084cfe443ebe3081e4f48f3fbc2b7f7fc090937

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2af050f5f717dfc9398b22dafe4d0f83bf40b9289b8adebfe8bbce5d822f54d8
MD5 3390a341c81dc125e3f0c29a25ac4a88
BLAKE2b-256 d9208a7eddf0a6343c000262054fa62a08e2151fc9bc14596ca97ac65510af89

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux_2_12_i686.manylinux2010_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux_2_12_i686.manylinux2010_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 65fa46cf0fe03d09602d190e62fbc92b261a7f8479ea13ff2d1541162c85f79e
MD5 5b6d19330bd0605f407d25f01ec40f87
BLAKE2b-256 637f5665d5437620ec4a27d38f53474aa8c9fc86e77c6814237431d26cff7b66

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp312-cp312-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp312-cp312-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 32cc9aedde7f929c763be936030c2ea1524224f4a86b38b11002b078f6991837
MD5 b755b03de86fa0d4f9341f76d8d3147b
BLAKE2b-256 17758020bd868ff98d2e505f1e8648cfa16d85823ba26ff858acd3e109f53919

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: chaine-3.12.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 417.5 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.11.5 Windows/10

File hashes

Hashes for chaine-3.12.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 142a30e017173f1d084252dcf5d0785e9618e4b24b130339d06f96a50cef302b
MD5 c172459279914e47c1560c5389ce6607
BLAKE2b-256 0810767a21fbb82c02c746140c1ff812853e86d056c58b1ab27d14726254c06f

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp311-cp311-win32.whl.

File metadata

  • Download URL: chaine-3.12.1-cp311-cp311-win32.whl
  • Upload date:
  • Size: 395.8 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.11.5 Windows/10

File hashes

Hashes for chaine-3.12.1-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 5822e09fd2bae9334f0e931ef6901e65ffdee98ce3c7edc0588fb5a6455693e7
MD5 bd9af73a677771f95a1f2ad90465fe41
BLAKE2b-256 bb62307c6c78b179e0484aecef5ad390d613e2741f0b4f130a0861483d789211

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 074b960e1e14b41b43d8ce612293ecc94c472182816c5d51cb0dd705b800110f
MD5 0e0199c4fbb392e26f72bd1bd9dfcc42
BLAKE2b-256 e68cb0a9f91c9ac81165d1c771ab10160ba686de6100ea553ffad3a8100a278b

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp311-cp311-musllinux_1_1_i686.whl.

File metadata

  • Download URL: chaine-3.12.1-cp311-cp311-musllinux_1_1_i686.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.11, musllinux: musl 1.1+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.11.5 Linux/6.2.0-1012-azure

File hashes

Hashes for chaine-3.12.1-cp311-cp311-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 058c67e0f32487b49b513c61535412082f4047e7770f99bf8714b772a782e743
MD5 7ac13d49e56c3e9a7531ec19875ada0d
BLAKE2b-256 c877aa5bc29acff65ad25747c0348b89a36536f0c23f74c35cc3c59faab8bfdb

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9446231237f80ec782723a1b8a1fdceae9b5d9461d0bcc2d1c9fcd55989e9241
MD5 6e377c75f4a261336d9379a0ed28cea8
BLAKE2b-256 5b0103d7879a56cc5a1c5be48a42c9439706364e7ed60a23fcc80ba0c6119ece

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp311-cp311-manylinux_2_17_i686.manylinux_2_12_i686.manylinux2010_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp311-cp311-manylinux_2_17_i686.manylinux_2_12_i686.manylinux2010_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2abde827c63954343ecd0c8900fd8be667f20028a2eb754ffa3ce76ea1a8de8b
MD5 4513c17aa81f568ae57ca53add354e56
BLAKE2b-256 a87e2aa28f13a0160bde0110576871fb789c93c75f1a705c6f6f0430d47d08ed

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp311-cp311-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp311-cp311-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 ed2447aae784a990a411ada80652b237c9b2ecaa36502aae27d4442a5bcef430
MD5 0cdcae2e54697c31af058ccc4e61330d
BLAKE2b-256 14e00fe7d23a5f2187320ef9090764b557093786dc0076a66ed0b8cadd84784b

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: chaine-3.12.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 417.7 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.11.5 Windows/10

File hashes

Hashes for chaine-3.12.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 227cf1f8cf65477d8444c4c1a1b3d8b1cacd4a7af6bfc26e4b155d5bb1d369a9
MD5 bf38500aab7b31d089e5c583588b61a1
BLAKE2b-256 3177d59c37e87937923a9b59ff472588a8d3ad9c2cd23cdc80d623bba2bac45d

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp310-cp310-win32.whl.

File metadata

  • Download URL: chaine-3.12.1-cp310-cp310-win32.whl
  • Upload date:
  • Size: 395.9 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.11.5 Windows/10

File hashes

Hashes for chaine-3.12.1-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 f81f794382b2f0616fcfe66981331fb3e0aeb015de97a7736dc6491bdb6ead56
MD5 00cf7f852eb3573a8090728cb237ae58
BLAKE2b-256 7346d471845de765a02d958ec49cc0a02b7fe5447b7bc1ba6bab03e52b4e7ca8

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 18f27fed73ddc77ccb84b64af79b0f13f95491efb27b52856e1fb24a39a4d24c
MD5 8394e1d5784e014faa61adb2e6acf464
BLAKE2b-256 5038765f6bff8dfe3cc66cd07739eb118156d912441f1792d9360fbf5004cabe

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp310-cp310-musllinux_1_1_i686.whl.

File metadata

  • Download URL: chaine-3.12.1-cp310-cp310-musllinux_1_1_i686.whl
  • Upload date:
  • Size: 1.8 MB
  • Tags: CPython 3.10, musllinux: musl 1.1+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.11.5 Linux/6.2.0-1012-azure

File hashes

Hashes for chaine-3.12.1-cp310-cp310-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 05e750eb9634db051d5159bcbc6dbb7f6bedbbece1f349c23c6bdd290bfd4695
MD5 2c9a0cc401132cb68d053d0183e161e8
BLAKE2b-256 3f7b4b9afee1fa4c96677640a3e2550c25cdc756be53e7e9576f201d61661315

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2da2b704bcf1dbe3dcbb2abdfeba78c70f50c7b806d0cc088a30d626e4af44fb
MD5 7715ca731744851532ad1cdd81f266a3
BLAKE2b-256 547d55a6724da126f6b978b644846eabf29160e2da1b16e3b419e7176570eecb

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp310-cp310-manylinux_2_17_i686.manylinux_2_12_i686.manylinux2010_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp310-cp310-manylinux_2_17_i686.manylinux_2_12_i686.manylinux2010_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7cb35360f300e7054b9ca7066d0d248c3f288ba83e834095745cc04ac049aa4e
MD5 92df4b1f4b9c4ad869c9513c694159f6
BLAKE2b-256 092fc93c5f837d74fccb3c9bdc17a2a3359f9df3633a456d052584d63478bef6

See more details on using hashes here.

File details

Details for the file chaine-3.12.1-cp310-cp310-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for chaine-3.12.1-cp310-cp310-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 07b0bfed6ef0300bf765bb6eb46224ca60f7187835a45d6f7045c4dae99cd613
MD5 4393875ec810cd58c50c0c82a88fcec2
BLAKE2b-256 378b237c2ba9fe26dc4e912b0e3ceaad9612fdaf70401b8f4c165e26948600a5

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page