Repository: LSYS/LexicalRichness (language: python)

Issue:
Add docstrings to docs
Would be nice to expose the underlying docstrings that describe the measures. Sphinx can do this via `autodoc` (https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html).


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index d840948..ad2605c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -24,7 +24,7 @@ jobs:
     - name: Install dependencies
       run: |
         python -m pip install --upgrade pip
-        python -m pip install scipy textblob pytest
+        python -m pip install scipy textblob pytest matplotlib
         if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
     - name: Test with pytest
       run: |
diff --git a/README.rst b/README.rst
index e7283bb..fc73699 100644
--- a/README.rst
+++ b/README.rst
@@ -9,6 +9,7 @@ LexicalRichness
 `LexicalRichness <https://github.com/lsys/lexicalrichness>`__ is a small Python module to compute textual lexical richness (aka lexical diversity) measures.
 
 Lexical richness refers to the range and variety of vocabulary deployed in a text by a speaker/writer `(McCarthy and Jarvis 2007) <https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.1028.8657&rep=rep1&type=pdf>`_ . Lexical richness is used interchangeably with lexical diversity, lexical variation, lexical density, and vocabulary richness and is measured by a wide variety of indices. Uses include (but not limited to) measuring writing quality, vocabulary knowledge `(Šišková 2012) <https://www.researchgate.net/publication/305999633_Lexical_Richness_in_EFL_Students'_Narratives>`_ , speaker competence, and socioeconomic status `(McCarthy and Jarvis 2007) <https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.1028.8657&rep=rep1&type=pdf>`_. 
+See the `notebook <https://nbviewer.org/github/LSYS/LexicalRichness/blob/master/docs/example.ipynb>`_ for examples.
 
 .. TOC
 .. contents:: **Table of Contents**
@@ -124,6 +125,10 @@ Try the package on the cloud (without setting anything up on your local machine)
 	# Return hypergeometric distribution diversity (HD-D) measure.
 	>>> lex.hdd(draws=42)
 	0.7468703323966486
+	
+	# Return voc-D measure.
+	>>> lex.vocd()
+	46.27679899103406
 
 	# Return voc-D score of lexical richness.
 	>>> lex.vocd(ntokens=50, within_sample=100, iterations=3)
@@ -237,6 +242,22 @@ Here's a minimal example using `lexicalrichness` with a `Pandas` `dataframe` wit
 +-------------------------+-----------------------------------------------------------------------------------+
 | ``vocd``                | voc-D (Mckee, Malvern, and Richards 2010)                                         |
 +-------------------------+-----------------------------------------------------------------------------------+
+| ``vocd_fig``            | Utility to plot empirical voc-D curve 	                                      |
++-------------------------+-----------------------------------------------------------------------------------+
+
+**Plot the empirical voc-D curve**
+
+.. code-block:: python
+
+	lex.vocd_fig(
+	    ntokens=50,  # Maximum number for the token/word size in the random samplings
+	    within_sample=100,  # Number of samples
+	    seed=42,  # Seed for reproducibility
+	)
+
+.. image:: https://raw.githubusercontent.com/LSYS/LexicalRichness/dev/docs/images/vocd.png
+
+
 
 **Assessing method docstrings**
 
@@ -378,7 +399,7 @@ For now, refer to the study below for algorithmic details:
 	   <summary><a>Words vs Terms in Each Book</a></summary>
 		
 		<p align="left">
