from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction reference = [["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]] The "Hypothesis" (What your OCR/LLM extracted from the PDF) hypothesis = ["The", "quick", "brown", "fox", "jumps", "over", "the", "dog"] Apply smoothing to handle missing n-grams smoother = SmoothingFunction().method1 Calculate BLEU (using 1-gram to 4-grams) score = sentence_bleu(reference, hypothesis, smoothing_function=smoother) print(f"BLEU Score: {score:.2f}") # Output: ~0.82
Your OCR software extracted: "The quick brown fox jumps over the dog."
While BLEU was originally designed for machine translation, it has become the de facto standard for evaluating any text generated from PDFs against a "ground truth" (perfect human-generated text). bleu pdf
"The closer a machine's generated text is to a professional human's text, the better it is."
The machine missed the word "lazy." Unigrams matched perfectly, but the 4-gram ("over the lazy dog") failed. The brevity penalty was not applied because the lengths were similar. Part 5: The Dirty Secret – BLEU is Flawed (But Useful) Before you implement BLEU on your PDF pipeline, understand its limitations: from nltk
Here is how you calculate the BLEU score using Python's nltk library:
Whether you are running Optical Character Recognition (OCR) on a scanned historical document, using a Large Language Model (LLM) to summarize a contract, or translating a French PDF into English, you need a ruler to measure success. Enter (Bilingual Evaluation Understudy). Part 5: The Dirty Secret – BLEU is
Have you used BLEU to evaluate your PDF data pipeline? Share your scores and horror stories in the comments below Need to calculate BLEU for your PDFs? Check out nltk for Python or evaluate by Hugging Face.