Skip to main content

High-performance TextRank implementation with Python bindings

Project description

rapid_textrank

License: MIT Python 3.9+ Rust

High-performance TextRank implementation in Rust with Python bindings.

Extract keywords and key phrases from text up to 10-100x faster than pure Python implementations (depending on document size and tokenization), with support for multiple algorithm variants and 18 languages.

Features

  • Fast: Up to 10-100x faster than pure Python implementations (see benchmarks)
  • Multiple algorithms: TextRank, PositionRank, BiasedTextRank, and TopicRank variants
  • Unicode-aware: Proper handling of CJK and other scripts (emoji are ignored by the built-in tokenizer)
  • Multi-language: Stopword support for 18 languages
  • Dual API: Native Python classes + JSON interface for batch processing
  • Rust core: Computation happens in Rust (the Python GIL is currently held during extraction)

Quick Start

pip install rapid_textrank
from rapid_textrank import extract_keywords

text = """
Machine learning is a subset of artificial intelligence that enables
systems to learn and improve from experience. Deep learning, a type of
machine learning, uses neural networks with many layers.
"""

keywords = extract_keywords(text, top_n=5, language="en")
for phrase in keywords:
    print(f"{phrase.text}: {phrase.score:.4f}")

Output:

machine learning: 0.2341
deep learning: 0.1872
artificial intelligence: 0.1654
neural networks: 0.1432
systems: 0.0891

How TextRank Works

TextRank is a graph-based ranking algorithm for keyword extraction, inspired by Google's PageRank.

The Algorithm

  1. Build a co-occurrence graph: Words become nodes. An edge connects two words if they appear within a sliding window (default: 4 words).

  2. Run PageRank: The algorithm iteratively distributes "importance" through the graph. Words connected to many important words become important themselves.

  3. Extract phrases: High-scoring words are grouped into noun chunks (POS-filtered) to form key phrases. Scores are aggregated (sum, mean, or max).

Text: "Machine learning enables systems to learn from data"

Co-occurrence graph (window=2):
    machine ←→ learning ←→ enables ←→ systems ←→ learn ←→ data
                              ↓
                            PageRank
                              ↓
    Scores: machine(0.23) learning(0.31) enables(0.12) ...
                              ↓
                        Phrase extraction
                              ↓
    "machine learning" (0.54), "systems" (0.18), ...

Further Reading

Algorithm Variants

Variant Best For Description
BaseTextRank General text Standard TextRank implementation
PositionRank Academic papers, news Favors words appearing early in the document
BiasedTextRank Topic-focused extraction Biases results toward specified focus terms
TopicRank Multi-topic documents Clusters similar phrases into topics and ranks the topics

PositionRank

Weights words by their position—earlier appearances score higher. Useful for documents where key information appears in titles, abstracts, or opening paragraphs.

from rapid_textrank import PositionRank

extractor = PositionRank(top_n=10)
result = extractor.extract_keywords("""
Quantum Computing Advances in 2024

Researchers have made significant breakthroughs in quantum error correction.
The quantum computing field continues to evolve rapidly...
""")

# "quantum computing" and "quantum" will rank higher due to early position

BiasedTextRank

Steers extraction toward specific topics using focus terms. The bias_weight parameter controls how strongly results favor the focus terms.

from rapid_textrank import BiasedTextRank

extractor = BiasedTextRank(
    focus_terms=["security", "privacy"],
    bias_weight=5.0,  # Higher = stronger bias
    top_n=10
)

result = extractor.extract_keywords("""
Modern web applications must balance user experience with security.
Privacy regulations require careful data handling. Performance
optimizations should not compromise security measures.
""")

# Results will favor security/privacy-related phrases

TopicRank

TopicRank clusters similar candidate phrases into topics, then ranks the topics. It is exposed via the JSON interface (useful for spaCy-tokenized input).

import json
import spacy
from rapid_textrank import extract_from_json

nlp = spacy.load("en_core_web_sm")
doc = nlp(text)