-			<img width="50%" src="https://raw.githubusercontent.com/g-hurst/Comparing-Properties-of-German-and-English-Books/main/figures/words%20vs%20terms%20scatter.png">
+			<img width="50%" src="https://github.com/g-hurst/Comparing-Properties-of-German-and-English-Books/blob/main/figures/words%20vs%20terms%20scatter.png">
 			<br>
 			Source: <a href="https://github.com/g-hurst/Comparing-Properties-of-German-and-English-Books">(https://github.com/g-hurst/Comparing-Properties-of-German-and-English-Books)</a>
 		</p>  
@@ -465,4 +486,4 @@ License <https://opensource.org/licenses/MIT>`__.
 		
 .. |rtfd| image:: https://readthedocs.org/projects/lexicalrichness/badge/?version=latest
     :target: https://lexicalrichness.readthedocs.io/en/latest/?badge=latest
-    :alt: Documentation Status
\ No newline at end of file
+    :alt: Documentation Status
diff --git a/docs/example.ipynb b/docs/example.ipynb
index 609ecec..89d8609 100644
--- a/docs/example.ipynb
+++ b/docs/example.ipynb
@@ -6,13 +6,26 @@
    "id": "a63c6636",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.160974Z",
-     "start_time": "2022-10-31T13:02:00.379871Z"
+     "end_time": "2023-01-09T14:25:42.227052Z",
+     "start_time": "2023-01-09T14:25:35.269629Z"
     }
    },
-   "outputs": [],
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'0.4.0'"
+      ]
+     },
+     "execution_count": 1,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
-    "from lexicalrichness import LexicalRichness"
+    "from lexicalrichness import LexicalRichness\n",
+    "import lexicalrichness\n",
+    "lexicalrichness.__version__"
    ]
   },
   {
@@ -21,8 +34,8 @@
    "id": "146c8a20",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.170111Z",
-     "start_time": "2022-10-31T13:02:07.160974Z"
+     "end_time": "2023-01-09T14:25:42.244354Z",
+     "start_time": "2023-01-09T14:25:42.227052Z"
     }
    },
    "outputs": [],
@@ -54,8 +67,8 @@
    "id": "a9505240",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.215925Z",
-     "start_time": "2022-10-31T13:02:07.173352Z"
+     "end_time": "2023-01-09T14:25:42.260376Z",
+     "start_time": "2023-01-09T14:25:42.244354Z"
     },
     "scrolled": true
    },
@@ -80,8 +93,8 @@
    "id": "ab1197ed",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.238115Z",
-     "start_time": "2022-10-31T13:02:07.217323Z"
+     "end_time": "2023-01-09T14:25:42.276331Z",
+     "start_time": "2023-01-09T14:25:42.260376Z"
     },
     "scrolled": true
    },
@@ -108,8 +121,8 @@
    "id": "670dc039",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.250529Z",
-     "start_time": "2022-10-31T13:02:07.238115Z"
+     "end_time": "2023-01-09T14:25:42.292320Z",
+     "start_time": "2023-01-09T14:25:42.276331Z"
     }
    },
    "outputs": [
@@ -147,8 +160,8 @@
    "id": "15cf3baa",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.279878Z",
-     "start_time": "2022-10-31T13:02:07.250529Z"
+     "end_time": "2023-01-09T14:25:42.308345Z",
+     "start_time": "2023-01-09T14:25:42.292320Z"
     }
    },
    "outputs": [
@@ -185,8 +198,8 @@
    "id": "243c0b6e",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.288618Z",
-     "start_time": "2022-10-31T13:02:07.279878Z"
+     "end_time": "2023-01-09T14:25:42.324298Z",
+     "start_time": "2023-01-09T14:25:42.308345Z"
     }
    },
    "outputs": [
@@ -223,8 +236,8 @@
    "id": "6ef1a291",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.310965Z",
-     "start_time": "2022-10-31T13:02:07.288618Z"
+     "end_time": "2023-01-09T14:25:42.340287Z",
+     "start_time": "2023-01-09T14:25:42.324298Z"
     }
    },
    "outputs": [
@@ -261,8 +274,8 @@
    "id": "c8872550",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.751839Z",
-     "start_time": "2022-10-31T13:02:07.310965Z"
+     "end_time": "2023-01-09T14:25:42.356313Z",
+     "start_time": "2023-01-09T14:25:42.340287Z"
     }
    },
    "outputs": [
@@ -299,8 +312,8 @@
    "id": "2afe9172",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.779534Z",
-     "start_time": "2022-10-31T13:02:07.751839Z"
+     "end_time": "2023-01-09T14:25:42.372268Z",
+     "start_time": "2023-01-09T14:25:42.356313Z"
     }
    },
    "outputs": [
@@ -337,8 +350,8 @@
    "id": "7085f9e8",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.800370Z",
-     "start_time": "2022-10-31T13:02:07.779534Z"
+     "end_time": "2023-01-09T14:25:42.380261Z",
+     "start_time": "2023-01-09T14:25:42.372268Z"
     }
    },
    "outputs": [
@@ -375,8 +388,8 @@
    "id": "67ac775e",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.808373Z",
-     "start_time": "2022-10-31T13:02:07.800370Z"
+     "end_time": "2023-01-09T14:25:42.396253Z",
+     "start_time": "2023-01-09T14:25:42.380261Z"
     }
    },
    "outputs": [
@@ -421,8 +434,8 @@
    "id": "ec152992",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.837251Z",
-     "start_time": "2022-10-31T13:02:07.810588Z"
+     "end_time": "2023-01-09T14:25:42.412240Z",
+     "start_time": "2023-01-09T14:25:42.396253Z"
     },
     "scrolled": true
    },
