{
  "source_file": "0930",
  "source_platform": "技术平台",
  "author": "Jason Brownlee / Machine Learning Mastery",
  "title_listed": "A Gentle Introduction to the Bag-of-Words Model",
  "keywords": "词袋模型,NLP,文本",
  "domain": "文本处理",
  "content_type": "教程",
  "is_paid_flag": "否",
  "url": "https://machinelearningmastery.com/gentle-introduction-bag-words-model/",
  "publish_date": "2019-08",
  "corpus_stage": "预训练/SFT",
  "notes": "词袋模型入门",
  "id": "afe39ae2071b",
  "collected_at": "2026-10-02T17:54:53",
  "title": "A Gentle Introduction to the Bag-of-Words Model - MachineLearningMastery.com",
  "body_markdown": "A Gentle Introduction to the Bag-of-Words Model\nBy\nJason Brownlee\non\nAugust 7, 2019\nin\nDeep Learning for Natural Language Processing\n125\nShare\nPost\nShare\nThe bag-of-words model is a way of representing text data when modeling text with machine learning algorithms.\nThe bag-of-words model is simple to understand and implement and has seen great success in problems such as language modeling and document classification.\nIn this tutorial, you will discover the bag-of-words model for feature extraction in\nnatural language processing\n.\nAfter completing this tutorial, you will know:\nWhat the bag-of-words model is and why it is needed to represent text.\nHow to develop a bag-of-words model for a collection of documents.\nHow to use different techniques to prepare a vocabulary and score words.\nKick-start your project\nwith my new book\nDeep Learning for Natural Language Processing\n, including\nstep-by-step tutorials\nand the\nPython source code\nfiles for all examples.\nLet’s get started.\nA Gentle Introduction to the Bag-of-Words Model\nPhoto by\nDo8y\n, some rights reserved.\nTutorial Overview\nThis tutorial is divided into 6 parts; they are:\nThe Problem with Text\nWhat is a Bag-of-Words?\nExample of the Bag-of-Words Model\nManaging Vocabulary\nScoring Words\nLimitations of Bag-of-Words\nNeed help with Deep Learning for Text Data?\nTake my free 7-day email crash course now (with code).\nClick to sign-up and also get a free PDF Ebook version of the course.\nStart Your FREE Crash-Course Now\nThe Problem with Text\nA problem with modeling text is that it is messy, and techniques like machine learning algorithms prefer well defined fixed-length inputs and outputs.\nMachine learning algorithms cannot work with raw text directly; the text must be converted into numbers. Specifically, vectors of numbers.\nIn language processing, the vectors x are derived from textual data, in order to reflect various linguistic properties of the text.\n— Page 65,\nNeural Network Methods in Natural Language Processing\n, 2017.\nThis is called feature extraction or feature encoding.\nA popular and simple method of feature extraction with text data is called the bag-of-words model of text.\nWhat is a Bag-of-Words?\nA bag-of-words model, or BoW for short, is a way of extracting features from text for use in modeling, such as with machine learning algorithms.\nThe approach is very simple and flexible, and can be used in a myriad of ways for extracting features from documents.\nA bag-of-words is a representation of text that describes the occurrence of words within a document. It involves two things:\nA vocabulary of known words.\nA measure of the presence of known words.\nIt is called a “\nbag\n” of words, because any information about the order or structure of words in the document is discarded. The model is only concerned with whether known words occur in the document, not where in the document.\nA very common feature extraction procedures for sentences and documents is the bag-of-words approach (BOW). In this approach, we look at the histogram of the words within the text, i.e. considering each word count as a feature.\n— Page 69,\nNeural Network Methods in Natural Language Processing\n, 2017.\nThe intuition is that documents are similar if they have similar content. Further, that from the content alone we can learn something about the meaning of the document.\nThe bag-of-words can be as simple or complex as you like. The complexity comes both in deciding how to design the vocabulary of known words (or tokens) and how to score the presence of known words.\nWe will take a closer look at both of these concerns.\nExample of the Bag-of-Words Model\nLet’s make the bag-of-words model concrete with a worked example.\nStep 1: Collect Data\nBelow is a snippet of the first few lines of text from the book “\nA Tale of Two Cities\n” by Charles Dickens, taken from Project Gutenberg.\nIt was the best of times,\nit was the worst of times,\nit was the age of wisdom,\nit was the age of foolishness,\nFor this small example, let’s treat each line as a separate “document” and the 4 lines as our entire corpus of documents.\nStep 2: Design the Vocabulary\nNow we can make a list of all of the words in our model vocabulary.\nThe unique words here (ignoring case and punctuation) are:\n“it”\n“was”\n“the”\n“best”\n“of”\n“times”\n“worst”\n“age”\n“wisdom”\n“foolishness”\nThat is a vocabulary of 10 words from a corpus containing 24 words.\nStep 3: Create Document Vectors\nThe next step is to score the words in each document.\nThe objective is to turn each document of free text into a vector that we can use as input or output for a machine learning model.\nBecause we know the vocabulary has 10 words, we can use a fixed-length document representation of 10, with one position in the vector to score each word.\nThe simplest scoring method is to mark the presence of words as a boolean value, 0 for absent, 1 for present.\nUsing the arbitrary ordering of words listed above in our vocabulary, we can step through the first document (“\nIt was the best of times\n“) and convert it into a binary vector.\nThe scoring of the document would look as follows:\n“it” = 1\n“was” = 1\n“the” = 1\n“best” = 1\n“of” = 1\n“times” = 1\n“worst” = 0\n“age” = 0\n“wisdom” = 0\n“foolishness” = 0\nAs a binary vector, this would look as follows:\n[1, 1, 1, 1, 1, 1, 0, 0, 0, 0]\n1\n[1, 1, 1, 1, 1, 1, 0, 0, 0, 0]\nThe other three documents would look as follows:\n\"it was the worst of times\" = [1, 1, 1, 0, 1, 1, 1, 0, 0, 0]\n\"it was the age of wisdom\" = [1, 1, 1, 0, 1, 0, 0, 1, 1, 0]\n\"it was the age of foolishness\" = [1, 1, 1, 0, 1, 0, 0, 1, 0, 1]\n1\n2\n3\n\"it was the worst of times\" = [1, 1, 1, 0, 1, 1, 1, 0, 0, 0]\n\"it was the age of wisdom\" = [1, 1, 1, 0, 1, 0, 0, 1, 1, 0]\n\"it was the age of foolishness\" = [1, 1, 1, 0, 1, 0, 0, 1, 0, 1]\nAll ordering of the words is nominally discarded and we have a consistent way of extracting features from any document in our corpus, ready for use in modeling.\nNew documents that overlap with the vocabulary of known words, but may contain words outside of the vocabulary, can still be encoded, where only the occurrence of known words are scored and unknown words are ignored.\nYou can see how this might naturally scale to large vocabularies and larger documents.\nManaging Vocabulary\nAs the vocabulary size increases, so does the vector representation of documents.\nIn the previous example, the length of the document vector is equal to the number of known words.\nYou can imagine that for a very large corpus, such as thousands of books, that the length of the vector might be thousands or millions of positions. Further, each document may contain very few of the known words in the vocabulary.\nThis results in a vector with lots of zero scores, called a sparse vector or sparse representation.\nSparse vectors require more memory and computational resources when modeling and the vast number of positions or dimensions can make the modeling process very challenging for traditional algorithms.\nAs such, there is pressure to decrease the size of the vocabulary when using a bag-of-words model.\nThere are simple text cleaning techniques that can be used as a first step, such as:\nIgnoring case\nIgnoring punctuation\nIgnoring frequent words that don’t contain much information, called stop words, like “a,” “of,” etc.\nFixing misspelled words.\nReducing words to their stem (e.g. “play” from “playing”) using stemming algorithms.\nA more sophisticated approach is to create a vocabulary of grouped words. This both changes the scope of the vocabulary and allows the bag-of-words to capture a little bit more meaning from the document.\nIn this approach, each word or token is called a “gram”. Creating a vocabulary of two-word pairs is, in turn, called a bigram model. Again, only the bigrams that appear in the corpus are modeled, not all possible bigrams.\nAn N-gram is an N-token sequence of words: a 2-gram (more commonly called a bigram) is a two-word sequence of words like “please turn”, “turn your”, or “your homework”, and a 3-gram (more commonly called a trigram) is a three-word sequence of words like “please turn your”, or “turn your homework”.\n— Page 85,\nSpeech and Language Processing\n, 2009.\nFor example, the bigrams in the first line of text in the previous section: “It was the best of times” are as follows:\n“it was”\n“was the”\n“the best”\n“best of”\n“of times”\nA vocabulary then tracks triplets of words is called a trigram model and the general approach is called the n-gram model, where n refers to the number of grouped words.\nOften a simple bigram approach is better than a 1-gram bag-of-words model for tasks like documentation classification.\na bag-of-bigrams representation is much more powerful than bag-of-words, and in many cases proves very hard to beat.\n— Page 75,\nNeural Network Methods in Natural Language Processing\n, 2017.\nScoring Words\nOnce a vocabulary has been chosen, the occurrence of words in example documents needs to be scored.\nIn the worked example, we have already seen one very simple approach to scoring: a binary scoring of the presence or absence of words.\nSome additional simple scoring methods include:\nCounts\n. Count the number of times each word appears in a document.\nFrequencies\n. Calculate the frequency that each word appears in a document out of all the words in the document.\nWord Hashing\nYou may remember from computer science that a\nhash function\nis a bit of math that maps data to a fixed size set of numbers.\nFor example, we use them in hash tables when programming where perhaps names are converted to numbers for fast lookup.\nWe can use a hash representation of known words in our vocabulary. This addresses the problem of having a very large vocabulary for a large text corpus because we can choose the size of the hash space, which is in turn the size of the vector representation of the document.\nWords are hashed deterministically to the same integer index in the target hash space. A binary score or count can then be used to score the word.\nThis is called the “\nhash trick\n” or “\nfeature hashing\n“.\nThe challenge is to choose a hash space to accommodate the chosen vocabulary size to minimize the probability of collisions and trade-off sparsity.\nTF-IDF\nA problem with scoring word frequency is that highly frequent words start to dominate in the document (e.g. larger score), but may not contain as much “informational content” to the model as rarer but perhaps domain specific words.\nOne approach is to rescale the frequency of words by how often they appear in all documents, so that the scores for frequent words like “the” that are also frequent across all documents are penalized.\nThis approach to scoring is called Term Frequency – Inverse Document Frequency, or TF-IDF for short, where:\nTerm Frequency\n: is a scoring of the frequency of the word in the current document.\nInverse Document Frequency\n: is a scoring of how rare the word is across documents.\nThe scores are a weighting where not all words are equally as important or interesting.\nThe scores have the effect of highlighting words that are distinct (contain useful information) in a given document.\nThus the idf of a rare term is high, whereas the idf of a frequent term is likely to be low.\n— Page 118,\nAn Introduction to Information Retrieval\n, 2008.\nLimitations of Bag-of-Words\nThe bag-of-words model is very simple to understand and implement and offers a lot of flexibility for customization on your specific text data.\nIt has been used with great success on prediction problems like language modeling and documentation classification.\nNevertheless, it suffers from some shortcomings, such as:\nVocabulary\n: The vocabulary requires careful design, most specifically in order to manage the size, which impacts the sparsity of the document representations.\nSparsity\n: Sparse representations are harder to model both for computational reasons (space and time complexity) and also for information reasons, where the challenge is for the models to harness so little information in such a large representational space.\nMeaning\n: Discarding word order ignores the context, and in turn meaning of words in the document (semantics). Context and meaning can offer a lot to the model, that if modeled could tell the difference between the same words differently arranged (“this is interesting” vs “is this interesting”), synonyms (“old bike” vs “used bike”), and much more.\nFurther Reading\nThis section provides more resources on the topic if you are looking go deeper.\nArticles\nBag-of-words model on Wikipedia\nN-gram on Wikipedia\nFeature hashing on Wikipedia\ntf–idf on Wikipedia\nBooks\nChapter 6,\nNeural Network Methods in Natural Language Processing\n, 2017.\nChapter 4,\nSpeech and Language Processing\n, 2009.\nChapter 6,\nAn Introduction to Information Retrieval\n, 2008.\nChapter 6,\nFoundations of Statistical Natural Language Processing\n, 1999.\nSummary\nIn this tutorial, you discovered the bag-of-words model for feature extraction with text data.\nSpecifically, you learned:\nWhat the bag-of-words model is and why we need it.\nHow to work through the application of a bag-of-words model to a collection of documents.\nWhat techniques can be used for preparing a vocabulary and scoring words.\nDo you have any questions?\nAsk your questions in the comments below and I will do my best to answer.\nDevelop Deep Learning models for Text Data Today!\nDevelop Your Own Text models in Minutes\n...with just a few lines of python code\nDiscover how in my new Ebook:\nDeep Learning for Natural Language Processing\nIt provides\nself-study tutorials\non topics like:\nBag-of-Words, Word Embedding, Language Models, Caption Generation, Text Translation\nand much more...\nFinally Bring Deep Learning to your Natural Language Processing Projects\nSkip the Academics. Just Results.\nSee What's Inside\nShare\nPost\nShare\nMore On This Topic\nHow to Develop a Deep Learning Bag-of-Words Model…\nLLM Embeddings vs TF-IDF vs Bag-of-Words: Which…\nHow LLMs Choose Their Words: A Practical…\nA Gentle Introduction to Model Distillation\nA Gentle Introduction to Language Model Fine-tuning\nA Gentle Introduction to Multiple-Model Machine Learning\nAbout Jason Brownlee\nJason Brownlee, PhD is a machine learning specialist who teaches developers how to get results with modern machine learning methods via hands-on tutorials.\nView all posts by Jason Brownlee\n→",
  "metadata": {
    "title": "A Gentle Introduction to the Bag-of-Words Model - MachineLearningMastery.com",
    "description": null,
    "keywords": null,
    "author": "Jason Brownlee",
    "og:locale": "en_US",
    "og:type": "article",
    "og:title": "A Gentle Introduction to the Bag-of-Words Model - MachineLearningMastery.com",
    "og:description": "The bag-of-words model is a way of representing text data when modeling text with machine learning algorithms. The bag-of-words model is simple to understand and implement and has seen great success in problems such as language modeling and document classification. In this tutorial, you will discover the bag-of-words model for feature extraction in natural language processing. After completing this tutorial,…",
    "og:url": "https://machinelearningmastery.com/gentle-introduction-bag-words-model/",
    "og:site_name": "MachineLearningMastery.com",
    "og:image": "https://machinelearningmastery.com/wp-content/uploads/2017/10/A-Gentle-Introduction-to-the-Bag-of-Words-Model.jpg",
    "og:image:width": "640",
    "og:image:height": "427",
    "og:image:type": "image/jpeg",
    "twitter:label1": "Written by",
    "twitter:data1": "Jason Brownlee",
    "twitter:label2": "Est. reading time",
    "twitter:data2": "10 minutes",
    "twitter:card": "summary_large_image",
    "twitter:description": "The bag-of-words model is a way of representing text data when modeling text with machine learning algorithms. The bag-of-words model is simple to understand and implement and has seen great success in problems such as language modeling and document classification. In this tutorial, you will discover the bag-of-words model for feature extraction in natural language processing. After completing this tutorial,…",
    "twitter:title": "A Gentle Introduction to the Bag-of-Words Model - MachineLearningMastery.com",
    "article:publisher": "https://www.facebook.com/MachineLearningMastery/",
    "article:author": "https://www.facebook.com/MachineLearningMastery/",
    "article:published_time": "2017-10-08T18:00:08+00:00",
    "article:modified_time": "2019-08-07T04:40:51+00:00"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [],
  "images": [
    {
      "status": "ok",
      "url": "https://machinelearningmastery.com/wp-content/uploads/2017/10/A-Gentle-Introduction-to-the-Bag-of-Words-Model.jpg",
      "bytes": 51384,
      "reused": true,
      "local_path": "attachments/afe39ae2071b/images/000.jpg",
      "src": "https://machinelearningmastery.com/wp-content/uploads/2017/10/A-Gentle-Introduction-to-the-Bag-of-Words-Model.jpg",
      "alt": "A Gentle Introduction to the Bag-of-Words Model",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://machinelearningmastery.com/wp-content/uploads/2022/11/DL4NLP-220.png",
      "bytes": 4110,
      "reused": false,
      "local_path": "attachments/afe39ae2071b/images/body-e8fcb21cfc1be3513af1.png",
      "src": "https://machinelearningmastery.com/wp-content/uploads/2022/11/DL4NLP-220.png",
      "alt": "Deep Learning for Natural Language Processing",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://machinelearningmastery.com/wp-content/uploads/2017/10/How-to-Develop-a-Deep-Learning-Bag-of-Words-Model-for-Predicting-Sentiment-in-Movie-Reviews.jpg",
      "bytes": 54545,
      "reused": true,
      "local_path": "attachments/afe39ae2071b/images/003.jpg",
      "src": "https://machinelearningmastery.com/wp-content/uploads/2017/10/How-to-Develop-a-Deep-Learning-Bag-of-Words-Model-for-Predicting-Sentiment-in-Movie-Reviews.jpg",
      "alt": "How to Develop a Deep Learning Bag-of-Words Model for Predicting Sentiment in Movie Reviews",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://machinelearningmastery.com/wp-content/uploads/2026/02/mlm-chugani-llm-embeddings-vs-tf-idf-vs-bag-of-words-works-better-scikit-learn-feature-200x200.jpg",
      "bytes": 13514,
      "reused": true,
      "local_path": "attachments/afe39ae2071b/images/005.jpg",
      "src": "https://machinelearningmastery.com/wp-content/uploads/2026/02/mlm-chugani-llm-embeddings-vs-tf-idf-vs-bag-of-words-works-better-scikit-learn-feature-200x200.jpg",
      "alt": "mlm-chugani-llm-embeddings-vs-tf-idf-vs-bag-of-words-works-better-scikit-learn-feature",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://machinelearningmastery.com/wp-content/uploads/2025/12/colton-duke-UExx0KnnkjY-unsplash-200x200.jpg",
      "bytes": 13008,
      "reused": true,
      "local_path": "attachments/afe39ae2071b/images/007.jpg",
      "src": "https://machinelearningmastery.com/wp-content/uploads/2025/12/colton-duke-UExx0KnnkjY-unsplash-200x200.jpg",
      "alt": "colton-duke-UExx0KnnkjY-unsplash",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://machinelearningmastery.com/wp-content/uploads/2026/08/mlm-a-gentle-introduction-to-model-distillation-feature-200x200.png",
      "bytes": 7975,
      "reused": true,
      "local_path": "attachments/afe39ae2071b/images/009.png",
      "src": "https://machinelearningmastery.com/wp-content/uploads/2026/08/mlm-a-gentle-introduction-to-model-distillation-feature-200x200.png",
      "alt": "mlm-a-gentle-introduction-to-model-distillation-feature",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://machinelearningmastery.com/wp-content/uploads/2026/01/nick-night-8LTlfHL47Ac-unsplash-200x200.jpg",
      "bytes": 13176,
      "reused": true,
      "local_path": "attachments/afe39ae2071b/images/011.jpg",
      "src": "https://machinelearningmastery.com/wp-content/uploads/2026/01/nick-night-8LTlfHL47Ac-unsplash-200x200.jpg",
      "alt": "nick-night-8LTlfHL47Ac-unsplash",
      "downloaded": true
    },
    {
      "status": "ok",
      "url": "https://machinelearningmastery.com/wp-content/uploads/2020/12/A-Gentle-Introduction-to-Multiple-Model-Machine-Learning.jpg",
      "bytes": 30186,
      "reused": true,
      "local_path": "attachments/afe39ae2071b/images/013.jpg",
      "src": "https://machinelearningmastery.com/wp-content/uploads/2020/12/A-Gentle-Introduction-to-Multiple-Model-Machine-Learning.jpg",
      "alt": "A Gentle Introduction to Multiple-Model Machine Learning",
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [],
  "links": [
    {
      "href": "https://machinelearningmastery.com/author/jasonb/",
      "label": "Jason Brownlee",
      "type": "a"
    },
    {
      "href": "https://machinelearningmastery.com/category/natural-language-processing/",
      "label": "Deep Learning for Natural Language Processing",
      "type": "a"
    },
    {
      "href": "https://machinelearningmastery.com/gentle-introduction-bag-words-model/",
      "label": "125",
      "type": "a"
    },
    {
      "href": "https://machinelearningmastery.com/natural-language-processing/",
      "label": "natural language processing",
      "type": "a"
    },
    {
      "href": "https://machinelearningmastery.com/deep-learning-for-nlp/",
      "label": "Deep Learning for Natural Language Processing",
      "type": "a"
    },
    {
      "href": "https://www.flickr.com/photos/beorn_ours/5675267679/",
      "label": "Do8y",
      "type": "a"
    },
    {
      "href": "http://amzn.to/2wycQKA",
      "label": "Neural Network Methods in Natural Language Processing",
      "type": "a"
    },
    {
      "href": "https://www.gutenberg.org/ebooks/98",
      "label": "A Tale of Two Cities",
      "type": "a"
    },
    {
      "href": "http://amzn.to/2vaEb7T",
      "label": "Speech and Language Processing",
      "type": "a"
    },
    {
      "href": "https://en.wikipedia.org/wiki/Hash_function",
      "label": "hash function",
      "type": "a"
    },
    {
      "href": "http://amzn.to/2hAR7PH",
      "label": "An Introduction to Information Retrieval",
      "type": "a"
    },
    {
      "href": "https://en.wikipedia.org/wiki/Bag-of-words_model",
      "label": "Bag-of-words model on Wikipedia",
      "type": "a"
    },
    {
      "href": "https://en.wikipedia.org/wiki/N-gram",
      "label": "N-gram on Wikipedia",
      "type": "a"
    },
    {
      "href": "https://en.wikipedia.org/wiki/Feature_hashing",
      "label": "Feature hashing on Wikipedia",
      "type": "a"
    },
    {
      "href": "https://en.wikipedia.org/wiki/Tf%E2%80%93idf",
      "label": "tf–idf on Wikipedia",
      "type": "a"
    },
    {
      "href": "https://amzn.to/2Endtxh",
      "label": "An Introduction to Information Retrieval",
      "type": "a"
    },
    {
      "href": "http://amzn.to/2vvnPHP",
      "label": "Foundations of Statistical Natural Language Processing",
      "type": "a"
    },
    {
      "href": "https://machinelearningmastery.com/deep-learning-bag-of-words-model-sentiment-analysis/",
      "label": "How to Develop a Deep Learning Bag-of-Words Model…",
      "type": "a"
    },
    {
      "href": "https://machinelearningmastery.com/llm-embeddings-vs-tf-idf-vs-bag-of-words-which-works-better-in-scikit-learn/",
      "label": "LLM Embeddings vs TF-IDF vs Bag-of-Words: Which…",
      "type": "a"
    },
    {
      "href": "https://machinelearningmastery.com/how-llms-choose-their-words-a-practical-walk-through-of-logits-softmax-and-sampling/",
      "label": "How LLMs Choose Their Words: A Practical…",
      "type": "a"
    },
    {
      "href": "https://machinelearningmastery.com/a-gentle-introduction-to-model-distillation/",
      "label": "A Gentle Introduction to Model Distillation",
      "type": "a"
    },
    {
      "href": "https://machinelearningmastery.com/a-gentle-introduction-to-language-model-fine-tuning/",
      "label": "A Gentle Introduction to Language Model Fine-tuning",
      "type": "a"
    },
    {
      "href": "https://machinelearningmastery.com/multiple-model-machine-learning/",
      "label": "A Gentle Introduction to Multiple-Model Machine Learning",
      "type": "a"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:54:20Z",
  "source_url": "https://machinelearningmastery.com/gentle-introduction-bag-words-model/",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 14283,
  "expected_body_images": 8,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/afe39ae2071b/pages/source.html",
  "local_html": "attachments/afe39ae2071b/pages/article.html",
  "body_base_path": "attachments/afe39ae2071b/pages/",
  "body_markdown_path": "attachments/afe39ae2071b/pages/article.md"
}