tokens = []
for sent_idx, sent in enumerate(doc.sents):
    for token in sent:
        tokens.append({
            "text": token.text,
            "lemma": token.lemma_,
            "pos": token.pos_,
            "start": token.idx,
            "end": token.idx + len(token.text),
            "sentence_idx": sent_idx,
            "token_idx": token.i,
            "is_stopword": token.is_stop,
        })

payload = {
    "tokens": tokens,
    "variant": "topic_rank",
    "config": {
        "top_n": 10,
        "language": "en",
        "topic_similarity_threshold": 0.25,
        "topic_edge_weight": 1.0,
    },
}

result = json.loads(extract_from_json(json.dumps(payload)))
for phrase in result["phrases"][:10]:
    print(phrase["text"], phrase["score"])

API Reference

Convenience Function

The simplest way to extract keywords:

from rapid_textrank import extract_keywords

phrases = extract_keywords(
    text,           # Input text
    top_n=10,       # Number of keywords to return
    language="en"   # Language for stopword filtering
)

Class-Based API

For more control, use the extractor classes:

from rapid_textrank import BaseTextRank, PositionRank, BiasedTextRank

# Standard TextRank
extractor = BaseTextRank(top_n=10, language="en")
result = extractor.extract_keywords(text)

# Position-weighted
extractor = PositionRank(top_n=10, language="en")
result = extractor.extract_keywords(text)

# Topic-biased
extractor = BiasedTextRank(
    focus_terms=["machine", "learning"],
    bias_weight=5.0,
    top_n=10,
    language="en"
)
result = extractor.extract_keywords(text)

# You can also pass focus_terms per-call
result = extractor.extract_keywords(text, focus_terms=["neural", "network"])

TopicRank is available via the JSON interface using variant="topic_rank" (see below).

Configuration

Fine-tune the algorithm with TextRankConfig:

from rapid_textrank import TextRankConfig, BaseTextRank

config = TextRankConfig(
    damping=0.85,              # PageRank damping factor (0-1)
    max_iterations=100,        # Maximum PageRank iterations
    convergence_threshold=1e-6,# Convergence threshold
    window_size=3,             # Co-occurrence window size
    top_n=10,                  # Number of results
    min_phrase_length=1,       # Minimum words in a phrase
    max_phrase_length=4,       # Maximum words in a phrase
    score_aggregation="sum",   # How to combine word scores: "sum", "mean", "max", "rms"
    language="en",             # Language for stopwords
    include_pos=["NOUN","ADJ","PROPN","VERB"],  # POS tags to include in the graph
    use_pos_in_nodes=True,     # If True, graph nodes are lemma+POS
    phrase_grouping="scrubbed_text",   # "lemma" or "scrubbed_text"
    stopwords=["custom", "terms"]  # Additional stopwords (extends built-in list)
)

extractor = BaseTextRank(config=config)

Result Objects

result = extractor.extract_keywords(text)

# TextRankResult attributes
result.phrases      # List of Phrase objects
result.converged    # Whether PageRank converged
result.iterations   # Number of iterations run

# Phrase attributes
for phrase in result.phrases:
    phrase.text     # The phrase text (e.g., "machine learning")
    phrase.lemma    # Lemmatized form
    phrase.score    # TextRank score
    phrase.count    # Occurrences in text
    phrase.rank     # 1-indexed rank

# Convenience method
tuples = result.as_tuples()  # [(text, score), ...]

JSON Interface

For processing large documents or integrating with spaCy, use the JSON interface. This accepts pre-tokenized data to avoid re-tokenizing in Rust. Stopword handling can use each token's is_stopword field and/or a config.language plus config.stopwords (additional words that extend the built-in list). Language codes follow the Supported Languages table below.

from rapid_textrank import extract_from_json, extract_batch_from_json
import json

# Single document
doc = {
    "tokens": [
        {
            "text": "Machine",
            "lemma": "machine",
            "pos": "NOUN",
            "start": 0,
            "end": 7,
            "sentence_idx": 0,
            "token_idx": 0,
            "is_stopword": False
        },
        # ... more tokens
    ],
    "variant": "textrank",
    "config": {
        "top_n": 10,
        "language": "en",
        "stopwords": ["nlp", "transformers"]
    }
}