@@ -461,8 +474,8 @@
    "id": "70840cc6",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.845256Z",
-     "start_time": "2022-10-31T13:02:07.837251Z"
+     "end_time": "2023-01-09T14:25:42.428232Z",
+     "start_time": "2023-01-09T14:25:42.412240Z"
     }
    },
    "outputs": [
@@ -502,8 +515,8 @@
    "id": "101b3af4",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:07.862805Z",
-     "start_time": "2022-10-31T13:02:07.845256Z"
+     "end_time": "2023-01-09T14:25:42.444221Z",
+     "start_time": "2023-01-09T14:25:42.428232Z"
     }
    },
    "outputs": [
@@ -545,8 +558,8 @@
    "id": "401a10ea",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:08.089324Z",
-     "start_time": "2022-10-31T13:02:07.862805Z"
+     "end_time": "2023-01-09T14:25:42.672511Z",
+     "start_time": "2023-01-09T14:25:42.444221Z"
     }
    },
    "outputs": [
@@ -570,6 +583,82 @@
     ")"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "id": "b824f9b4",
+   "metadata": {
+    "ExecuteTime": {
+     "end_time": "2023-01-09T14:25:42.896322Z",
+     "start_time": "2023-01-09T14:25:42.672511Z"
+    }
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "46.27679899103406"
+      ]
+     },
+     "execution_count": 17,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "lex.vocd()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9656493f",
+   "metadata": {},
+   "source": [
+    "#### voc-D plot utility\n",
+    "* Utility to plot empirical voc-D curve and the best fitting line"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "id": "a3f90468",
+   "metadata": {
+    "ExecuteTime": {
+     "end_time": "2023-01-09T14:25:43.700488Z",
+     "start_time": "2023-01-09T14:25:42.896322Z"
+    }
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<AxesSubplot:xlabel='Sample size', ylabel='TTR'>"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "lex.vocd_fig(\n",
+    "    ntokens=50,  # Maximum number for the token/word size in the random samplings\n",
+    "    within_sample=100,  # Number of samples\n",
+    "    seed=42,  # Seed for reproducibility\n",
+    "    savepath=\"images/vocd.png\",\n",
+    ")"
+   ]
+  },
   {
    "cell_type": "markdown",
    "id": "d2180b54",
@@ -582,12 +671,12 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 19,
    "id": "368e8cc4",
    "metadata": {
     "ExecuteTime": {
-     "end_time": "2022-10-31T13:02:08.112747Z",
-     "start_time": "2022-10-31T13:02:08.092423Z"
+     "end_time": "2023-01-09T14:25:43.724473Z",
+     "start_time": "2023-01-09T14:25:43.700488Z"
     }
    },
    "outputs": [
@@ -597,7 +686,7 @@
        "0.7468703323966481"
       ]
      },
-     "execution_count": 17,
+     "execution_count": 19,
      "metadata": {},
      "output_type": "execute_result"
     }