result_json = extract_from_json(json.dumps(doc))
result = json.loads(result_json)

# Batch processing (Rust core; per-document processing is sequential)
docs = [doc1, doc2, doc3]
results_json = extract_batch_from_json(json.dumps(docs))
results = json.loads(results_json)

variant can be "textrank" (default), "position_rank", "biased_textrank", or "topic_rank". For "biased_textrank", set focus_terms and bias_weight in the JSON config. For "topic_rank", set topic_similarity_threshold and topic_edge_weight in the JSON config.

Supported Languages

Stopword filtering is available for 18 languages. Use these codes for the language parameter in all APIs (including JSON config):

Code Language Code Language Code Language
en English de German fr French
es Spanish it Italian pt Portuguese
nl Dutch ru Russian sv Swedish
no Norwegian da Danish fi Finnish
hu Hungarian tr Turkish pl Polish
ar Arabic zh Chinese ja Japanese

You can inspect the built-in stopword list with:

import rapid_textrank as rt
rt.get_stopwords("en")

Performance

rapid_textrank achieves significant speedups through Rust's performance characteristics and careful algorithm implementation.

Benchmark Script

Run this script to compare performance on your hardware:

"""
Benchmark: rapid_textrank vs pytextrank

Prerequisites:
    pip install rapid_textrank pytextrank spacy
    python -m spacy download en_core_web_sm
"""

import time
import statistics

# Sample texts of varying sizes
TEXTS = {
    "small": """
        Machine learning is a subset of artificial intelligence.
        Deep learning uses neural networks with many layers.
    """,

    "medium": """
        Natural language processing (NLP) is a field of artificial intelligence
        that focuses on the interaction between computers and humans through
        natural language. The ultimate goal of NLP is to enable computers to
        understand, interpret, and generate human language in a valuable way.

        Machine learning approaches have transformed NLP in recent years.
        Deep learning models, particularly transformers, have achieved
        state-of-the-art results on many NLP tasks including translation,
        summarization, and question answering.

        Key applications include sentiment analysis, named entity recognition,
        machine translation, and text classification. These technologies
        power virtual assistants, search engines, and content recommendation
        systems used by millions of people daily.
    """,

    "large": """
        Artificial intelligence has evolved dramatically since its inception in
        the mid-20th century. Early AI systems relied on symbolic reasoning and
        expert systems, where human knowledge was manually encoded into rules.

        The machine learning revolution changed everything. Instead of explicit
        programming, systems learn patterns from data. Supervised learning uses
        labeled examples, unsupervised learning finds hidden structures, and
        reinforcement learning optimizes through trial and error.

        Deep learning, powered by neural networks with multiple layers, has
        achieved remarkable success. Convolutional neural networks excel at
        image recognition. Recurrent neural networks and transformers handle
        sequential data like text and speech. Generative adversarial networks
        create realistic synthetic content.

        Natural language processing has been transformed by these advances.
        Word embeddings capture semantic relationships. Attention mechanisms
        allow models to focus on relevant context. Large language models
        demonstrate emergent capabilities in reasoning and generation.

        Computer vision applications include object detection, facial recognition,
        medical image analysis, and autonomous vehicle perception. These systems
        process visual information with superhuman accuracy in many domains.

        The ethical implications of AI are significant. Bias in training data
        can lead to unfair outcomes. Privacy concerns arise from data collection.
        Job displacement affects workers across industries. Regulation and
        governance frameworks are being developed worldwide.

        Future directions include neuromorphic computing, quantum machine learning,
        and artificial general intelligence. Researchers continue to push
        boundaries while addressing safety and alignment challenges.
    """ * 3  # ~1000 words
}