diff --git a/docs/images/vocd.png b/docs/images/vocd.png
new file mode 100644
index 0000000..48c8997
Binary files /dev/null and b/docs/images/vocd.png differ
diff --git a/lexicalrichness/__init__.py b/lexicalrichness/__init__.py
index 38ddf9d..ed76164 100644
--- a/lexicalrichness/__init__.py
+++ b/lexicalrichness/__init__.py
@@ -5,6 +5,6 @@
 __title__ = 'lexicalrichness'
 __author__ = """Lucas Shen YS"""
 __email__ = 'lucas@lucasshen.com'
-__version__ = '0.3.1'
+__version__ = '0.4.0'
 
 from .lexicalrichness import *
diff --git a/lexicalrichness/lexicalrichness.py b/lexicalrichness/lexicalrichness.py
index 2ced13d..65fe448 100644
--- a/lexicalrichness/lexicalrichness.py
+++ b/lexicalrichness/lexicalrichness.py
@@ -16,6 +16,7 @@
 from scipy.stats import hypergeom
 from scipy.optimize import curve_fit
 import random
+import matplotlib.pyplot as plt
 
 try:
     from textblob import TextBlob
@@ -605,6 +606,122 @@ def vocd(self, ntokens=50, within_sample=100, iterations=3, seed=42):
             adapted_d.append(popt[0])
         return np.mean(adapted_d)
 
+    def vocd_fig(
+        self,
+        ntokens=50,
+        within_sample=100,
+        seed=42,
+        return_data=False,
+        color1="darkslategray",
+        color2="black",
+        leglabel1="Random-sampling TTR curve",
+        leglabel2="Best-fitting theoretical curve",
+        lwidth1=3,
+        lwidth2=1.5,
+        lpattern1="-",
+        lpattern2="--",
+        xlabel="Sample size",
+        ylabel="TTR",
+        figsize=None,
+        title="",
+        savepath=None,
+    ):
+        """ Plots the empirical function of TTR to word sampling and the best-fitting curve in the 
+            vocd measure. Vocd is meant as a measure of lexical diversity robust to varying text lengths. 
+            See also vocd and hdd.
+
+            The horizontal axis is the token/word size of the random samplings (e.g. token size=50 means 
+            that each of the 100 samples consists of 50 words).
+            The vertical axis is the mean TTR score from the 100 samples computed in 2 steps as follows. 
+            First, take 100 random samples of 35 words from the text. Compute the mean TTR from the 100 
+            samples. Second, repeat this procedure for samples of 36 words, 37 words, and so on, all the 
+            way to ntokens (recommended as 50 [default]).
+
+            Helper Function
+            ---------------
+            ttr_nd 
+                TTR as a function of latent lexical diversity (d) and text length (n).
+
+            Parameters
+            ----------
+            ntokens: int
+                Maximum number for the token/word size in the random samplings (default=50).
+            within_sample: int
+                Number of samples for each token/word size (default=100).
+            iterations: int
+                Number of times to repeat steps 1 to 3 before averaging (default=3).
+            seed: int
+                Seed for the pseudo-random number generator in ramdom.sample() (default=42).
+            return_data: boolean
+                If True, returns a tuple (figure, xvalues, empirical_TTR, fitted_TTR). Default is False.
+                xvalues, empirical_TTR, and fitted_TTR are lists of numbers.
+
+            Returns
+            -------
+            matplotlib.figure.Figure            
+        """
+        try:
+            assert self.words > ntokens
+        except Exception:
+            raise ValueError(
+                "Number of tokens in text smaller than number of tokens to sample."
+            )
+
+        random.seed(seed)
+        ydata = []
+        for ntoken in range(35, 1 + ntokens):
+            ttr_results = []
+            for _ in range(100):
+                sample_of_tokens = random.sample(self.wordlist, k=ntoken)
+
+                n_unique = len(set(sample_of_tokens))
+
+                ttr = n_unique / ntoken
+
+                ttr_results.append(ttr)
+
+            mean_ttr = np.mean(ttr_results)
+            ydata.append(mean_ttr)
+
+        xdata = list(range(35, 1 + ntokens))
+        assert len(xdata) == len(ydata)
+
+        popt, _ = curve_fit(ttr_nd, xdata, ydata)
+
+        # Plot
+        _, ax = plt.subplots(figsize=figsize, facecolor="white")
+        plt.plot(
+            xdata,
+            ydata,
+            color=color1,
+            linewidth=lwidth1,
+            linestyle=lpattern1,
+            label=leglabel1,
+        )
+        plt.plot(
+            xdata,
+            ttr_nd(xdata, popt),
+            color=color2,
+            linewidth=lwidth2,
+            linestyle=lpattern2,
+            label=leglabel2,
+            alpha=0.6,
+        )
+        plt.locator_params(axis="y", nbins=5)
+        plt.xlabel(xlabel, fontweight="bold", loc="right", size=12)
+        plt.ylabel(ylabel, fontweight="bold", loc="top", size=12)
+        plt.title(title, fontweight="bold", loc="left", size=12)
+        plt.legend(
+            loc="best", fontsize=11, frameon=False, fancybox=True, framealpha=0.8,
+        )
+        if savepath:
+            plt.savefig(savepath, dpi='figure', bbox_inches='tight')
+
+        if return_data:
+            return ax, xdata, ydata, list(ttr_nd(xdata, popt))
+        else:
+            return ax
+            
     def __str__(self):
         return " ".join(self.wordlist)
 