def benchmark_rapid_textrank(text: str, runs: int = 10) -> dict:
    """Benchmark rapid_textrank."""
    from rapid_textrank import BaseTextRank

    extractor = BaseTextRank(top_n=10, language="en")

    # Warmup
    extractor.extract_keywords(text)

    times = []
    for _ in range(runs):
        start = time.perf_counter()
        result = extractor.extract_keywords(text)
        elapsed = time.perf_counter() - start
        times.append(elapsed * 1000)  # Convert to ms

    return {
        "min": min(times),
        "mean": statistics.mean(times),
        "median": statistics.median(times),
        "std": statistics.stdev(times) if len(times) > 1 else 0,
        "phrases": len(result.phrases)
    }


def benchmark_pytextrank(text: str, runs: int = 10) -> dict:
    """Benchmark pytextrank with spaCy."""
    import spacy
    import pytextrank

    nlp = spacy.load("en_core_web_sm")
    nlp.add_pipe("textrank")

    # Warmup
    doc = nlp(text)

    times = []
    for _ in range(runs):
        start = time.perf_counter()
        doc = nlp(text)
        phrases = list(doc._.phrases[:10])
        elapsed = time.perf_counter() - start
        times.append(elapsed * 1000)

    return {
        "min": min(times),
        "mean": statistics.mean(times),
        "median": statistics.median(times),
        "std": statistics.stdev(times) if len(times) > 1 else 0,
        "phrases": len(phrases)
    }


def main():
    print("=" * 70)
    print("TextRank Performance Benchmark")
    print("=" * 70)

    for size, text in TEXTS.items():
        word_count = len(text.split())
        print(f"\n{size.upper()} TEXT (~{word_count} words)")
        print("-" * 50)

        # Benchmark rapid_textrank
        rust_results = benchmark_rapid_textrank(text)
        print(f"rapid_textrank:  {rust_results['mean']:>8.2f} ms (±{rust_results['std']:.2f})")

        # Benchmark pytextrank
        try:
            py_results = benchmark_pytextrank(text)
            print(f"pytextrank:     {py_results['mean']:>8.2f} ms (±{py_results['std']:.2f})")

            speedup = py_results['mean'] / rust_results['mean']
            print(f"Speedup:        {speedup:>8.1f}x faster")
        except Exception as e:
            print(f"pytextrank:     (not available: {e})")

    print("\n" + "=" * 70)
    print("Note: pytextrank times include spaCy tokenization.")
    print("For fair comparison with pre-tokenized input, use rapid_textrank's JSON API.")
    print("=" * 70)


if __name__ == "__main__":
    main()

Why Rust is Fast

The performance advantage comes from several factors:

  1. CSR Graph Format: The co-occurrence graph uses Compressed Sparse Row format, enabling cache-friendly memory access during PageRank iteration.

  2. String Interning: Repeated words share a single allocation via StringPool, reducing memory usage 10-100x for typical documents.

  3. Parallel Processing: Rayon provides data parallelism in internal graph construction without explicit thread management.

  4. Link-Time Optimization (LTO): Release builds use full LTO with single codegen unit for maximum inlining.

  5. Rust core: Most computation happens in Rust, minimizing Python-level overhead.

  6. FxHash: Fast non-cryptographic hashing for internal hash maps.

Installation

From PyPI

pip install rapid_textrank

Import name is rapid_textrank.

With spaCy Support

pip install rapid_textrank[spacy]
import spacy
import rapid_textrank.spacy_component  # registers the pipeline factory

nlp = spacy.load("en_core_web_sm")
nlp.add_pipe("rapid_textrank")

doc = nlp("Machine learning is a subset of artificial intelligence.")
for phrase in doc._.phrases[:5]:
    print(f"{phrase.text}: {phrase.score:.4f}")

From Source

Requirements: Rust 1.70+, Python 3.9+

git clone https://github.com/xang1234/rapid-textrank
cd rapid_textrank
pip install maturin
maturin develop --release

Development Setup

# Install with dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run Rust tests
cargo test

Publishing

Publishing is automated with GitHub Actions using Trusted Publishing (OIDC), so no API tokens are stored.

TestPyPI release (push a tag):