diff --git a/setup.py b/setup.py
index a05cbc5..63065d2 100644
--- a/setup.py
+++ b/setup.py
@@ -12,7 +12,7 @@
     history = history_file.read()
 
 
-requirements = ["scipy>=1.0.0", "textblob>=0.15.3", "pandas", "scipy"]
+requirements = ["scipy>=1.0.0", "textblob>=0.15.3", "pandas", "scipy", "matplotlib"]
 
 setup(
     author="Lucas Shen YS",
@@ -56,6 +56,6 @@
     name="lexicalrichness",
     packages=find_packages(include=["lexicalrichness"]),
     url="https://github.com/LSYS/lexicalrichness",
-    download_url="https://github.com/LSYS/LexicalRichness/archive/refs/tags/v0.3.1.tar.gz",
-    version="0.3.1",
+    download_url="https://github.com/LSYS/LexicalRichness/archive/refs/tags/v0.4.0.tar.gz",
+    version="0.4.0",
 )


Test patch:
diff --git a/tests/test_lexicalrichness.py b/tests/test_lexicalrichness.py
index ec2b76e..c51d1c8 100644
--- a/tests/test_lexicalrichness.py
+++ b/tests/test_lexicalrichness.py
@@ -13,6 +13,7 @@
 from lexicalrichness.lexicalrichness import ttr_nd
 import pytest
 import numpy as np
+import matplotlib
 
 
 class TestLexicalrichness(unittest.TestCase):
@@ -236,6 +237,17 @@ def test_vocd(self):
         assert first_seed42 != third_seed0
         assert second_seed42 != third_seed0
 
+    def test_vocd_fig(self):
+        print("testing voc-D figure")
+        assert isinstance(self.longtext.vocd_fig(), matplotlib.pyplot.Axes)
+
+        # Gently raise exception if text size is small
+        with pytest.raises(ValueError) as err:
+            self.obj1.vocd_fig()
+        assert (
+            str(err.value)
+            == "Number of tokens in text smaller than number of tokens to sample."
+        )
 
 if __name__ == "__main__":
     unittest.main()