git tag -a test-0.1.0 -m "TestPyPI 0.1.0"
git push origin test-0.1.0

Tag pattern: test-*

PyPI release (push a tag):

git tag -a v0.1.0 -m "Release 0.1.0"
git push origin v0.1.0

Tag pattern: v*

Wheel builds

GitHub Actions builds wheels for Python 3.9–3.12 on Linux, macOS, and Windows.

Before the first publish, add Trusted Publishers on TestPyPI and PyPI:

  • Repo: xang1234/textranker
  • Workflows: .github/workflows/publish-testpypi.yml and .github/workflows/publish-pypi.yml
  • Environments: testpypi and pypi

You can also trigger either workflow manually via GitHub Actions if needed.

License

MIT License - see LICENSE for details.

Citation

If you use rapid_textrank in research, please cite the original TextRank paper:

@inproceedings{mihalcea-tarau-2004-textrank,
    title = "{T}ext{R}ank: Bringing Order into Text",
    author = "Mihalcea, Rada and Tarau, Paul",
    booktitle = "Proceedings of EMNLP 2004",
    year = "2004",
    publisher = "Association for Computational Linguistics",
}

For PositionRank:

@inproceedings{florescu-caragea-2017-positionrank,
    title = "{P}osition{R}ank: An Unsupervised Approach to Keyphrase Extraction from Scholarly Documents",
    author = "Florescu, Corina and Caragea, Cornelia",
    booktitle = "Proceedings of ACL 2017",
    year = "2017",
}

For TopicRank:

@inproceedings{bougouin-boudin-daille-2013-topicrank,
    title = "{T}opic{R}ank: Graph-Based Topic Ranking for Keyphrase Extraction",
    author = "Bougouin, Adrien and Boudin, Florian and Daille, B{\\'e}atrice",
    booktitle = "Proceedings of the Sixth International Joint Conference on Natural Language Processing",
    year = "2013",
    pages = "543--551",
    publisher = "Asian Federation of Natural Language Processing",
}

Project details


Download files

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

Source Distribution

rapid_textrank-0.1.2.tar.gz (218.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rapid_textrank-0.1.2-cp312-cp312-win_amd64.whl (436.6 kB view details)

Uploaded CPython 3.12Windows x86-64

rapid_textrank-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (558.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

rapid_textrank-0.1.2-cp312-cp312-macosx_11_0_arm64.whl (519.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

rapid_textrank-0.1.2-cp311-cp311-win_amd64.whl (435.8 kB view details)

Uploaded CPython 3.11Windows x86-64

rapid_textrank-0.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (559.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

rapid_textrank-0.1.2-cp311-cp311-macosx_11_0_arm64.whl (519.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

rapid_textrank-0.1.2-cp310-cp310-win_amd64.whl (435.9 kB view details)

Uploaded CPython 3.10Windows x86-64

rapid_textrank-0.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (559.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

rapid_textrank-0.1.2-cp310-cp310-macosx_11_0_arm64.whl (519.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

rapid_textrank-0.1.2-cp39-cp39-win_amd64.whl (436.2 kB view details)

Uploaded CPython 3.9Windows x86-64

rapid_textrank-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (560.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

rapid_textrank-0.1.2-cp39-cp39-macosx_11_0_arm64.whl (519.8 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file rapid_textrank-0.1.2.tar.gz.

File metadata

  • Download URL: rapid_textrank-0.1.2.tar.gz
  • Upload date:
  • Size: 218.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rapid_textrank-0.1.2.tar.gz
Algorithm Hash digest
SHA256 99bc6dd91465da8765f94b270560357b41a590f996d4a445d56b563ab7e999f5
MD5 10db287b153ba405e5c0dcae5f085c8c
BLAKE2b-256 9a0d2146710508286489801223b0e1cb0fd97f7af83ccf6b2993f1da6df7118c

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2.tar.gz:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b52cc673c8275a49d6f9b5a6afba72d01f277c6567e312f35dbbd3e582a9c798
MD5 c87471a530a578a43a9ceef3ef028385
BLAKE2b-256 bb757ff82fa2ac31aa2299164782dcb8a9c92a005fca5490ff309832cc756210

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp312-cp312-win_amd64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1479e3cd5d0b6a7a86a5c46d37d2ed4cf3e47819d0cfba346af9f6abd4e97932
MD5 cddf2556cc5ed1db12f6d5d0c5cc0b06
BLAKE2b-256 bfd2e70ad4eafd49f325d2d5fc03edfe5982b412cb5fd4bd534a3922ba25b20f

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ce969a3103666ab29c90225f0828ccc3c2247200b2e6645d7e80985df25fc393
MD5 74f9f37e7ce28feee306b513e34ba7aa
BLAKE2b-256 ae2d0db9b7409319e21010dcf5ce298a235a08a652a87f8c73ca15ced784d358

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 99ea1269f3ce7f676226816cff82fce16a1086f14ad70772544b121b8d2494e8
MD5 ee3ef0b3cfa90549b5f10f5d8d6ad5c1
BLAKE2b-256 8367f4844a4f20a4c288777c5d855758f22a597f935d447fe28e950ca6c20ed4

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp311-cp311-win_amd64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 30f44f56b7ecf1f6770c36cc76b2168419abde7b62ea9e68f1caf0b7b77d5032
MD5 2cbc82f9df06cff9ff7b3ff6ca5f1743
BLAKE2b-256 2f25f8ecac8545f614a0cf1007a92d5b9411bd07c24fa57bd95e16bf5bd840a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0d49b2cbd22bb73ef114c0a9e7d6bd1ae5a72a2c4b87494d280fd84577e7cc6c
MD5 bdb7851021832b5f7aec319914026cbb
BLAKE2b-256 05b83fd77d52c792131bc744d1614471bc6e57d67ac1e1d384ee5955e8fd6a61

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 e5e1d56b62b2f5b3cf85799c4fd7eb46c69c13ad5becb6c7d852d75e19cf92df
MD5 e83995500e5025f091ac2b3e9c92c765
BLAKE2b-256 d34f3f40f2a1bbf8c9138307e3168ea057f0627af979f61c3a8c7ddb97c9c30a

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp310-cp310-win_amd64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 57d71282e4532359fa4daabfb049dd911e3e1a688c4bff94fac5210e8351d5d0
MD5 a69b8b9c521005396ac4480b886d9f8e
BLAKE2b-256 e689fd0966d8ac0ab819d03666e052daf543d2c167df97c0f53ad505ebbf66ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2f19db59282b485fd7126b19c4c2562583fa9233f2d58bbf757ebd3b1b02a7e7
MD5 1d1337a01472e5c4475f3d92411a42e3
BLAKE2b-256 3070647b0e6aa10ccb32c449ca7f71f8612a2073c730869bdf4d9fe9cbc009f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 e80893df2aeaeb44fc72cdc730d6dcb165e57dd500c119189bbf1bf3a33f2aa1
MD5 f7a909e4abfd53757c261aa4ae28dd17
BLAKE2b-256 ff3f63de508bc14154b566285bce7a8870a97448b14ac2d13ab09a7f5efb1385

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp39-cp39-win_amd64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4951b85a1d029e81ce2a4cc4258817adbe9bbcd5bded054cb94751b85fcf0d40
MD5 235b06b9062e2c729f2d94d6ee1b7fb7
BLAKE2b-256 0c165ad3b273543ea5a0d9ecb12829863f19fb879180ff67eb72c4c9d3ce6270

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rapid_textrank-0.1.2-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rapid_textrank-0.1.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 be3ff8c3aa6b45e742b206a5e1315a15fa43d6561a1538afc0d4944f467ad095
MD5 1735d1142f8c51df2414e48731ddf49d
BLAKE2b-256 e37f4d0adac001bdd0669e961e804a104d76b20cdf57e9eed3afa6f9b3c5247c

See more details on using hashes here.

Provenance

The following attestation bundles were made for rapid_textrank-0.1.2-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: publish-pypi.yml on xang1234/rapid-textrank

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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