From a642b2e11537c1f2f58376469a9d1e63f81272e8 Mon Sep 17 00:00:00 2001 From: pakjiddat Date: Wed, 22 Dec 2021 18:10:01 +0500 Subject: [PATCH] Disable caching in rmarkdown files - Update R version in DESCRIPTION file. - Caching needs to be disabled in README.rmd, features.Rmd and Overview.Rmd files. - Print statement in env-manager.R needs to be commented out. - Build website using pkgdown. - Update NEWS.md and cran-comments.md files. - Update link in codecov badge. --- .Rbuildignore | 1 + CRAN-RELEASE | 2 - CRAN-SUBMISSION | 3 + DESCRIPTION | 4 +- NEWS.md | 6 + R/env-manager.R | 2 +- README.Rmd | 12 +- README.md | 26 +- _pkgdown.yml | 2 + cran-comments.md | 10 +- docs/404.html | 192 +- docs/LICENSE-text.html | 179 +- docs/LICENSE.html | 179 +- docs/articles/features.html | 334 +- docs/articles/index.html | 182 +- docs/articles/man/figures/coverage.png | Bin 56053 -> 53316 bytes docs/articles/man/figures/top_features.png | Bin 64494 -> 62981 bytes docs/articles/overview.html | 295 +- docs/articles/reference/figures/coverage.png | Bin 0 -> 53316 bytes .../reference/figures/top_features.png | Bin 0 -> 62981 bytes docs/authors.html | 204 +- .../bootstrap-5.1.0/bootstrap.bundle.min.js | 7 + .../bootstrap.bundle.min.js.map | 1 + docs/deps/bootstrap-5.1.0/bootstrap.min.css | 1 + docs/deps/data-deps.txt | 4 + docs/deps/jquery-3.6.0/jquery-3.6.0.js | 10881 ++++++++++++++++ docs/deps/jquery-3.6.0/jquery-3.6.0.min.js | 2 + docs/deps/jquery-3.6.0/jquery-3.6.0.min.map | 1 + docs/index.html | 348 +- docs/news/index.html | 214 +- docs/pkgdown.css | 83 +- docs/pkgdown.js | 176 +- docs/pkgdown.yml | 6 +- docs/reference/Base.html | 258 +- docs/reference/DataAnalyzer-1.png | Bin 38974 -> 40683 bytes docs/reference/DataAnalyzer.html | 866 +- docs/reference/DataCleaner.html | 608 +- docs/reference/DataSampler.html | 662 +- docs/reference/EnvManager.html | 389 +- docs/reference/Model.html | 394 +- docs/reference/ModelEvaluator-1.png | Bin 82987 -> 83093 bytes docs/reference/ModelEvaluator.html | 1038 +- docs/reference/ModelGenerator.html | 512 +- docs/reference/ModelPredictor.html | 804 +- docs/reference/TPGenerator.html | 457 +- docs/reference/TokenGenerator.html | 438 +- .../figures/README-analyze-ngrams-1-1.png | Bin 6289 -> 6364 bytes .../figures/README-analyze-ngrams-2-1.png | Bin 13111 -> 6506 bytes docs/reference/index.html | 324 +- docs/reference/wordpredictor-package.html | 223 +- docs/search.json | 1 + docs/sitemap.xml | 32 +- man/figures/README-analyze-ngrams-1-1.png | Bin 6289 -> 6364 bytes man/figures/README-analyze-ngrams-2-1.png | Bin 13111 -> 6506 bytes man/wordpredictor-package.Rd | 9 +- vignettes/features.Rmd | 38 +- vignettes/man/figures/coverage.png | Bin 56053 -> 0 bytes vignettes/man/figures/top_features.png | Bin 64494 -> 0 bytes vignettes/overview.Rmd | 12 +- .../figures/README-tokenization-2-1.png | Bin .../figures/README-tokenization-3-1.png | Bin .../figures/VIGNETTES-tokenization-2-1.png | Bin .../figures/VIGNETTES-tokenization-3-1.png | Bin vignettes/reference/figures/coverage.png | Bin 0 -> 53316 bytes vignettes/reference/figures/top_features.png | Bin 0 -> 62981 bytes 65 files changed, 15035 insertions(+), 5387 deletions(-) delete mode 100644 CRAN-RELEASE create mode 100644 CRAN-SUBMISSION create mode 100644 docs/articles/reference/figures/coverage.png create mode 100644 docs/articles/reference/figures/top_features.png create mode 100644 docs/deps/bootstrap-5.1.0/bootstrap.bundle.min.js create mode 100644 docs/deps/bootstrap-5.1.0/bootstrap.bundle.min.js.map create mode 100644 docs/deps/bootstrap-5.1.0/bootstrap.min.css create mode 100644 docs/deps/data-deps.txt create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.js create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.min.js create mode 100644 docs/deps/jquery-3.6.0/jquery-3.6.0.min.map create mode 100644 docs/search.json delete mode 100644 vignettes/man/figures/coverage.png delete mode 100644 vignettes/man/figures/top_features.png rename vignettes/{man => reference}/figures/README-tokenization-2-1.png (100%) rename vignettes/{man => reference}/figures/README-tokenization-3-1.png (100%) rename vignettes/{man => reference}/figures/VIGNETTES-tokenization-2-1.png (100%) rename vignettes/{man => reference}/figures/VIGNETTES-tokenization-3-1.png (100%) create mode 100644 vignettes/reference/figures/coverage.png create mode 100644 vignettes/reference/figures/top_features.png diff --git a/.Rbuildignore b/.Rbuildignore index 5c20faf..2754745 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -13,3 +13,4 @@ ^vignettes/overview_cache$ ^CRAN-RELEASE$ ^codecov\.yml$ +^CRAN-SUBMISSION$ diff --git a/CRAN-RELEASE b/CRAN-RELEASE deleted file mode 100644 index 660d888..0000000 --- a/CRAN-RELEASE +++ /dev/null @@ -1,2 +0,0 @@ -This package was submitted to CRAN on 2021-06-18. -Once it is accepted, delete this file and tag the release (commit 021eb41). diff --git a/CRAN-SUBMISSION b/CRAN-SUBMISSION new file mode 100644 index 0000000..8b5188e --- /dev/null +++ b/CRAN-SUBMISSION @@ -0,0 +1,3 @@ +Version: 0.0.3 +Date: 2022-01-03 10:44:59 UTC +SHA: e08f755a59570f644a442d01647e672e6a1a73f1 diff --git a/DESCRIPTION b/DESCRIPTION index 9bad7a4..18e8f8b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: wordpredictor Title: Develop Text Prediction Models Based on N-Grams -Version: 0.0.2 +Version: 0.0.3 URL: https://github.com/pakjiddat/word-predictor, https://pakjiddat.github.io/word-predictor/ BugReports: https://github.com/pakjiddat/word-predictor/issues Authors@R: @@ -20,7 +20,7 @@ Description: A framework for developing n-gram models for text prediction. License: MIT + file LICENSE Encoding: UTF-8 Roxygen: list(markdown = TRUE) -RoxygenNote: 7.1.1 +RoxygenNote: 7.1.2 Imports: digest, ggplot2, patchwork, stringr, dplyr, SnowballC Suggests: testthat, diff --git a/NEWS.md b/NEWS.md index c1281d8..a67b5c4 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,9 @@ +# wordpredictor 0.0.3 + +## Bug fixes + + * Disabled caching in R Markdown files, because it was causing problems with CRAN checks. + # wordpredictor 0.0.2 ## Bug fixes diff --git a/R/env-manager.R b/R/env-manager.R index fd762bd..73e6f1a 100644 --- a/R/env-manager.R +++ b/R/env-manager.R @@ -184,7 +184,7 @@ EnvManager <- R6::R6Class( wp$ed <- ed # The wordpredictor options are updated options("wordpredictor" = wp) - print(list.files(system.file(package = "wordpredictor"))) + # print(list.files(system.file(package = "wordpredictor"))) # Each file is copied from extdata to the given folder for (fn in fns) { # The source file path diff --git a/README.Rmd b/README.Rmd index dcae618..883d533 100644 --- a/README.Rmd +++ b/README.Rmd @@ -47,7 +47,7 @@ clean_up <- function(ve) { [![R-CMD-check](https://github.com/pakjiddat/word-predictor/workflows/R-CMD-check/badge.svg)](https://github.com/pakjiddat/word-predictor/actions) [![lint](https://github.com/pakjiddat/word-predictor/workflows/lint/badge.svg)](https://github.com/pakjiddat/word-predictor/actions) [![test-coverage](https://github.com/pakjiddat/word-predictor/workflows/test-coverage/badge.svg)](https://github.com/pakjiddat/word-predictor/actions) -[![Codecov test coverage](https://codecov.io/gh/pakjiddat/word-predictor/branch/master/graph/badge.svg)](https://codecov.io/gh/pakjiddat/word-predictor?branch=master) +[![Codecov test coverage](https://codecov.io/gh/pakjiddat/word-predictor/branch/master/graph/badge.svg)](https://app.codecov.io/gh/pakjiddat/word-predictor?branch=master) [![CRAN version](https://www.r-pkg.org/badges/version/wordpredictor)](https://cran.r-project.org/package=wordpredictor) @@ -91,7 +91,7 @@ Information about the package can be obtained using the command line or the pack The following example shows how to generate a n-gram model. -```{r generate-model, cache=TRUE, results='hide'} +```{r generate-model, cache=FALSE, results='hide'} # The required files rf <- c("input.txt") # The test environment is setup @@ -131,7 +131,7 @@ The above code generates the file **def-model.RDS**. This file represents the n- The following example shows how to predict the next word given a set of words: -```{r predict-word, cache=TRUE} +```{r predict-word, cache=FALSE} # The required files rf <- c("def-model.RDS") # The test environment is setup @@ -183,7 +183,7 @@ clean_up(ve) The following example plots the n-gram frequency coverage. It shows the percentage of n-grams with frequency 1, 2 ... 10. -```{r analyze-ngrams-2, cache=TRUE, fig.width=6, fig.height=4} +```{r analyze-ngrams-2, cache=FALSE, fig.width=6, fig.height=4} # The required files rf <- c("n2.RDS") # The test environment is setup @@ -208,7 +208,7 @@ clean_up(ve) The following example shows how to get the list of bi-grams starting with **"great_"** along with their frequencies. It also shows how to get the frequency of the bi-gram **"great_deal"**. -```{r analyze-n-grams-3, cache=TRUE} +```{r analyze-n-grams-3, cache=FALSE} # The required files rf <- c("n2.RDS") # The test environment is setup @@ -294,7 +294,7 @@ Extrinsic evaluation measures the accuracy score for the sentences in a validati The following example shows how to evaluate the performance of a model: -```{r evaluate-performance-1, cache=TRUE, results='hide'} +```{r evaluate-performance-1, cache=FALSE, results='hide'} # The required files rf <- c("def-model.RDS", "validate.txt") # The test environment is setup diff --git a/README.md b/README.md index 31a854d..070ab54 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![lint](https://github.com/pakjiddat/word-predictor/workflows/lint/badge.svg)](https://github.com/pakjiddat/word-predictor/actions) [![test-coverage](https://github.com/pakjiddat/word-predictor/workflows/test-coverage/badge.svg)](https://github.com/pakjiddat/word-predictor/actions) [![Codecov test -coverage](https://codecov.io/gh/pakjiddat/word-predictor/branch/master/graph/badge.svg)](https://codecov.io/gh/pakjiddat/word-predictor?branch=master) +coverage](https://codecov.io/gh/pakjiddat/word-predictor/branch/master/graph/badge.svg)](https://app.codecov.io/gh/pakjiddat/word-predictor?branch=master) [![CRAN version](https://www.r-pkg.org/badges/version/wordpredictor)](https://cran.r-project.org/package=wordpredictor) @@ -106,7 +106,7 @@ mg <- ModelGenerator$new( # Generates n-gram model. The output is the file def-model.RDS mg$generate_model() -# The test envionment is cleaned up +# The test environment is cleaned up clean_up(ve) ``` @@ -133,7 +133,7 @@ mp <- ModelPredictor$new(mf = mfn) # next words are returned along with their respective probabilities. res <- mp$predict_word(words = "how are", 3) -# The test envionment is cleaned up +# The test environment is cleaned up clean_up(ve) ``` @@ -176,8 +176,7 @@ df <- da$plot_n_gram_stats(opts = list( ![](man/figures/README-analyze-ngrams-1-1.png) ``` r - -# The test envionment is cleaned up +# The test environment is cleaned up clean_up(ve) ``` @@ -207,14 +206,13 @@ df <- da$plot_n_gram_stats(opts = list( ![](man/figures/README-analyze-ngrams-2-1.png) ``` r - -# The test envionment is cleaned up +# The test environment is cleaned up clean_up(ve) ``` The following example shows how to get the list of bi-grams starting with **“great\_”** along with their frequencies. It also shows how to -get the frequency of the bi-gram **“great\_deal”**. +get the frequency of the bi-gram **“great_deal”**. ``` r # The required files @@ -234,18 +232,17 @@ df <- df[order(df$freq, decreasing = T),] # The frequency of the bi-gram "great_deal" f <- as.numeric(df[df$pre == "great_deal", "freq"]) -# The test envionment is cleaned up +# The test environment is cleaned up clean_up(ve) ``` ## Customizing the n-gram model -The **dc\_opts** parameter to the **ModelGenerator** class specifies the +The **dc_opts** parameter to the **ModelGenerator** class specifies the data cleaning options. The following code shows the data cleaning options and their default values: ``` r - # @field dc_opts The options for the data cleaner object. # min_words -> The minimum number of words per sentence. # line_count -> The number of lines to read and clean at a time. @@ -280,12 +277,11 @@ dc_opts = list( ) ``` -The **tg\_opts** parameter to the **ModelGenerator** class specifies the +The **tg_opts** parameter to the **ModelGenerator** class specifies the token generation options. The following code shows the token generation options and their default values: ``` r - # @field tg_opts The options for the token generator obj. # min_freq -> All ngrams with frequency less than min_freq are # ignored. @@ -331,7 +327,7 @@ me <- ModelEvaluator$new(mf = mfn, ve = 2) # a data frame and also saved within the model file itself. stats <- me$evaluate_performance(lc = 20, fn = vfn) -# The test envionment is cleaned up +# The test environment is cleaned up clean_up(ve) ``` @@ -388,7 +384,7 @@ biological sequence analysis, data compression and more. This will require further performance optimization. The source code is organized using R6 classes. It is easy to extend. -Contributions are welcome \!. +Contributions are welcome !. ## Acknowledgments diff --git a/_pkgdown.yml b/_pkgdown.yml index 27c3e94..ffc182b 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -2,3 +2,5 @@ url: https://pakjiddat.github.io/word-predictor title: Word Predictor development: mode: release +template: + bootstrap: 5 diff --git a/cran-comments.md b/cran-comments.md index 8fe83bb..d47f76f 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,14 +1,8 @@ ## Test environments - - local, ubuntu 20.04.2, R 3.6.3 - - github actions, macos-latest, R release - - github actions, windows-latest, R release - - github actions, ubuntu 20.04, R devel - - github actions, ubuntu 20.04, R release - - rhub, debian-clang-devel, R devel + - local, ubuntu 20.04.2, R 4.1.2 + - rhub, ubuntu 20.04.2, R release - rhub, fedora-clang-devel, R devel - - rhub, solaris-x86-patched, R release - - rhub, macos-highsierra-release, R release - winbuilder, windows, R devel ## R CMD check results diff --git a/docs/404.html b/docs/404.html index 2a68018..e948a8c 100644 --- a/docs/404.html +++ b/docs/404.html @@ -1,163 +1,97 @@ - - - - + + + + - - + Page not found (404) • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - -
-
-
+
+ + +
-
- - - - +
- -
- +
+
+ - - diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index 4b2233b..d647ff2 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -1,165 +1,76 @@ - - - - - - - -License • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +License • Word Predictor + Skip to contents + +
-
- - - - -
- +
-
- +
+ - - - + diff --git a/docs/LICENSE.html b/docs/LICENSE.html index 16d34a7..6d65212 100644 --- a/docs/LICENSE.html +++ b/docs/LICENSE.html @@ -1,131 +1,54 @@ - - - - - - - -MIT License • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +MIT License • Word Predictor + Skip to contents + +
-
- +
- +
- - -
-
-
+
+ - - - + diff --git a/docs/articles/features.html b/docs/articles/features.html index 13658dd..922e5ea 100644 --- a/docs/articles/features.html +++ b/docs/articles/features.html @@ -4,115 +4,98 @@ - + + Features • Word Predictor - - - + + + - - + - -
-
-
- + - - - + diff --git a/docs/pkgdown.css b/docs/pkgdown.css index 1273238..80ea5b8 100644 --- a/docs/pkgdown.css +++ b/docs/pkgdown.css @@ -56,8 +56,10 @@ img.icon { float: right; } -img { +/* Ensure in-page images don't run outside their container */ +.contents img { max-width: 100%; + height: auto; } /* Fix bug in bootstrap (only seen in firefox) */ @@ -78,11 +80,10 @@ dd { /* Section anchors ---------------------------------*/ a.anchor { - margin-left: -30px; - display:inline-block; - width: 30px; - height: 30px; - visibility: hidden; + display: none; + margin-left: 5px; + width: 20px; + height: 20px; background-image: url(./link.svg); background-repeat: no-repeat; @@ -90,17 +91,15 @@ a.anchor { background-position: center center; } -.hasAnchor:hover a.anchor { - visibility: visible; -} - -@media (max-width: 767px) { - .hasAnchor:hover a.anchor { - visibility: hidden; - } +h1:hover .anchor, +h2:hover .anchor, +h3:hover .anchor, +h4:hover .anchor, +h5:hover .anchor, +h6:hover .anchor { + display: inline-block; } - /* Fixes for fixed navbar --------------------------*/ .contents h1, .contents h2, .contents h3, .contents h4 { @@ -264,31 +263,26 @@ table { /* Syntax highlighting ---------------------------------------------------- */ -pre { - word-wrap: normal; - word-break: normal; - border: 1px solid #eee; -} - -pre, code { +pre, code, pre code { background-color: #f8f8f8; color: #333; } +pre, pre code { + white-space: pre-wrap; + word-break: break-all; + overflow-wrap: break-word; +} -pre code { - overflow: auto; - word-wrap: normal; - white-space: pre; +pre { + border: 1px solid #eee; } -pre .img { +pre .img, pre .r-plt { margin: 5px 0; } -pre .img img { +pre .img img, pre .r-plt img { background-color: #fff; - display: block; - height: auto; } code a, pre a { @@ -305,9 +299,8 @@ a.sourceLine:hover { .kw {color: #264D66;} /* keyword */ .co {color: #888888;} /* comment */ -.message { color: black; font-weight: bolder;} -.error { color: orange; font-weight: bolder;} -.warning { color: #6A0366; font-weight: bolder;} +.error {font-weight: bolder;} +.warning {font-weight: bolder;} /* Clipboard --------------------------*/ @@ -365,3 +358,27 @@ mark { content: ""; } } + +/* Section anchors --------------------------------- + Added in pandoc 2.11: https://github.com/jgm/pandoc-templates/commit/9904bf71 +*/ + +div.csl-bib-body { } +div.csl-entry { + clear: both; +} +.hanging-indent div.csl-entry { + margin-left:2em; + text-indent:-2em; +} +div.csl-left-margin { + min-width:2em; + float:left; +} +div.csl-right-inline { + margin-left:2em; + padding-left:1em; +} +div.csl-indent { + margin-left: 2em; +} diff --git a/docs/pkgdown.js b/docs/pkgdown.js index 7e7048f..52afcee 100644 --- a/docs/pkgdown.js +++ b/docs/pkgdown.js @@ -2,70 +2,28 @@ (function($) { $(function() { - $('.navbar-fixed-top').headroom(); + $('nav.navbar').headroom(); - $('body').css('padding-top', $('.navbar').height() + 10); - $(window).resize(function(){ - $('body').css('padding-top', $('.navbar').height() + 10); + Toc.init({ + $nav: $("#toc"), + $scope: $("main h2, main h3, main h4, main h5, main h6") }); - $('[data-toggle="tooltip"]').tooltip(); - - var cur_path = paths(location.pathname); - var links = $("#navbar ul li a"); - var max_length = -1; - var pos = -1; - for (var i = 0; i < links.length; i++) { - if (links[i].getAttribute("href") === "#") - continue; - // Ignore external links - if (links[i].host !== location.host) - continue; - - var nav_path = paths(links[i].pathname); - - var length = prefix_length(nav_path, cur_path); - if (length > max_length) { - max_length = length; - pos = i; - } - } - - // Add class to parent
  • , and enclosing
  • if in dropdown - if (pos >= 0) { - var menu_anchor = $(links[pos]); - menu_anchor.parent().addClass("active"); - menu_anchor.closest("li.dropdown").addClass("active"); - } - }); - - function paths(pathname) { - var pieces = pathname.split("/"); - pieces.shift(); // always starts with / - - var end = pieces[pieces.length - 1]; - if (end === "index.html" || end === "") - pieces.pop(); - return(pieces); - } - - // Returns -1 if not found - function prefix_length(needle, haystack) { - if (needle.length > haystack.length) - return(-1); - - // Special case for length-0 haystack, since for loop won't run - if (haystack.length === 0) { - return(needle.length === 0 ? 0 : -1); - } + $('body').scrollspy({ + target: '#toc', + offset: 56 // headroom height + }); - for (var i = 0; i < haystack.length; i++) { - if (needle[i] != haystack[i]) - return(i); - } + // Activate popovers + $('[data-bs-toggle="popover"]').popover({ + container: 'body', + html: true, + trigger: 'focus', + placement: "top", + sanitize: false, + }); - return(haystack.length); - } + $('[data-bs-toggle="tooltip"]').tooltip(); /* Clipboard --------------------------*/ @@ -78,9 +36,9 @@ if(ClipboardJS.isSupported()) { $(document).ready(function() { - var copyButton = ""; + var copyButton = ""; - $(".examples, div.sourceCode").addClass("hasCopyButton"); + $("div.sourceCode").addClass("hasCopyButton"); // Insert copy buttons: $(copyButton).prependTo(".hasCopyButton"); @@ -89,20 +47,108 @@ $('.btn-copy-ex').tooltip({container: 'body'}); // Initialize clipboard: - var clipboardBtnCopies = new ClipboardJS('[data-clipboard-copy]', { + var clipboard = new ClipboardJS('[data-clipboard-copy]', { text: function(trigger) { - return trigger.parentNode.textContent; + return trigger.parentNode.textContent.replace(/\n#>[^\n]*/g, ""); } }); - clipboardBtnCopies.on('success', function(e) { + clipboard.on('success', function(e) { changeTooltipMessage(e.trigger, 'Copied!'); e.clearSelection(); }); - clipboardBtnCopies.on('error', function() { + clipboard.on('error', function() { changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); }); + }); } + + /* Search marking --------------------------*/ + var url = new URL(window.location.href); + var toMark = url.searchParams.get("q"); + var mark = new Mark("div.col-md-9"); + if (toMark) { + mark.mark(toMark, { + accuracy: { + value: "complementary", + limiters: [",", ".", ":", "/"], + } + }); + } + + /* Search --------------------------*/ + /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */ + // Initialise search index on focus + var fuse; + $("#search-input").focus(async function(e) { + if (fuse) { + return; + } + + $(e.target).addClass("loading"); + var response = await fetch($("#search-input").data("search-index")); + var data = await response.json(); + + var options = { + keys: ["what", "text", "code"], + ignoreLocation: true, + threshold: 0.1, + includeMatches: true, + includeScore: true, + }; + fuse = new Fuse(data, options); + + $(e.target).removeClass("loading"); + }); + + // Use algolia autocomplete + var options = { + autoselect: true, + debug: true, + hint: false, + minLength: 2, + }; + var q; +async function searchFuse(query, callback) { + await fuse; + + var items; + if (!fuse) { + items = []; + } else { + q = query; + var results = fuse.search(query, { limit: 20 }); + items = results + .filter((x) => x.score <= 0.75) + .map((x) => x.item); + if (items.length === 0) { + items = [{dir:"Sorry 😿",previous_headings:"",title:"No results found.",what:"No results found.",path:window.location.href}]; + } + } + callback(items); +} + $("#search-input").autocomplete(options, [ + { + name: "content", + source: searchFuse, + templates: { + suggestion: (s) => { + if (s.title == s.what) { + return `${s.dir} >
    ${s.title}
    `; + } else if (s.previous_headings == "") { + return `${s.dir} >
    ${s.title}
    > ${s.what}`; + } else { + return `${s.dir} >
    ${s.title}
    > ${s.previous_headings} > ${s.what}`; + } + }, + }, + }, + ]).on('autocomplete:selected', function(event, s) { + window.location.href = s.path + "?q=" + q + "#" + s.id; + }); + }); })(window.jQuery || window.$) + + diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 84416b2..32745f5 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -1,10 +1,10 @@ -pandoc: 2.3.1 -pkgdown: 1.6.1 +pandoc: 2.14.0.3 +pkgdown: 2.0.1 pkgdown_sha: ~ articles: features: features.html overview: overview.html -last_built: 2021-06-18T13:35Z +last_built: 2022-01-03T10:52Z urls: reference: https://pakjiddat.github.io/word-predictor/reference article: https://pakjiddat.github.io/word-predictor/articles diff --git a/docs/reference/Base.html b/docs/reference/Base.html index e2a4d73..d6dbcd2 100644 --- a/docs/reference/Base.html +++ b/docs/reference/Base.html @@ -1,146 +1,67 @@ - - - - - - - -Base class for all other classes — Base • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Base class for all other classes — Base • Word Predictor + Skip to contents + +
    -
    - + + +
    -
    -

    Site built with pkgdown 1.6.1.

    + -
    -
    +
    + - - - + diff --git a/docs/reference/DataAnalyzer-1.png b/docs/reference/DataAnalyzer-1.png index 1ab0606edb9c7ee7d63a99356dce026975240d2e..fa77c2fd2f6436ab4068e1061dc1f0f98a4c3560 100644 GIT binary patch literal 40683 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/Rzgjs1%Pp5J4Pr=gwJrCrnd5XK7r0%d ze
    5r9MW)c!Y5d4MyFK+TBt-C~3c6C>B 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 literal 38974 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 Q$mP*A_wGp1IDGCu0CUX}CIA2c diff --git a/docs/reference/DataAnalyzer.html b/docs/reference/DataAnalyzer.html index 3516f7e..def1fe6 100644 --- a/docs/reference/DataAnalyzer.html +++ b/docs/reference/DataAnalyzer.html @@ -1,141 +1,66 @@ - - - - - - - -Analyzes input text files and n-gram token files — DataAnalyzer • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +the TokenGenerator class.">Analyzes input text files and n-gram token files — DataAnalyzer • Word Predictor + Skip to contents + +
    -
    -


    +

    Method get_file_info()

    It generates information about text files. It takes as input a file or a directory containing text files. For each file it calculates the total number of lines, maximum, minimum and mean line lengths and the -total file size. The file information is returned as a data frame.

    Usage

    -

    DataAnalyzer$get_file_info(res)

    +total file size. The file information is returned as a data frame.

    +

    Usage

    +

    DataAnalyzer$get_file_info(res)

    +
    + +
    +

    Arguments

    +

    res
    +

    The name of a directory or a file name.

    -

    Arguments

    -

    -
    res

    The name of a directory or a file name.

    -

    -

    Returns

    +

    +
    +
    +

    Returns

    A data frame containing the text file statistics.

    -

    Examples

    -

    # Start of environment setup code
    -# The level of detail in the information messages
    -ve <- 0
    -# The name of the folder that will contain all the files. It will be
    -# created in the current directory. NULL implies tempdir will be used
    -fn <- NULL
    -# The required files. They are default files that are part of the
    -# package
    -rf <- c("test.txt")
    -# An object of class EnvManager is created
    -em <- EnvManager$new(ve = ve, rp = "./")
    -# The required files are downloaded
    -ed <- em$setup_env(rf, fn)
    -# End of environment setup code
    -
    -# The test file name
    -cfn <- paste0(ed, "/test.txt")
    -# The DataAnalyzer object is created
    -da <- DataAnalyzer$new(ve = ve)
    -# The file info is fetched
    -fi <- da$get_file_info(cfn)
    -# The file information is printed
    -print(fi)
    -
    -# The test environment is removed. Comment the below line, so the
    -# files generated by the function can be viewed
    -em$td_env()
    -

    - -


    -

    Method get_ngrams()

    +
    +
    +

    Examples

    +

    # Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("test.txt")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The test file name
    +cfn <- paste0(ed, "/test.txt")
    +# The DataAnalyzer object is created
    +da <- DataAnalyzer$new(ve = ve)
    +# The file info is fetched
    +fi <- da$get_file_info(cfn)
    +# The file information is printed
    +print(fi)
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()

    +
    + + +


    +

    Method get_ngrams()

    It extracts a given number of n-grams and their frequencies from a n-gram token file.

    The prefix parameter specifies the regular expression for matching n-grams. If this parameter is not specified then the given number of -n-grams are randomly chosen.

    Usage

    -

    DataAnalyzer$get_ngrams(fn, c = NULL, pre = NULL)

    - -

    Arguments

    -

    -
    fn

    The n-gram file name.

    - -
    c

    The number of n-grams to return.

    - -
    pre

    The n-gram prefix, given as a regular expression.

    - -

    -

    Examples

    -

    # Start of environment setup code
    -# The level of detail in the information messages
    -ve <- 0
    -# The name of the folder that will contain all the files. It will be
    -# created in the current directory. NULL implies tempdir will be used
    -fn <- NULL
    -# The required files. They are default files that are part of the
    -# package
    -rf <- c("n2.RDS")
    -# An object of class EnvManager is created
    -em <- EnvManager$new(ve = ve, rp = "./")
    -# The required files are downloaded
    -ed <- em$setup_env(rf, fn)
    -# End of environment setup code
    -
    -# The n-gram file name
    -nfn <- paste0(ed, "/n2.RDS")
    -# The DataAnalyzer object is created
    -da <- DataAnalyzer$new(nfn, ve = ve)
    -# Bi-grams starting with "and_" are returned
    -df <- da$get_ngrams(fn = nfn, c = 10, pre = "^and_*")
    -# The data frame is sorted by frequency
    -df <- df[order(df$freq, decreasing = TRUE),]
    -# The data frame is printed
    -print(df)
    -
    -# The test environment is removed. Comment the below line, so the
    -# files generated by the function can be viewed
    -em$td_env()
    -

    - -


    -

    Method clone()

    -

    The objects of this class are cloneable with this method.

    Usage

    -

    DataAnalyzer$clone(deep = FALSE)

    - -

    Arguments

    -

    -
    deep

    Whether to make a deep clone.

    - -

    - - - -

    Examples

    -
    -## ------------------------------------------------ -## Method `DataAnalyzer$plot_n_gram_stats` -## ------------------------------------------------ - -# Start of environment setup code -# The level of detail in the information messages -ve <- 0 -# The name of the folder that will contain all the files. It will be -# created in the current directory. NULL value implies tempdir will -# be used. -fn <- NULL -# The required files. They are default files that are part of the -# package -rf <- c("n2.RDS") -# An object of class EnvManager is created -em <- EnvManager$new(ve = ve, rp = "./") -# The required files are downloaded -ed <- em$setup_env(rf, fn) -
    #> [1] "CITATION" "examples" "extdata"
    # End of environment setup code - -# The n-gram file name -nfn <- paste0(ed, "/n2.RDS") -# The DataAnalyzer object is created -da <- DataAnalyzer$new(nfn, ve = ve) -# The top features plot is checked -df <- da$plot_n_gram_stats(opts = list( - "type" = "top_features", - "n" = 10, - "save_to" = NULL, - "dir" = ed -)) -
    # N-gram statistics are displayed -print(df) -
    #> # A tibble: 10 x 2 -#> pre freq -#> <chr> <dbl> -#> 1 in_the 4 -#> 2 of_the 4 -#> 3 on_the 4 -#> 4 to_the 4 -#> 5 from_the 3 -#> 6 in_a 3 -#> 7 a_thin 2 -#> 8 and_the 2 -#> 9 between_the 2 -#> 10 down_the 2
    # The test environment is removed. Comment the below line, so the -# files generated by the function can be viewed -em$td_env() - -## ------------------------------------------------ -## Method `DataAnalyzer$get_file_info` -## ------------------------------------------------ - -# Start of environment setup code -# The level of detail in the information messages -ve <- 0 -# The name of the folder that will contain all the files. It will be -# created in the current directory. NULL implies tempdir will be used -fn <- NULL -# The required files. They are default files that are part of the -# package -rf <- c("test.txt") -# An object of class EnvManager is created -em <- EnvManager$new(ve = ve, rp = "./") -# The required files are downloaded -ed <- em$setup_env(rf, fn) -
    #> [1] "CITATION" "examples" "extdata"
    # End of environment setup code - -# The test file name -cfn <- paste0(ed, "/test.txt") -# The DataAnalyzer object is created -da <- DataAnalyzer$new(ve = ve) -# The file info is fetched -fi <- da$get_file_info(cfn) -# The file information is printed -print(fi) -
    #> $file_stats -#> fn total_lc max_ll min_ll mean_ll size -#> 1 /tmp/Rtmpgcy76G/test.txt 73 51 28 41 3 Kb -#> -#> $overall_stats -#> total_lc max_ll min_ll mean_ll total_s -#> 1 73 51 28 41 3 Kb -#>
    -# The test environment is removed. Comment the below line, so the -# files generated by the function can be viewed -em$td_env() - -## ------------------------------------------------ -## Method `DataAnalyzer$get_ngrams` -## ------------------------------------------------ - -# Start of environment setup code -# The level of detail in the information messages -ve <- 0 -# The name of the folder that will contain all the files. It will be -# created in the current directory. NULL implies tempdir will be used -fn <- NULL -# The required files. They are default files that are part of the -# package -rf <- c("n2.RDS") -# An object of class EnvManager is created -em <- EnvManager$new(ve = ve, rp = "./") -# The required files are downloaded -ed <- em$setup_env(rf, fn) -
    #> [1] "CITATION" "examples" "extdata"
    # End of environment setup code - -# The n-gram file name -nfn <- paste0(ed, "/n2.RDS") -# The DataAnalyzer object is created -da <- DataAnalyzer$new(nfn, ve = ve) -# Bi-grams starting with "and_" are returned -df <- da$get_ngrams(fn = nfn, c = 10, pre = "^and_*") -# The data frame is sorted by frequency -df <- df[order(df$freq, decreasing = TRUE),] -# The data frame is printed -print(df) -
    #> # A tibble: 15 x 2 -#> pre freq -#> <fct> <dbl> -#> 1 and_the 2 -#> 2 and_cart 1 -#> 3 and_fired 1 -#> 4 and_forget 1 -#> 5 and_leave 1 -#> 6 and_open 1 -#> 7 and_out 1 -#> 8 and_phrase 1 -#> 9 and_say 1 -#> 10 and_tea 1 -#> 11 and_tell 1 -#> 12 and_then 1 -#> 13 and_threw 1 -#> 14 and_was 1 -#> 15 and_watch 1
    -# The test environment is removed. Comment the below line, so the -# files generated by the function can be viewed -em$td_env() -
    -
    - +n-grams are randomly chosen.

    +

    Usage

    +

    DataAnalyzer$get_ngrams(fn, c = NULL, pre = NULL)

    +
    +

    Arguments

    +

    fn
    +

    The n-gram file name.

    + + +
    c
    +

    The number of n-grams to return.

    -
    -

    +
    +

    Examples

    +

    # Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("n2.RDS")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The n-gram file name
    +nfn <- paste0(ed, "/n2.RDS")
    +# The DataAnalyzer object is created
    +da <- DataAnalyzer$new(nfn, ve = ve)
    +# Bi-grams starting with "and_" are returned
    +df <- da$get_ngrams(fn = nfn, c = 10, pre = "^and_*")
    +# The data frame is sorted by frequency
    +df <- df[order(df$freq, decreasing = TRUE),]
    +# The data frame is printed
    +print(df)
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()

    +
    + -
    -

    Site built with pkgdown 1.6.1.

    +


    +

    Method clone()

    +

    The objects of this class are cloneable with this method.

    +

    Usage

    +

    DataAnalyzer$clone(deep = FALSE)

    - -
    +
    +

    Arguments

    +

    deep
    +

    Whether to make a deep clone.

    - + +

    +
    + +
    + +
    + +
    +

    Examples

    +
    
    +## ------------------------------------------------
    +## Method `DataAnalyzer$plot_n_gram_stats`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL value implies tempdir will
    +# be used.
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("n2.RDS")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The n-gram file name
    +nfn <- paste0(ed, "/n2.RDS")
    +# The DataAnalyzer object is created
    +da <- DataAnalyzer$new(nfn, ve = ve)
    +# The top features plot is checked
    +df <- da$plot_n_gram_stats(opts = list(
    +    "type" = "top_features",
    +    "n" = 10,
    +    "save_to" = NULL,
    +    "dir" = ed
    +))
    +
    +# N-gram statistics are displayed
    +print(df)
    +#> # A tibble: 10 × 2
    +#>    pre          freq
    +#>    <chr>       <dbl>
    +#>  1 in_the          4
    +#>  2 of_the          4
    +#>  3 on_the          4
    +#>  4 to_the          4
    +#>  5 from_the        3
    +#>  6 in_a            3
    +#>  7 a_thin          2
    +#>  8 and_the         2
    +#>  9 between_the     2
    +#> 10 down_the        2
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +## ------------------------------------------------
    +## Method `DataAnalyzer$get_file_info`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("test.txt")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The test file name
    +cfn <- paste0(ed, "/test.txt")
    +# The DataAnalyzer object is created
    +da <- DataAnalyzer$new(ve = ve)
    +# The file info is fetched
    +fi <- da$get_file_info(cfn)
    +# The file information is printed
    +print(fi)
    +#> $file_stats
    +#>                         fn total_lc max_ll min_ll mean_ll size
    +#> 1 /tmp/RtmpcJbhpv/test.txt       73     51     28      41 3 Kb
    +#> 
    +#> $overall_stats
    +#>   total_lc max_ll min_ll mean_ll total_s
    +#> 1       73     51     28      41    3 Kb
    +#> 
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +## ------------------------------------------------
    +## Method `DataAnalyzer$get_ngrams`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("n2.RDS")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The n-gram file name
    +nfn <- paste0(ed, "/n2.RDS")
    +# The DataAnalyzer object is created
    +da <- DataAnalyzer$new(nfn, ve = ve)
    +# Bi-grams starting with "and_" are returned
    +df <- da$get_ngrams(fn = nfn, c = 10, pre = "^and_*")
    +# The data frame is sorted by frequency
    +df <- df[order(df$freq, decreasing = TRUE),]
    +# The data frame is printed
    +print(df)
    +#> # A tibble: 15 × 2
    +#>    pre         freq
    +#>    <fct>      <dbl>
    +#>  1 and_the        2
    +#>  2 and_cart       1
    +#>  3 and_fired      1
    +#>  4 and_forget     1
    +#>  5 and_leave      1
    +#>  6 and_open       1
    +#>  7 and_out        1
    +#>  8 and_phrase     1
    +#>  9 and_say        1
    +#> 10 and_tea        1
    +#> 11 and_tell       1
    +#> 12 and_then       1
    +#> 13 and_threw      1
    +#> 14 and_was        1
    +#> 15 and_watch      1
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +
    +
    - - +
    + + + +
    + + + + + diff --git a/docs/reference/DataCleaner.html b/docs/reference/DataCleaner.html index 7898ad8..fb67b23 100644 --- a/docs/reference/DataCleaner.html +++ b/docs/reference/DataCleaner.html @@ -1,182 +1,102 @@ - - - - - - - -Provides data cleaning functionality — DataCleaner • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Provides data cleaning functionality — DataCleaner • Word Predictor + Skip to contents + +
    -
    - + +
    + +
    +

    Examples

    +
    
    +## ------------------------------------------------
    +## Method `DataCleaner$clean_file`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("test.txt")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The cleaned test file name
    +cfn <- paste0(ed, "/test-clean.txt")
    +# The test file name
    +fn <- paste0(ed, "/test.txt")
    +# The data cleaning options
    +dc_opts <- list("output_file" = cfn)
    +# The data cleaner object is created
    +dc <- DataCleaner$new(fn, dc_opts, ve = ve)
    +# The sample file is cleaned
    +dc$clean_file()
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +## ------------------------------------------------
    +## Method `DataCleaner$clean_lines`
    +## ------------------------------------------------
    +
    +# The level of detail in the information messages
    +ve <- 0
    +# Test data is read
    +l <- c(
    +    "If you think I'm wrong, send me a link to where it's happened",
    +    "We're about 90percent done with this room",
    +    "This isn't how I wanted it between us.",
    +    "Almost any cute breed can become ornamental",
    +    "Once upon a time there was a kingdom with a castle",
    +    "That's not a thing any of us are granted'",
    +    "Why are you being so difficult? she asks."
    +)
    +# The expected results
    +res <- c(
    +    "if you think wrong send me a link to where its happened",
    +    "were about percent done with this room",
    +    "this how i wanted it between us",
    +    "almost any cute breed can become ornamental",
    +    "once upon a time there was a kingdom with a castle",
    +    "thats not a thing any of us are granted",
    +    "why are you being so difficult she asks"
    +)
    +# The DataCleaner object is created
    +dc <- DataCleaner$new(ve = ve)
    +# The line is cleaned
    +cl <- dc$clean_lines(l)
    +# The cleaned lines are printed
    +print(cl)
    +#> [1] "if you think wrong send me a link to where its happened"
    +#> [2] "were about percent done with this room"                 
    +#> [3] "this how i wanted it between us"                        
    +#> [4] "almost any cute breed can become ornamental"            
    +#> [5] "once upon a time there was a kingdom with a castle"     
    +#> [6] "thats not a thing any of us are granted"                
    +#> [7] "why are you being so difficult she asks"                
    +
    +
    +
    - +
    + + - - +
    + + + + + diff --git a/docs/reference/DataSampler.html b/docs/reference/DataSampler.html index 465f41e..d720aba 100644 --- a/docs/reference/DataSampler.html +++ b/docs/reference/DataSampler.html @@ -1,141 +1,66 @@ - - - - - - - -Generates data samples from text files — DataSampler • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +be cleaned or randomized.">Generates data samples from text files — DataSampler • Word Predictor + Skip to contents + +
    -
    - - +
    +
    +

    Examples

    +
    
    +## ------------------------------------------------
    +## Method `DataSampler$generate_sample`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("input.txt")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The sample file name
    +sfn <- paste0(ed, "/sample.txt")
    +# An object of class DataSampler is created
    +ds <- DataSampler$new(dir = ed, ve = ve)
    +# The sample file is generated
    +ds$generate_sample(
    +    fn = "input.txt",
    +    ss = 0.5,
    +    ic = FALSE,
    +    ir = FALSE,
    +    ofn = "sample.txt",
    +    is = TRUE
    +)
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +## ------------------------------------------------
    +## Method `DataSampler$generate_data`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be
    +# used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("input.txt")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve)
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The files to clean
    +fns <- c("train", "test", "validate")
    +# An object of class DataSampler is created
    +ds <- DataSampler$new(dir = ed, ve = ve)
    +# The train, test and validation files are generated
    +ds$generate_data(
    +    fn = "input.txt",
    +    percs = list(
    +        "train" = 0.8,
    +        "test" = 0.1,
    +        "validate" = 0.1
    +    )
    +)
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +
    +
    + + +
    + + + +
    - - + + + + diff --git a/docs/reference/EnvManager.html b/docs/reference/EnvManager.html index e1aa57a..047ca3f 100644 --- a/docs/reference/EnvManager.html +++ b/docs/reference/EnvManager.html @@ -1,282 +1,241 @@ - - - - - - - -Allows managing the test environment — EnvManager • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +inst/extdata folder.">Allows managing the test environment — EnvManager • Word Predictor + Skip to contents + +
    -
    - -
    - + + +
    -
    -

    Site built with pkgdown 1.6.1.

    + -
    -
    +
    + - - - + diff --git a/docs/reference/Model.html b/docs/reference/Model.html index 844c301..1d12c36 100644 --- a/docs/reference/Model.html +++ b/docs/reference/Model.html @@ -1,140 +1,64 @@ - - - - - - - -Represents n-gram models — Model • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +model.">Represents n-gram models — Model • Word Predictor + Skip to contents + +
    -
    - -
    - + + +
    -
    -

    Site built with pkgdown 1.6.1.

    + -
    -
    +
    + - - - + diff --git a/docs/reference/ModelEvaluator-1.png b/docs/reference/ModelEvaluator-1.png index e7b6c05fe251da91a6e537cf60b073d63f75049f..dd7b659db0a299b2bd8d9184ad4e6c281bd3b278 100644 GIT binary patch literal 83093 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 v+dVRvb;x}fn+ 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 F{{WEUYgGUM literal 82987 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⪼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 z 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 diff --git a/docs/reference/ModelEvaluator.html b/docs/reference/ModelEvaluator.html index 53fcb20..2fe32b8 100644 --- a/docs/reference/ModelEvaluator.html +++ b/docs/reference/ModelEvaluator.html @@ -1,142 +1,68 @@ - - - - - - - -Evaluates performance of n-gram models — ModelEvaluator • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +predictions.">Evaluates performance of n-gram models — ModelEvaluator • Word Predictor + Skip to contents + +
    -
    -


    +

    Method extrinsic_evaluation()

    Evaluates the model using extrinsic evaluation based on Accuracy. The given number of sentences are taken from the validation file.

    For each sentence, the model is used to predict the next word. The accuracy stats are returned. A prediction is considered to be -correct if one of the predicted words matches the actual word.

    Usage

    -

    ModelEvaluator$extrinsic_evaluation(lc, fn)

    +correct if one of the predicted words matches the actual word.

    +

    Usage

    +

    ModelEvaluator$extrinsic_evaluation(lc, fn)

    +
    -

    Arguments

    -

    -
    lc

    The number of lines of text in the validation file to be +

    +

    Arguments

    +

    lc
    +

    The number of lines of text in the validation file to be used for the evaluation.

    -
    fn

    The name of the validation file.

    -

    -

    Returns

    +
    fn
    +

    The name of the validation file.

    + + +

    +
    +
    +

    Returns

    The number of correct and incorrect predictions.

    -

    Examples

    -

    # Start of environment setup code
    -# The level of detail in the information messages
    -ve <- 0
    -# The name of the folder that will contain all the files. It will be
    -# created in the current directory. NULL implies tempdir will be used
    -fn <- NULL
    -# The required files. They are default files that are part of the
    -# package
    -rf <- c("def-model.RDS", "validate-clean.txt")
    -# An object of class EnvManager is created
    -em <- EnvManager$new(ve = ve, rp = "./")
    -# The required files are downloaded
    -ed <- em$setup_env(rf, fn)
    -# End of environment setup code
    -
    -# The model file name
    -mfn <- paste0(ed, "/def-model.RDS")
    -# The validation file name
    -vfn <- paste0(ed, "/validate-clean.txt")
    -
    -# ModelEvaluator class object is created
    -me <- ModelEvaluator$new(mf = mfn, ve = ve)
    -# The intrinsic evaluation is performed
    -stats <- me$extrinsic_evaluation(lc = 100, fn = vfn)
    -# The evaluation stats are printed
    -print(stats)
    -
    -# The test environment is removed. Comment the below line, so the
    -# files generated by the function can be viewed
    -em$td_env()
    -

    - -


    -

    Method clone()

    -

    The objects of this class are cloneable with this method.

    Usage

    -

    ModelEvaluator$clone(deep = FALSE)

    - -

    Arguments

    -

    -
    deep

    Whether to make a deep clone.

    - -

    - - - -

    Examples

    -
    -## ------------------------------------------------ -## Method `ModelEvaluator$compare_performance` -## ------------------------------------------------ - -# Start of environment setup code -# The level of detail in the information messages -ve <- 0 -# The name of the folder that will contain all the files. It will be -# created in the current directory. NULL implies tempdir will be -# used. -fn <- NULL -# The required files. They are default files that are part of the -# package -rf <- c("def-model.RDS") -# An object of class EnvManager is created -em <- EnvManager$new(ve = ve, rp = "./") -# The required files are downloaded -ed <- em$setup_env(rf, fn) -
    #> [1] "CITATION" "examples" "extdata"
    # End of environment setup code -# ModelEvaluator class object is created -me <- ModelEvaluator$new(ve = ve) -# The performance evaluation is performed -me$compare_performance(opts = list( - "save_to" = NULL, - "dir" = ed -)) -
    -# The test environment is removed. Comment the below line, so the -# files generated by the function can be viewed -em$td_env() - -## ------------------------------------------------ -## Method `ModelEvaluator$evaluate_performance` -## ------------------------------------------------ - -# Start of environment setup code -# The level of detail in the information messages -ve <- 0 -# The name of the folder that will contain all the files. It will be -# created in the current directory. NULL implies tempdir will be used -fn <- NULL -# The required files. They are default files that are part of the -# package -rf <- c("def-model.RDS", "validate-clean.txt") -# An object of class EnvManager is created -em <- EnvManager$new(ve = ve, rp = "./") -# The required files are downloaded -ed <- em$setup_env(rf, fn) -
    #> [1] "CITATION" "examples" "extdata"
    # End of environment setup code - -# The model file name -mfn <- paste0(ed, "/def-model.RDS") -# The validation file name -vfn <- paste0(ed, "/validate-clean.txt") - -# ModelEvaluator class object is created -me <- ModelEvaluator$new(mf = mfn, ve = ve) -# The performance evaluation is performed -stats <- me$evaluate_performance(lc = 20, fn = vfn) -# The evaluation stats are printed -print(stats) -
    #> $m -#> [1] 279320 -#> -#> $t -#> [1] 0.747 -#> -#> $p -#> [1] 2297.35 -#> -#> $a -#> [1] 0 -#>
    -# The test environment is removed. Comment the below line, so the -# files generated by the function can be viewed -em$td_env() - -## ------------------------------------------------ -## Method `ModelEvaluator$intrinsic_evaluation` -## ------------------------------------------------ - -# Start of environment setup code -# The level of detail in the information messages -ve <- 0 -# The name of the folder that will contain all the files. It will be -# created in the current directory. NULL implies tempdir will be used -fn <- NULL -# The required files. They are default files that are part of the -# package -rf <- c("def-model.RDS", "validate-clean.txt") -# An object of class EnvManager is created -em <- EnvManager$new(ve = ve, rp = "./") -# The required files are downloaded -ed <- em$setup_env(rf, fn) -
    #> [1] "CITATION" "examples" "extdata"
    # End of environment setup code - -# The model file name -mfn <- paste0(ed, "/def-model.RDS") -# The validation file name -vfn <- paste0(ed, "/validate-clean.txt") - -# ModelEvaluator class object is created -me <- ModelEvaluator$new(mf = mfn, ve = ve) -# The intrinsic evaluation is performed -stats <- me$intrinsic_evaluation(lc = 20, fn = vfn) -# The evaluation stats are printed -print(stats) -
    #> $min -#> [1] 282 -#> -#> $max -#> [1] 8248 -#> -#> $mean -#> [1] 2297.35 -#>
    -# The test environment is removed. Comment the below line, so the -# files generated by the function can be viewed -em$td_env() - -## ------------------------------------------------ -## Method `ModelEvaluator$extrinsic_evaluation` -## ------------------------------------------------ - -# Start of environment setup code -# The level of detail in the information messages -ve <- 0 -# The name of the folder that will contain all the files. It will be -# created in the current directory. NULL implies tempdir will be used -fn <- NULL -# The required files. They are default files that are part of the -# package -rf <- c("def-model.RDS", "validate-clean.txt") -# An object of class EnvManager is created -em <- EnvManager$new(ve = ve, rp = "./") -# The required files are downloaded -ed <- em$setup_env(rf, fn) -
    #> [1] "CITATION" "examples" "extdata"
    # End of environment setup code - -# The model file name -mfn <- paste0(ed, "/def-model.RDS") -# The validation file name -vfn <- paste0(ed, "/validate-clean.txt") - -# ModelEvaluator class object is created -me <- ModelEvaluator$new(mf = mfn, ve = ve) -# The intrinsic evaluation is performed -stats <- me$extrinsic_evaluation(lc = 100, fn = vfn) -# The evaluation stats are printed -print(stats) -
    #> $valid -#> [1] 1 -#> -#> $invalid -#> [1] 74 -#> -#> $valid_perc -#> [1] 1.333333 -#> -#> $invalid_perc -#> [1] 98.66667 -#>
    -# The test environment is removed. Comment the below line, so the -# files generated by the function can be viewed -em$td_env() -
    -
    - +
    +
    +

    Examples

    +

    # Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("def-model.RDS", "validate-clean.txt")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The model file name
    +mfn <- paste0(ed, "/def-model.RDS")
    +# The validation file name
    +vfn <- paste0(ed, "/validate-clean.txt")
    +
    +# ModelEvaluator class object is created
    +me <- ModelEvaluator$new(mf = mfn, ve = ve)
    +# The intrinsic evaluation is performed
    +stats <- me$extrinsic_evaluation(lc = 100, fn = vfn)
    +# The evaluation stats are printed
    +print(stats)
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()

    -
    -


    +

    Method clone()

    +

    The objects of this class are cloneable with this method.

    +

    Usage

    +

    ModelEvaluator$clone(deep = FALSE)

    -
    -

    Site built with pkgdown 1.6.1.

    +
    +

    Arguments

    +

    deep
    +

    Whether to make a deep clone.

    + + +

    -
    -
    +
    - +
    + +
    +

    Examples

    +
    
    +## ------------------------------------------------
    +## Method `ModelEvaluator$compare_performance`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be
    +# used.
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("def-model.RDS")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +# ModelEvaluator class object is created
    +me <- ModelEvaluator$new(ve = ve)
    +# The performance evaluation is performed
    +me$compare_performance(opts = list(
    +    "save_to" = NULL,
    +    "dir" = ed
    +))
    +
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +## ------------------------------------------------
    +## Method `ModelEvaluator$evaluate_performance`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("def-model.RDS", "validate-clean.txt")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The model file name
    +mfn <- paste0(ed, "/def-model.RDS")
    +# The validation file name
    +vfn <- paste0(ed, "/validate-clean.txt")
    +
    +# ModelEvaluator class object is created
    +me <- ModelEvaluator$new(mf = mfn, ve = ve)
    +# The performance evaluation is performed
    +stats <- me$evaluate_performance(lc = 20, fn = vfn)
    +# The evaluation stats are printed
    +print(stats)
    +#> $m
    +#> [1] 279320
    +#> 
    +#> $t
    +#> [1] 1.018
    +#> 
    +#> $p
    +#> [1] 2297.35
    +#> 
    +#> $a
    +#> [1] 0
    +#> 
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +## ------------------------------------------------
    +## Method `ModelEvaluator$intrinsic_evaluation`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("def-model.RDS", "validate-clean.txt")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The model file name
    +mfn <- paste0(ed, "/def-model.RDS")
    +# The validation file name
    +vfn <- paste0(ed, "/validate-clean.txt")
    +
    +# ModelEvaluator class object is created
    +me <- ModelEvaluator$new(mf = mfn, ve = ve)
    +# The intrinsic evaluation is performed
    +stats <- me$intrinsic_evaluation(lc = 20, fn = vfn)
    +# The evaluation stats are printed
    +print(stats)
    +#> $min
    +#> [1] 282
    +#> 
    +#> $max
    +#> [1] 8248
    +#> 
    +#> $mean
    +#> [1] 2297.35
    +#> 
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +## ------------------------------------------------
    +## Method `ModelEvaluator$extrinsic_evaluation`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("def-model.RDS", "validate-clean.txt")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The model file name
    +mfn <- paste0(ed, "/def-model.RDS")
    +# The validation file name
    +vfn <- paste0(ed, "/validate-clean.txt")
    +
    +# ModelEvaluator class object is created
    +me <- ModelEvaluator$new(mf = mfn, ve = ve)
    +# The intrinsic evaluation is performed
    +stats <- me$extrinsic_evaluation(lc = 100, fn = vfn)
    +# The evaluation stats are printed
    +print(stats)
    +#> $valid
    +#> [1] 1
    +#> 
    +#> $invalid
    +#> [1] 74
    +#> 
    +#> $valid_perc
    +#> [1] 1.333333
    +#> 
    +#> $invalid_perc
    +#> [1] 98.66667
    +#> 
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +
    +
    + + +
    + + +
  • - - + + + + diff --git a/docs/reference/ModelGenerator.html b/docs/reference/ModelGenerator.html index 6d33efc..a5ca4fe 100644 --- a/docs/reference/ModelGenerator.html +++ b/docs/reference/ModelGenerator.html @@ -1,334 +1,280 @@ - - - - - - - -Generates n-gram models from a text file — ModelGenerator • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Generates n-gram models from a text file — ModelGenerator • Word Predictor + Skip to contents + +
    -
    - +
    +

    Examples

    +
    
    +## ------------------------------------------------
    +## Method `ModelGenerator$generate_model`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("input.txt")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# ModelGenerator class object is created
    +mg <- ModelGenerator$new(
    +    name = "default-model",
    +    desc = "1 MB size and default options",
    +    fn = "def-model.RDS",
    +    df = "input.txt",
    +    n = 4,
    +    ssize = 0.99,
    +    dir = ed,
    +    dc_opts = list(),
    +    tg_opts = list(),
    +    ve = ve
    +)
    +# The n-gram model is generated
    +mg$generate_model()
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +
    +
    - - +
    + + + +
    + + + + + + diff --git a/docs/reference/ModelPredictor.html b/docs/reference/ModelPredictor.html index 2a7c651..0597c8f 100644 --- a/docs/reference/ModelPredictor.html +++ b/docs/reference/ModelPredictor.html @@ -1,140 +1,64 @@ - - - - - - - -Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +the probability of a given word and set of previous words.">Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor • Word Predictor + Skip to contents + +
    -
    - +
    - +
    +
    +

    Examples

    +
    
    +## ------------------------------------------------
    +## Method `ModelPredictor$calc_perplexity`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("def-model.RDS")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The model file name
    +mfn <- paste0(ed, "/def-model.RDS")
    +# ModelPredictor class object is created
    +mp <- ModelPredictor$new(mf = mfn, ve = ve)
    +# The sentence whoose Perplexity is to be calculated
    +l <- "last year at this time i was preparing for a trip to rome"
    +# The line is split in to words
    +w <- strsplit(l, " ")[[1]]
    +# The Perplexity of the sentence is calculated
    +p <- mp$calc_perplexity(w)
    +# The sentence Perplexity is printed
    +print(p)
    +#> [1] 1767
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +## ------------------------------------------------
    +## Method `ModelPredictor$predict_word`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("def-model.RDS")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, "rp" = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The model file name
    +mfn <- paste0(ed, "/def-model.RDS")
    +# ModelPredictor class object is created
    +mp <- ModelPredictor$new(mf = mfn, ve = ve)
    +# The next word is predicted
    +nws <- mp$predict_word("today is", count = 10)
    +# The predicted next words are printed
    +print(nws)
    +#> $found
    +#> [1] TRUE
    +#> 
    +#> $words
    +#>  [1] "a"      "the"    "used"   "better" "hard"   "rare"   "to"     "best"  
    +#>  [9] "carved" "dry"   
    +#> 
    +#> $probs
    +#>  [1] 0.17460317 0.11111111 0.06349206 0.03174603 0.03174603 0.03174603
    +#>  [7] 0.03174603 0.01587302 0.01587302 0.01587302
    +#> 
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +## ------------------------------------------------
    +## Method `ModelPredictor$get_word_prob`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("def-model.RDS")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, "rp" = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The model file name
    +mfn <- paste0(ed, "/def-model.RDS")
    +# ModelPredictor class object is created
    +mp <- ModelPredictor$new(mf = mfn, ve = ve)
    +# The probability that the next word is "you" given the prev words
    +# "how" and "are"
    +prob <- mp$get_word_prob(word = "you", pw = c("how", "are"))
    +# The probability is printed
    +print(prob)
    +#> [1] 0.0024581
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +
    +
    + + +
    + + + +
    - - + + + + diff --git a/docs/reference/TPGenerator.html b/docs/reference/TPGenerator.html index 8ac169b..377ef94 100644 --- a/docs/reference/TPGenerator.html +++ b/docs/reference/TPGenerator.html @@ -1,140 +1,64 @@ - - - - - - - -Generates transition probabilities for n-grams — TPGenerator • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +combined transition probabilities data can be used to implement back-off.">Generates transition probabilities for n-grams — TPGenerator • Word Predictor + Skip to contents + +
    -
    - + +
    + +
    +

    Examples

    +
    
    +## ------------------------------------------------
    +## Method `TPGenerator$generate_tp`
    +## ------------------------------------------------
    +
    +# Start of environment setup code
    +# The level of detail in the information messages
    +ve <- 0
    +# The name of the folder that will contain all the files. It will be
    +# created in the current directory. NULL implies tempdir will be used
    +fn <- NULL
    +# The required files. They are default files that are part of the
    +# package
    +rf <- c("n1.RDS", "n2.RDS", "n3.RDS", "n4.RDS")
    +# An object of class EnvManager is created
    +em <- EnvManager$new(ve = ve, rp = "./")
    +# The required files are downloaded
    +ed <- em$setup_env(rf, fn)
    +# End of environment setup code
    +
    +# The list of output files
    +fns <- c("words", "model-4", "tp2", "tp3", "tp4")
    +
    +# The TPGenerator object is created
    +tp <- TPGenerator$new(opts = list(n = 4, dir = ed), ve = ve)
    +# The combined transition probabilities are generated
    +tp$generate_tp()
    +
    +# The test environment is removed. Comment the below line, so the
    +# files generated by the function can be viewed
    +em$td_env()
    +
    +
    +
    - +
    + + - - +
    + + + + + diff --git a/docs/reference/TokenGenerator.html b/docs/reference/TokenGenerator.html index 0e4b107..b82e38b 100644 --- a/docs/reference/TokenGenerator.html +++ b/docs/reference/TokenGenerator.html @@ -1,306 +1,236 @@ - - - - - - - -Generates n-grams from text files — TokenGenerator • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Generates n-grams from text files — TokenGenerator • Word Predictor + Skip to contents + +
    -
    - - - +
    + + + +
    + + + + + diff --git a/docs/reference/figures/README-analyze-ngrams-1-1.png b/docs/reference/figures/README-analyze-ngrams-1-1.png index d777f9b516c7ab7a428d69aead8ac686c370e70d..d96ff1123814a1abc7e6d398b581d469934f67d6 100644 GIT binary patch delta 5448 zcmbVQXH-+$w%(i26^Qgsj!KbUq_=qJpn`xP2qL}9l_Cg)L`4As=}lTh2nj_GO+?xe zqy?md3MPtxG$Hh+z}w;6`_3J2oL}!p#>iT8?lsr?=C|fI_fApxtdMMzVy6N-efo4t zk}#93tgM`zoV>hzN`pF+p`oFXk&&^namt}9%-7d9%^8%3p-`x_6fl6RxVX5aqy&e< zm6n#`@puA(P*zq}!$m^_qN@fx1pokG`j@d?5CE{YQ-5Gr0NxD%xYAAZFIb1=EtBrv zpkh-gM+6Svy>TU8ENS6rN>yMr%PUi z&%3HK6Q8Yt2CRt)eb?l=lycqiU#qH83UJs25z9KRYIn6mF;Z1=$1&laO?LcbBhU; zy$O0723FK3CN6EWWk4^R6#v~hHfyKi+79N|Jr z&8TQ|t~&JD969ISbQp{37~SU=`-M!lVPNy%3yj3|y&o}2CyW7nUQj09zyKU<6*m4g zyGn^8rni>9GL4+augxY+)VF>)6=y0otbNJ?8Cv{fNtY@ zHah7?I5LA6KOx?_A{?AI-tx+kXP|MaYjI;F-n8}Vz(G;_&SppKotTyrw4;sF#g3pR zIZJJ2R+yMOyyDg*Dr7;D*%@U=Vf(DWx`W5_x!dNuJF7GrB^Bd33n96b*KuaG%=5Y{ zA!vfFaomI0HzXXHXmw{v&Kbm{YcI-tdE%Mgu^8kyH+Po&e%Dk3JCGhSu^e$^MR(q~ zQTa_}SA7i6U<^@ULOhA|RkMGx6D{@9r;x4b3ErkLJY4T?sRDL#OyE#xpe`J1Ow5n} zPz;+W6CAz8)_jBRylvywm&fhY6>htu6SqwUoEU^l>&&x84V#-Ih|lZm*}+Ajrs*H! zm5tg*ggi~&Bol_(juT#C;#?M)cYI6M>jK#1uWs^(+XB~@=bH}2m27n~5?3S=0@MpcXPX zxLzvLYVVKo3>7oVCbZG)!eIi*QEuGyb;Oz-=aEWFMNg}(|7}sOlwU8Od3cB*B_u(( z3zq@1&g{t}GLxOwFJ1OiX}S#jS{wKAmbJ?I$~^W_eRO4vt|b%lPxcD(Qf(xkDVj)S zSQ2iQuZ^Dr_TK{C0ssj26$NMzY1Vv| zk_WnU6|5xb&j`X9y%dMU?Kbz5nS2&;#E_+Np)yWdq{6Vl+XtZvE*SC+gUzjM49kQ; zEwfkdo96Fku9`R6T-21D+AOs_3ncF}Z`%J!FEse+H-nJgESh8%#SNY~rOx4qg?4UR z2ERe@3VFU({W4H}VfWH`7g1QUt2-(e?1nv>;!7hla-(}`+9IagotP+z3=lv7EwUm5 zVElko-~fKJ0iv%#@Y5k|r*m1RwJ0 z8$AG&v-__UWMpjJszU&eQ+ysK2@53aWIk6wT%7yEPOLe4!Bw3ffa3miA2)XOxn3> zp&2MDxx*vpJlViZWR3kK{%u&+{wh0nd(JL9E-8$OK6*`7rB@%hADaarc_}WfeZS82 zX@2Wqqpryt#gTZ;xrz3K%R|q!DMk(|5v5NsQWDwFqD`v8m}^oX9H_FPK{&uVF8*@@ zsM!#s(J1(I6NU@=D9-_28Lp(3r16jvh1EBR)tB(w`qZE2t=Wvk+bn;-n*9NwY+ z7U`Mk1%UI6Bd1mv&lv`MVLU5(fR%RiriRgNOH0cqtMguHSBnjH?K_?NRg3@;p}|kf zIHK;C*(2wi2smrRyia9@#y_(DqQGjd*E{ABb-0uk>>tVEZifsDh}@N$YF-20*)w4P zYBHwyWBH(rNI@6U2BI6fqJjaxnV}xsM~75Modr-M4QaoV-f)5zes1c>q?30 zff6d!g4lAMBHAKS9Kb1H$2!RJQyDpVix&H_I}kG*ktsH~Hd(-AZv0$b2yhF`gjtW* zBnJAIiwNrfy*m}d0ebOLe1YOOKE#owL9d;6VAxJ~; zU|?J((yaMP#Ol|#0Yq95UT!+Hb6!8hSJy*OU$+5&Xj)5x-3_&ku`JRyc2r18dClCVeQQWpI?aUhugD*Ss0dTmH1h zL-BCz4({qO8s{*rG!!odR8>zX!)pvNuiWku3++xIaqjBK7T?KkAW+u0u*KCF1adNF zfwdcLzn|4m0$d=g6CU;I5O?*W>VLj$k?%5juu38Lgv3&eQj#M^;EP%qMN3Gq*tqQhSVKbxnp}Wt9*W zd2VbFsZokl7v6N54NeviIW*;t4EUvu>jn`)Hq{8kLCOjcTuK|UY!|NuJGrnS&-j7Ax8oEjC{qZnToLy?|}V5(J^Z^ z^n$s!l5U>bB5Jxf$V!aIqk_MLWkF5x*37UO;AWo*8|?$FPA zigW%9%QdGluT>EAQ`gss{a;&g{iI z^gTo0DY2yOioV>@gED$rnng+xI;qBMPOIqtTPl;dzTH+-e;fS7gEiX{yd-Ad7}u?i zJtXy+ZCixE5nH{5ZbM6YVt7JsS?Kb_)vu6FRLDMVDgCYN#B{b~8M~jqnuyn}no=_Y zX0&{!-u4tq+wi29sW#SsQCQiDf6_qi1@Mk&{{cw^i#S^Sb+Ah2Twl8GAk-L}OlT0qWR!!m`cM;|QWbww zg8_Ibc?+ogY`huuNGE6dtMpE{0mF8a^~V8&7}Sw{(@l-8hV=Awhb#p8I!$2wig&D* zv*7e;JE?|;Qe%%`UWZXdX?*)`Ps-jtta&y2;^VXC#yu}MmVQJ%PhDO8E)U%&c8kjS zf=At4oeE>tXS_@J*G!$YVT8a}p1f)5isOC~eR&q2c`Y2w=l(Ri#vvqdw7l>1k6=mV*i{)yRE}CbjUcZ>_9j%(XUh8R$mT+rnbMfys^L8&G*S;$=&5 z1ZA?7!}jl@h@GF)d))e_cMS_0rw%M2CBFwIiwwFNIhK1aSgF){B3y-IbVBuxAmzD0 zwFDQHS!ab3AJKPbcRd>*4eCbc^{*XdE4ZpSvAdZeWzj?0EGe1^u8VltGO4liu;lH| zZLoxVPJsVEE5QS)$sxYLjCvxvriCf#iTm+hsK293iT1J0S4HlWJ={-c2`!6BxGT8- zndJadL0URw6mmnX^u44K&aaQxtW%5Cb>-2{UzYFGYB&rtfSQO^I^@4c2w?qh9{w#y z(3>FU8knq)}R2t-!Fg5xyg)|?G&&F9{;)W z84UM*_h%pb7l*7%dWAPAFsL1H*3w_2?;bkxBem5hG{_$FlXLUrDAaT)iHnOvA%O7)a~K-j6oHCdT+WWc{?JzckE90>NC z*;^z;LCwnW`Zt#3pbPt(LVC>5Mg?L@0ye<5uq=7uqA(cezo`dr3*-5Ja?fQ(?A;BPWE>*u&cwMSJWCkISN$jA)Z}@MnPJ(DO0$-I`4g@M`DIoihpxt`+f9`i9bV zE!8+U!;>6}wumV}LoUYXIi-f)-d#%fVSDRfKmDhaNp1czZ$cWbeaK26^FOi<`k zfS2hRpH)hD2710J%B!QJQl|Ox~(_pA7B>V1GEqX`HRLq81_A3v55;wPz%N2Dk zX`7mpQv8x!m1=)EoWm)BA8U?dZ`QRUT5kLl>ji7Y(dIHNX5K5FhJ4s%Xll;Ve*2+ID70&{5LN0l{eKqtzeo@(_( z=NtgO5c3NYdFmJqt~Z zmObM8zn|OiH~;v#ge0fRo*%Kkc)cLhT?;R)I`;x!5H$lmn=!GJJi%lcReyMLEBs$y zj2>uYjsN)kP?_(}F;qG{s;u zz$C{g7<=hlO8JOXL)@&s<^d*QIUTzaY`M2yXqySI6qwrkWKRs(3aO=Bh=xMWMlelY z*nFCb#q||TTqjwK5E;5ZUS`sala+Alr+nA`{>jK||KN&d5IT(p@`i1KLz5rE1Cr3j z2hU&C@eF#J=2YdgZ;!*C1{Lm%p#1aeWwRn%a12NpDfnQIO;?;C>50ryRhn1UHaqT? z!^?EONfu+>ZG;g$YDmh;?+42U0VC7E4W(-uxYq{>QiBu_IWUK(mQjQve3~!U>odT-JZ_ I`_23R1MR2N;{X5v delta 5312 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 diff --git a/docs/reference/figures/README-analyze-ngrams-2-1.png b/docs/reference/figures/README-analyze-ngrams-2-1.png index 805ae2af86020361dc2b595f4af08fdebe9c9538..2b2c116785466c10b92089863f16589426a3075b 100644 GIT binary patch literal 6506 zcmb_gcT|(xmj9B_lqyv~AXJeeN(V(E9TfdXY{*2<3t( zy(vX%lrB{ugbwpX?##Qh-kVwP&YC}xwa)p@+2`!vZohp(k-D0+Cpk_606?p)rDgyC zPy_%#&{QyR#$8QZ8~|Vd@`j;0ID|kTP$(1zgOQPuk&}~CP*6}(Qc_V-oj7sga5yh7FCQNtKR>^KfPkQ&ppcNz*|TTQojWHYA|fg(Dkdf-E-rrl z{CNopi3=AlT)cQuQc_Y%N=jNIrAwDDUsh65x^m@; zva&J)fw+40s)~w=s;a7*nwq-0x`u{^rlzKrmX@}*_O)x*u3x`?E-3+?d|>O(IX!ppU00M`}+DmdGf^1&(GiAKOi6gjYbCs20nfI z^x3m#&!0aJ3JQAh;ze+9a7ailoS6%|-4 zwz9Ias;cV4hY!`&)ipIWI2^9FwzjUWuD-s$p`qcAKmKTJY;0<3`uOo(|=a+WPwX#>NJLK-k>eBoc{RTU*=P+dDfu zySux4dwcu)`v(UHhlhtp0C044gi)z*G6aR?hDcPt2zgVF#6B%fWR~He$&A?!d6yd-&Z54N zKB;7y8^U+5PX)rn7l?+67)FHfWqyu9yzH9r_B!ykEl-fbDe#uhiQ#NF_O3)H3|n<~ zi}|Ofvxg@ zdVDSRdZ+!{Jv8sSAaSDhh$zSd{|vqJD>cPko}6k#Dr`YI1p!kgC@*fD+FyU@VAykW zo!-F9yXp|(lTv9(+_*B#GV<)lP2&gCr|MqzWo&)2*+tLH5o;g$;(bPvOX=*7)M-)Q z$loQ5XryPQXk6a>qZG!8M;h5(7dq;!tT+3-KYW%rQV8J~_Z{I#%rM{BuRFUXuSGD* z5oMh|^Hm4dJa~1v0R_n$KWygSrl8$oa6;OS){Lu6uO_KJNXuZnwb?lUoZGb{hTO!q z*tDCjr^zZJq%Hb@QcvWbgehV#E@7#WE=wydd7~jt0TE1?*lHKueY&`7ht~Z%clpY4 z2WR`WU2~KCuEHT8;rK8g+zo4bBjKdYw&#b2nNKvnMr{=tCoZJ(G(9bNU$+?c)j%4t zDl%H3`I-a%RWbK~ZBwDQcSBX`qlSaXQ}p`RdE`O{p`)$B#AoHzT@Fm?F3)&YL~`k) zND5S5*&W~8SrEy>XCndnu*7^v8eMOZEmTX^(B|-l^vyRB-?HNjBFm7LC67I+dK-0j zA**-}Okw+IW*TjmRPpa!`N}^C5?Jl!V%!RRRibB&(aDgT*YvIX6tFC|^OV<9ZB!A@ z1g%i_vDj18giT*rlXO~%-qn^iqr@Ji9|=4ja2qf7+1_O`AVdeoXPTFMmr$ax$M+uf zo}0Pibk(lvU9^(Ig+fWP)>zr^q3S~^nK$02H=Hv*-^p2Y*~S7CLgvqE^9wpzm1sckjEONoW

    F-+8r2U2&xc94!;TX_x(3b{t~dH74&d(P6>vhNI57x7HFkHt3lxz ztsWTRElM;Q6ke$e2rvMp2M~B55VA}UoFGFu1^`-c;NBh#0fjJ(@&Jrf=x>KW3<78- zf?MpB(Xu*iDQ*Dz5hR8jF`&RwL{1N5kO0bn+()c^hvvW}If50a<_NuJ3y`M081E=r zy&+;{B_v!zqmz`O3;~6M1_ynGJQi@cliC6qtD!oRy@g7)iC;zxDsEF@&Te zlmrAhNp)&8Src~cUo6s`7chPDzk>8X;))@XwPG33A0RO@h#)3N2q$0yt@!B$Oj06@ z0InLR2MkCvIb((fBOdTScYMs8_kzcs_f>?`_=NhtGw+AGaK!Q~@w})dX4REyDp>U` zIbx$F5-00mt^~M2;STtqA6&Vw0V*^gy!%UA8dL%Lf7KPk?@lLB{%^R)d=BM&gb5ys zdGF&TdW15e-%}uB=Mc2so<>mzQ$toAM$^$p4jV!5 z0cKVp2%`9FeP;ZNQ1P9MWexVGyE^_lQ!p2j_ejDx2C9z=7Y}wvW7c1v=>0qtGU0cU zB*%m*EMyAE1hDffvwN`0aFR;$g6>XJ|C;btTg->=&8c+^lD5W)r|KsJYS1IE8x zf+BzRuP*C#Qo=0&Yl?@W^cu|6bs7DD%rx0XTQI{uaS(OA{?nfPlg{w00IVO z5Wb^559;`xM~*-U4+x689~TW;j1pmsaN)`#gTXsUN@Ltuu#W+21rQm<1$=N83?UA~ zl;E|@DG>S;;L=q>T3wAA_3^&EcR;H<@Z4bvBD`w~Gu$$O_+_tu0~nOS-6P%_i7Nar zR>+U#&P)v$=AZEt1Wf4Ao#?1>m5~#Kk<>pADmA1eG-@9Y5+7OJ5%F_d5I-K~H?8(6^$I&^H~&zWj=P zOe=De7>`!*rVV{RS>v*}+Vk!sJ_Y7kA@4nR+rf~dav||t)%iYrU_VG5U#N~HH(NRv zQoQLzMeEsCjGvb>_3Vi78t8}+3hqP|cYdcR<0`|FJ$#X#`OrYob9Lh2VL4CqGt>rQ zR&)OuUw5F|wMq|64rP&-?;wr8#AIE*P{U^*y>q}C6jS1jVc8uDpb5V`QrMYPk?b}} zf#4J5#7qq?TFMbZ$e0iPn`zN%*JKfI4s^{>oPNB=I1=fW6l`x4Ph5h4c4a1J&}=z) z^KJ>{(M>YPFggz}NEFkbk?D%wrc_UcfhD6m zPh}P8(m(!L=7@`(v1^VxZs_QF?YNq*o+u}czg2rfRlWRGA z(iS~a|MDgtavW79@RWGDw@{1`7^9pw$XD-IL5#Ca>A?uou)O!x<$?^waiHS%HaVoS zhfd&*?Wzzn^(oK0e){rz9^fQ3+SQ5|_n~>a1K$r%J zvHtON5&%p{qU~RJb4$z1WUwB~uI8`jAMsw{A*BLqia4Y6fP-8Kk~_(xzmVpb{i#NC zc$z-LKywQ(2`FZ4d~eMA=Yh1R4@7_01EH$&9q+kF)o*M;CQ3C?BHx;K zG`%0x_ss76CKGXn!6o0{*-!EF;|SY+nLJzHL`Vhu2mUk9qt*KI*Kt~iG+k+>?Wf9XEB+(BP?`2_?i3VQqeZR$sWup}S}m^6~&jiIO=_!~sz->%}n7cvWC zc(Uho<(!8b12h1}yl2448xxbh&ZofK1E)q;;x(t0$Vgrc#n9U-%l_2nJpK@G>$mi1 z-OXwCdzT!(cC153@X+01XJ0bo00cW9D98Mp9#iR8fUZyWL;Br|lJ$U# ziZ05$PD%qa%?y2O1f5nSagV8L8Qov0?c8HSv4?f?6@z^#Xl?uxnp=hp%NM(!ZIis* zlL5iGUT~l%0g!6l3`6Bo_K6KHQe1!p?#~_rq~rfgPX8Z}`3K!Kp){Nws9#EUKM40H z*)o_C>{Z|f8_FKzH)%i<&X=HPZ6Da9D<^aaeK$xeoX#{A4FU({F{srvEM<|5!{Ab- zn+GX0m%yrP0TT4D=cGnfU$ZZlf+Z8IqG_FXDHR;OI?(a;T84#|oR+UsQ!O5S8_;iQ zV@s^0oqu*TG!ZD|K)(+@_N|yYdreAI8P#34tr$HkRa2^OTOop-D^g78vj!<$EW5eh zCRVlsypCqYsX4@$D;<~|6|JI=Bo;|&%LGuvIVTa^NlnV%r2PL9Rd&RFr83j2oKp*y zE<(&@SkX-`4Gaxo*wsMd+)L5o*jd{=D74+qT{+pQ>5bGhrK*s+>Cg*DZHM1gAZdRw_>=HbZ0F_JX#J6|LC(6!tK? z&B^jE@)dn#br12Giq~2fWyhWPr9;W#Q$*^uZX?&diR|jIWHLvKQPfk5$J&t5pbxe+ zqZ%m2S00#>QHf@W)&B2-Lo6(6zLN*%8AiZGyPaF-E*6hIBwbqwA4CGezpz1BemKT* zIpFct5;kEkd^7e=g#VsV(YR812r78zZkoXUu;E%)hrt{AgW+>7UtQI!%KV%PQ?6>D4-KzHxLI7&`>#2qC5)Z!{M8ZoVUbfD(-p_PWni_<(ZJl2Tk6 zCK;db8H!{acu1#4(8c#cZD9J1J3l%MuG1hQ8#oS!0+=`7?WkgBvckr1Yc3|h;~S|v z|MN&0SiaWI(_HuF2UigtkH3Xjv|fl$0P2QrU8)gZP%Xf5^>^2?fB+5#=Z&-x>ih3W z!S5&7k+ADR&*y(Vtak24%22g>Kb~#5zKgdLbD)r3kFSxO$@1%<;J(9jI z+nS;m_G@W*Qsge*1-=Z*9pBgna36beucy>EiO$N3vIFB$I`Xn`-J#L zRWes(<3sqw67z+@zJfNL#R9($XW+|_i-j!*H6p~GRk6aQpW^IeIe!rdvO*!cVI#OF zSYYKdLb((WUTD`iqcm^foxU}h!}wqCQGfB!SNRVz}t H`}98m&lY&G literal 13111 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 diff --git a/docs/reference/index.html b/docs/reference/index.html index cacd4f8..bea6b6b 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -1,248 +1,138 @@ - - - - - - - -Function reference • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Function reference • Word Predictor + Skip to contents + +

    -
    - - - -
    - -
    - +
    + + +
    -
    -

    Site built with pkgdown 1.6.1.

    + -
    -
    +
    + - - - + diff --git a/docs/reference/wordpredictor-package.html b/docs/reference/wordpredictor-package.html index 21d5764..3aff55c 100644 --- a/docs/reference/wordpredictor-package.html +++ b/docs/reference/wordpredictor-package.html @@ -1,194 +1,91 @@ - - - - - - - -wordpredictor: Develop Text Prediction Models Based on N-Grams — wordpredictor-package • Word Predictor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +wordpredictor: Develop Text Prediction Models Based on N-Grams — wordpredictor-package • Word Predictor + Skip to contents + +
    -
    - +
    -
    - +
    + - - - + diff --git a/docs/search.json b/docs/search.json new file mode 100644 index 0000000..edf2f09 --- /dev/null +++ b/docs/search.json @@ -0,0 +1 @@ +[{"path":"https://pakjiddat.github.io/word-predictor/LICENSE.html","id":null,"dir":"","previous_headings":"","what":"MIT License","title":"MIT License","text":"Copyright (c) 2021 Nadir Latif Permission hereby granted, free charge, person obtaining copy software associated documentation files (“Software”), deal Software without restriction, including without limitation rights use, copy, modify, merge, publish, distribute, sublicense, /sell copies Software, permit persons Software furnished , subject following conditions: copyright notice permission notice shall included copies substantial portions Software. SOFTWARE PROVIDED “”, WITHOUT WARRANTY KIND, EXPRESS IMPLIED, INCLUDING LIMITED WARRANTIES MERCHANTABILITY, FITNESS PARTICULAR PURPOSE NONINFRINGEMENT. EVENT SHALL AUTHORS COPYRIGHT HOLDERS LIABLE CLAIM, DAMAGES LIABILITY, WHETHER ACTION CONTRACT, TORT OTHERWISE, ARISING , CONNECTION SOFTWARE USE DEALINGS SOFTWARE.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/articles/features.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Features","text":"document describes features provided wordpredictor package. first describes generate n-gram models. Next describes evaluate performance n-gram models. Finally describes make word predictions using n-gram model.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/articles/features.html","id":"model-generation","dir":"Articles","previous_headings":"","what":"Model Generation","title":"Features","text":"wordpredictor package provides several classes can used generate n-gram models. classes may used generate n-gram models step step. alternative use ModelGenerator class combines steps provides single method generating n-gram models. following steps involved generating n-gram models:","code":""},{"path":"https://pakjiddat.github.io/word-predictor/articles/features.html","id":"data-exploration","dir":"Articles","previous_headings":"Model Generation","what":"Data Exploration","title":"Features","text":"first step generating n-gram model data exploration. involves determining type textual content various text related statistics. type text may news content, blog posts, Twitter feeds, product reviews, customer chat history etc. Example text related statistics line count, word count, average line length input file size. also important determine unwanted words symbols data vulgar words, punctuation symbols, non-alphabetical symbols etc. wordpredictor package provides DataAnalyzer class can used find statistics input data. following example shows get statistics text files within folder: word count text file can fetched using command: cat file-name | wc -w. command work Unix based systems.","code":"# The required files rf <- c( \"test.txt\", \"validate.txt\", \"validate-clean.txt\", \"test-clean.txt\" ) # The test environment is setup ed <- setup_env(rf, ve) # The DataAnalyzer object is created da <- DataAnalyzer$new(ve = ve) # Information on all text files in the ed folder is returned fi <- da$get_file_info(ed) # The file information is printed print(fi) #> $file_stats #> fn total_lc max_ll min_ll mean_ll size #> 1 /tmp/RtmpoZ8ia5/test-clean.txt 73 50 25 39 2.8 Kb #> 2 /tmp/RtmpoZ8ia5/test.txt 73 51 28 41 3 Kb #> 3 /tmp/RtmpoZ8ia5/validate-clean.txt 75 48 10 37 2.8 Kb #> 4 /tmp/RtmpoZ8ia5/validate.txt 73 50 31 40 2.9 Kb #> #> $overall_stats #> total_lc max_ll min_ll mean_ll total_s #> 1 294 51 31 41 11.5 Kb # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/articles/features.html","id":"data-sampling","dir":"Articles","previous_headings":"Model Generation","what":"Data Sampling","title":"Features","text":"next step generate training, testing validation samples input text file. many input text files, can combined single file using command: cat file-1 file-2 file3 > output-file. contents combined text file may need randomized. wordpredictor package provides DataSampler class can used generate random sample containing given number lines. following example shows generate random sample size 10 Mb input text file: Usually need train data set generating n-gram model. test data set testing model validation data set evaluating performance model. following example shows generate train, test validation files. train file contains first 80% lines, test set contains next 10% lines. remaining lines validation set. data validation file must different data train file. Otherwise can result -fitting model. model -fitted, model evaluation results exaggerated, overly optimistic unreliable. care taken ensure data validation train files different. example, dir parameter directory containing input.txt file generated test, validation train data files.","code":"# The required files rf <- c(\"input.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The sample size as a proportion of the input.txt file ssize <- 0.1 # The data file path dfp <- paste0(ed, \"/input.txt\") # The object size is formatted obj_size <- file.size(dfp)/10^6 # The proportion of data to sample prop <- (ssize/obj_size) # An object of class DataSampler is created ds <- DataSampler$new(dir = ed, ve = ve) # The sample file is generated. # The randomized sample is saved to the file train.txt in the ed folder ds$generate_sample( fn = \"input.txt\", ss = prop, ic = F, ir = T, ofn = \"train.txt\", is = T ) # The test environment is cleaned up clean_up(ve) # The required files rf <- c(\"input.txt\") # The test environment is setup ed <- setup_env(rf, ve) # An object of class DataSampler is created ds <- DataSampler$new(dir = ed, ve = ve) # The train, test and validation files are generated ds$generate_data( fn = \"input.txt\", percs = list( \"train\" = 0.8, \"test\" = 0.1, \"validate\" = 0.1 ) ) # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/articles/features.html","id":"data-cleaning","dir":"Articles","previous_headings":"Model Generation","what":"Data Cleaning","title":"Features","text":"next step remove unwanted symbols words input text file. reduces memory requirement n-gram model makes efficient. Example unwanted words vulgar words, words part vocabulary, punctuation, numbers, non-printable characters extra spaces. wordpredictor package provides DataCleaner class can used remove unwanted words symbols text files. following example shows clean given text file: clean_file method reads certain number lines time, cleans lines text saves output text file. can used cleaning large text files.","code":"# The required files rf <- c(\"input.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The data file path fn <- paste0(ed, \"/input.txt\") # The clean file path cfn <- paste0(ed, \"/input-clean.txt\") # The data cleaning options dc_opts = list( \"min_words\" = 2, \"to_lower\" = T, \"remove_stop\" = F, \"remove_punct\" = T, \"remove_non_dict\" = T, \"remove_non_alpha\" = T, \"remove_extra_space\" = T, \"remove_bad\" = F, \"output_file\" = cfn ) # The data cleaner object is created dc <- DataCleaner$new(fn, dc_opts, ve = ve) # The sample file is cleaned and saved as input-clean.txt in the ed dir dc$clean_file() # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/articles/features.html","id":"tokenization","dir":"Articles","previous_headings":"Model Generation","what":"Tokenization","title":"Features","text":"next step generate n-gram tokens cleaned text file. TokenGenerator class allows generating n-gram tokens given size given input text file. following example shows generate n-grams tokens size 1,2,3 4: code generates files n1.RDS, n2.RDS, n3.RDS n4.RDS data directory. files contains n-gram tokens along frequencies. N-grams larger size provide context. Usually n-grams size 4 generated. Two important customization options supported TokenGenerator class min_freq stem_words. min_freq sets minimum frequency n-gram tokens. n-gram tokens frequency less min_freq excluded. stem_words option used transform n-gram prefix components stems. next word transformed. n-gram token frequencies may analyzed using DataAnalyzer class. following example displays top occurring 2-gram tokens: following example shows distribution word frequencies: following example returns top 10 2-gram tokens start and_:","code":"# The required files rf <- c(\"test-clean.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The test file path fn <- paste0(ed, \"/test-clean.txt\") # The n-grams are generated for (n in 1:4) { # The ngram number is set tg_opts = list(\"n\" = n, \"save_ngrams\" = T, dir = ed) # The TokenGenerator object is created tg <- TokenGenerator$new(fn, tg_opts, ve = ve) # The ngram tokens are generated tg$generate_tokens() } # The test environment is cleaned up clean_up(ve) # The required files rf <- c(\"n2.RDS\") # The test environment is setup ed <- setup_env(rf, ve) # The ngram file name fn <- paste0(ed, \"/n2.RDS\") # The DataAnalyzer object is created da <- DataAnalyzer$new(fn, ve = ve) # The top features plot is checked df <- da$plot_n_gram_stats(opts = list( \"type\" = \"top_features\", \"n\" = 10, \"save_to\" = \"png\", \"dir\" = \"./reference/figures\" )) # The output file path fn <- paste0(\"./reference/figures/top_features.png\") knitr::include_graphics(fn) # The test environment is cleaned up clean_up(ve) # The required files rf <- c(\"n2.RDS\") # The test environment is setup ed <- setup_env(rf, ve) # The ngram file name fn <- paste0(ed, \"/n2.RDS\") # The DataAnalyzer object is created da <- DataAnalyzer$new(fn, ve = ve) # The top features plot is checked df <- da$plot_n_gram_stats(opts = list( \"type\" = \"coverage\", \"n\" = 10, \"save_to\" = \"png\", \"dir\" = \"./reference/figures\" )) # The output file path fn <- paste0(\"./reference/figures/coverage.png\") knitr::include_graphics(fn) # The test environment is cleaned up clean_up(ve) # The required files rf <- c(\"n2.RDS\") # The test environment is setup ed <- setup_env(rf, ve) # The ngram file name fn <- paste0(ed, \"/n2.RDS\") # The DataAnalyzer object is created da <- DataAnalyzer$new(ve = ve) # Bi-grams starting with \"and_\" are returned df <- da$get_ngrams(fn = fn, c = 10, pre = \"^and_*\") # The data frame is sorted by frequency df <- df[order(df$freq, decreasing = T),] # The first 10 rows of the data frame are printed knitr::kable(df[1:10,], col.names = c(\"Prefix\", \"Frequency\")) # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/articles/features.html","id":"transition-probabilities","dir":"Articles","previous_headings":"Model Generation","what":"Transition Probabilities","title":"Features","text":"next step generating n-gram model generate transition probabilities (tp) n-gram files. TPGenerator class used generate tps. n-gram token file corresponding tp file generated. tp files combined single file containing tp data n-grams size 1, 2, 3, 4 etc. following example shows generate combined tps n-grams size 1, 2, 3 4: code produces file model-4.RDS.","code":"# The required files rf <- c(\"n1.RDS\", \"n2.RDS\", \"n3.RDS\", \"n4.RDS\") # The test environment is setup ed <- setup_env(rf, ve) # The TPGenerator object is created tp <- TPGenerator$new(opts = list(n = 4, dir = ed), ve = ve) # The combined transition probabilities are generated tp$generate_tp() # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/articles/features.html","id":"the-model-file","dir":"Articles","previous_headings":"Model Generation","what":"The model file","title":"Features","text":"final step generate n-gram model file files generated previous steps. Model class contains method load_model, reads combined tps files files used model. instance Model class represents n-gram model.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/articles/features.html","id":"generating-the-model-in-one-step","dir":"Articles","previous_headings":"Model Generation","what":"Generating the model in one step","title":"Features","text":"previous steps may combined single step. ModelGenerator class allows generating final n-gram model using single method call. following example generates n-gram model using default data cleaning tokenization options:","code":"# The required files rf <- c(\"input.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The following code generates n-gram model using default options for data # cleaning and tokenization. See the following section on how to customize these # options. Note that input.txt is the name of the input data file. It should be # present in the data directory. dir is the directory containing the input and output files. It is set to the path of the environment directory, ed. # ModelGenerator class object is created mg <- ModelGenerator$new( name = \"def-model\", desc = \"N-gram model generating using default options\", fn = \"def-model.RDS\", df = \"input.txt\", n = 4, ssize = 0.1, dir = ed, dc_opts = list(), tg_opts = list(), ve = ve ) # Generates n-gram model. The output is the file def-model.RDS mg$generate_model() # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/articles/features.html","id":"evaluating-the-model-performance","dir":"Articles","previous_headings":"","what":"Evaluating the model performance","title":"Features","text":"wordpredictor package provides ModelEvaluator class evaluating performance generated n-gram model. Intrinsic Extrinsic evaluation supported. Also performance several n-gram models may compared. following example performs Intrinsic evaluation. measures Perplexity score sentence validation.txt file, generated data sampling step. returns minimum, mean maximum Perplexity score line. following example performs Extrinsic evaluation. measures accuracy score sentence validation.txt file. sentence model used predict last word sentence given previous words. last word correctly predicted, prediction considered accurate.","code":"# The required files rf <- c(\"def-model.RDS\", \"validate-clean.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # The path to the cleaned validation file vfn <- paste0(ed, \"/validate-clean.txt\") # ModelEvaluator class object is created me <- ModelEvaluator$new(mf = mfn, ve = ve) # The intrinsic evaluation is performed on first 20 lines stats <- me$intrinsic_evaluation(lc = 20, fn = vfn) # The test environment is cleaned up clean_up(ve) # The required files rf <- c(\"def-model.RDS\", \"validate-clean.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # The path to the cleaned validation file vfn <- paste0(ed, \"/validate-clean.txt\") # ModelEvaluator class object is created me <- ModelEvaluator$new(mf = mfn, ve = ve) # The intrinsic evaluation is performed on first 100 lines stats <- me$extrinsic_evaluation(lc = 100, fn = vfn) # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/articles/features.html","id":"making-word-predictions","dir":"Articles","previous_headings":"","what":"Making word predictions","title":"Features","text":"n-gram model generated previous step can used predict next word given set words. following example shows predict next word. returns 3 possible next words along probabilities.","code":"# The required files rf <- c(\"def-model.RDS\") # The test environment is setup ed <- setup_env(rf, ve) # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # An object of class ModelPredictor is created. The mf parameter is the name of # the model file that was generated in the previous example. mp <- ModelPredictor$new(mf = mfn, ve = ve) # Given the words: \"how are\", the next word is predicted. The top 3 most likely # next words are returned along with their respective probabilities. res <- mp$predict_word(words = \"how are\", 3) # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/articles/overview.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Overview","text":"document describes theory behind n-gram models generated wordpredictor package. also provides code examples describe use package. goal wordpredictor package provide flexible easy use framework generating n-gram models word prediction. package allows generating n-gram models. also allows exploring n-gram frequencies using plots. Additionally provides methods measuring n-gram model performance using Perplexity accuracy. n-gram model may customized using several options n-gram size, data cleaning options options converting text tokens.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/articles/overview.html","id":"how-the-model-works","dir":"Articles","previous_headings":"","what":"How the model works","title":"Overview","text":"n-gram model generated wordpredictor package uses Markov model approximating language model. means probability word depends probability n-1 previous words. Maximum Likelihood Estimation (MLE) used calculate probability word. probability word calculated regarding word last component n-gram. total number occurrences n-gram divided total number occurrences (n-1)-gram. gives probability word. n-gram model generated steps. first step, input data cleaned. Unwanted symbols words removed input data. next step, cleaned data file read. N-grams extracted file, starting 1-grams configured n-gram size. 1-gram, 2-gram, 3-gram etc tokens saved separate files along frequency. 3-gram file contains extracted 3-grams respective frequencies. next step generate transition probability tables n-gram file. 1-gram file transition probability table simply list unique words along word frequencies. n-gram files, transition probability table data frame 3 columns. hash n-gram prefixes, next word id next word probability. n-gram prefix set n-1 components last component. n-1 components combined using “_” converted numeric hash value using digest2Int method digest package. next word id numeric index next word list 1-grams. next word probability probability next word given previous n-1 words. calculated using Maximum Likelihood Estimation (MLE) described . Instead storing n-gram prefix strings, single number saved. Also instead storing next word, numeric index next word saved. saves lot memory allows data stored, improves n-gram model’s efficiency. R, number requires fixed amount storage, 56 bytes. contrast memory required store string increases number characters string. data frames represent transition probability table combined single data frame. combined transition probability table used make word predictions.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/articles/overview.html","id":"using-the-model-to-predict-words","dir":"Articles","previous_headings":"","what":"Using the model to predict words","title":"Overview","text":"predict word, word along n-1 previous words used input. model computes hash previous words looks hash combined transition probabilities table. hash found, model extracts top 3 next word ids highest probabilities. model looks next word text corresponds next word ids. result top 3 likely next words along probabilities. hash found, hash n-2 previous words calculated looked combined transition probabilities table. process repeated previous words. happens, model returns “word found” message. method checking transition probabilities lower level n-grams called back-. alternate method predicting word use interpolation. involves weighing summing probabilities n-gram size.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/articles/overview.html","id":"predicting-the-model-performance","dir":"Articles","previous_headings":"","what":"Predicting the model performance","title":"Overview","text":"wordpredictor package provides methods performing intrinsic extrinsic evaluation n-gram model. wordpredictor package performs intrinsic evaluation calculating mean Perplexity score sentences validation text file. Perplexity sentence calculated taking N-th root inverse product probabilities words sentence. N number words sentence. probability word calculated considering n-1 words word. word found transition probabilities table, n-2 words looked . process repeated previous words. word found 1-gram list, probability word calculated simply dividing number times word occurs total number words. word found 1-gram list, model uses default probability probability word. default probability calculated using Laplace Smoothing. Laplace Smoothing involves adding 1 frequency count word vocabulary. Essentially means total number words data set increased vc, vc number words vocabulary. Laplace Smoothing 1 added word count. Since unknown word occurs zero times, Laplace Smoothing count 1. default probability calculated : P(unk) = 1/(N+VC), N total number words data set VC number words vocabulary. default probability assigned unknown words. Alternative methods Laplace Smoothing Add-k smoothing, Kneser-Ney smoothing Good-Turing Smoothing. wordpredictor package uses file /usr/share/dict/cracklib-small dictionary file. file pre-installed Linux distributions. Extrinsic evaluation involves calculating accuracy score. model tries predict last word sentence. actual last word one 3 words predicted model, prediction considered accurate. accuracy score number sentences correctly predicted.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/articles/overview.html","id":"generating-the-model","dir":"Articles","previous_headings":"","what":"Generating the model","title":"Overview","text":"ModelGenerator class allows generating final n-gram model using single method call. following example generates n-gram model using default data cleaning tokenization options:","code":"# The required files rf <- c(\"input.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The following code generates n-gram model using default options for data # cleaning and tokenization. See the following section on how to customize these # options. Note that input.txt is the name of the input data file. It should be # present in the ed directory. The generated model file is also placed in this # directory. # ModelGenerator class object is created mg <- ModelGenerator$new( name = \"def-model\", desc = \"N-gram model generating using default options\", fn = \"def-model.RDS\", df = \"input.txt\", n = 4, ssize = 0.1, dir = ed, dc_opts = list(), tg_opts = list(), ve = ve ) # Generates n-gram model. The output is the file # ./data/model/def-model.RDS mg$generate_model() # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/articles/overview.html","id":"evaluating-the-model-performance","dir":"Articles","previous_headings":"","what":"Evaluating the model performance","title":"Overview","text":"wordpredictor package provides ModelEvaluator class evaluating performance generated n-gram model. following example performs intrinsic evaluation. measures Perplexity score sentence validation.txt file. returns minimum, mean maximum Perplexity score line. following example performs extrinsic evaluation. measures accuracy score sentence validation.txt file. sentence model used predict last word sentence given previous words. last word correctly predicted, prediction considered accurate. extrinsic evaluation returns number correct incorrect predictions.","code":"# The required files rf <- c(\"def-model.RDS\", \"validate-clean.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # The path to the cleaned validation file vfn <- paste0(ed, \"/validate-clean.txt\") # ModelEvaluator class object is created me <- ModelEvaluator$new(mf = mfn, ve = ve) # The intrinsic evaluation is performed on first 20 lines stats <- me$intrinsic_evaluation(lc = 20, fn = vfn) # The test environment is cleaned up clean_up(ve) # The required files rf <- c(\"def-model.RDS\", \"validate-clean.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # The path to the cleaned validation file vfn <- paste0(ed, \"/validate-clean.txt\") # ModelEvaluator class object is created me <- ModelEvaluator$new(mf = mfn, ve = ve) # The intrinsic evaluation is performed on first 100 lines stats <- me$extrinsic_evaluation(lc = 100, fn = vfn) # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/articles/overview.html","id":"how-to-predict-a-word","dir":"Articles","previous_headings":"","what":"How to predict a word","title":"Overview","text":"following example shows predict next word. returns 3 possible next words along probabilities.","code":"# The required files rf <- c(\"def-model.RDS\", \"validate-clean.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # An object of class ModelPredictor is created. The mf parameter is the name of # the model file that was generated in the previous example. mp <- ModelPredictor$new(mf = mfn, ve = ve) # Given the words: \"how are\", the next word is predicted. The top 3 most likely # next words are returned along with their respective probabilities. res <- mp$predict_word(words = \"how are\", 3) # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/articles/overview.html","id":"demo","dir":"Articles","previous_headings":"","what":"Demo","title":"Overview","text":"wordpredictor package includes demo called “word-predictor.” demo Shiny application displays ten likely words given set words. access demo, run following command R shell: demo(\"word-predictor\", package = \"wordpredictor\", ask = F).","code":""},{"path":"https://pakjiddat.github.io/word-predictor/articles/overview.html","id":"package-dependencies","dir":"Articles","previous_headings":"","what":"Package dependencies","title":"Overview","text":"wordpredictor package uses following packages: digest, dply, ggplot2, R6, testthat stingr following packages useful package development: quanteda, tm hash lintr styler pkgdown pryr,","code":""},{"path":"https://pakjiddat.github.io/word-predictor/articles/overview.html","id":"useful-links","dir":"Articles","previous_headings":"","what":"Useful Links","title":"Overview","text":"following articles tutorials useful: N-Gram Model Probability Smoothing Natural Language Processing Natural Language Processing Fun! Quanteda Tutorials","code":""},{"path":[]},{"path":"https://pakjiddat.github.io/word-predictor/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Nadir Latif. Author, maintainer.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Latif N (2021). Develop Text Prediction Models Based N-Grams. R package version 1.0.0, https://github.com/pakjiddat/word-predictor.","code":"@Manual{, title = {Develop Text Prediction Models Based on N-Grams}, author = {Nadir Latif}, year = {2021}, note = {R package version 1.0.0}, url = {https://github.com/pakjiddat/word-predictor}, }"},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"introduction","dir":"","previous_headings":"","what":"Develop Text Prediction Models Based on N-Grams","title":"Develop Text Prediction Models Based on N-Grams","text":"goal wordpredictor package provide flexible easy use framework generating n-gram models word prediction. package allows generating n-gram models input text files. also allows exploring n-grams using plots. Additionally provides methods measuring n-gram model performance using Perplexity accuracy. n-gram model may customized using several options n-gram size, data cleaning options options tokenization.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Develop Text Prediction Models Based on N-Grams","text":"can install released version wordpredictor CRAN : development version GitHub :","code":"install.packages(\"wordpredictor\") # install.packages(\"devtools\") devtools::install_github(\"pakjiddat/word-predictor\")"},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"package-structure","dir":"","previous_headings":"","what":"Package structure","title":"Develop Text Prediction Models Based on N-Grams","text":"wordpredictor package based R6 classes. easy customize improve. provides following classes: DataAnalyzer. allows analyzing n-grams. DataCleaner. allows cleaning text files. supports several data cleaning options. DataSampler. allows generating sample files specified size text file. also allows generating train, test validation sample files given input text file. TokenGenerator. allows generating n-gram tokens given size. TPGenerator. allows generating transition probabilities given n-gram file. ModelGenerator. allows generating n-gram models using different configuration options. ModelEvaluator. allows evaluating performance n-gram models. 4 metrics used compare performance. : Perplexity, accuracy, memory time taken. ModelPredictor. allows predicting next word, given set previous words. Base. base class classes. allows provides methods reading writing files processing large text files. Information package can obtained using command line package website. example, command: ?wordpredictor returns information given class works parameter details class method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"generating-the-model","dir":"","previous_headings":"","what":"Generating the model","title":"Develop Text Prediction Models Based on N-Grams","text":"following example shows generate n-gram model. code generates file def-model.RDS. file represents n-gram model.","code":"# The required files rf <- c(\"input.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The following code generates n-gram model using default options for data # cleaning and tokenization. See the following section on how to customize these # options. Note that input.txt is the name of the input data file. It should be # present in the data directory. ddir is the data directory. mdir is the model # directory. The output model file, which is def-model.RDS will be placed in # this directory. # ModelGenerator class object is created mg <- ModelGenerator$new( name = \"def-model\", desc = \"N-gram model generating using default options\", fn = \"def-model.RDS\", df = \"input.txt\", n = 4, ssize = 10, dir = ed, dc_opts = list(), tg_opts = list(), ve = ve ) # Generates n-gram model. The output is the file def-model.RDS mg$generate_model() # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"predicting-words","dir":"","previous_headings":"","what":"Predicting words","title":"Develop Text Prediction Models Based on N-Grams","text":"following example shows predict next word given set words:","code":"# The required files rf <- c(\"def-model.RDS\") # The test environment is setup ed <- setup_env(rf, ve) #> [1] \"CITATION\" \"demo\" \"DESCRIPTION\" \"examples\" \"extdata\" #> [6] \"help\" \"html\" \"INDEX\" \"LICENSE\" \"Meta\" #> [11] \"NAMESPACE\" \"NEWS.md\" \"R\" # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # An object of class ModelPredictor is created. The mf parameter is the name of # the model file that was generated in the previous example. mp <- ModelPredictor$new(mf = mfn) # Given the words: \"how are\", the next word is predicted. The top 3 most likely # next words are returned along with their respective probabilities. res <- mp$predict_word(words = \"how are\", 3) # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"analyzing-n-grams","dir":"","previous_headings":"","what":"Analyzing N-grams","title":"Develop Text Prediction Models Based on N-Grams","text":"wordpredictor package includes class called DataAnalyzer, can used get idea frequency distribution n-grams model. model generation process described , creates n-gram file model directory. n-gram number less equal n-gram size model, n-gram file generated. example n-gram size model 4. 4 n-gram files generated model folder. files : n1.RDS, n2.RDS, n3.RDS n4.RDS. n2.RDS file contains n-grams size 2. following example plots top 10 occurring bi-grams along frequencies: following example plots n-gram frequency coverage. shows percentage n-grams frequency 1, 2 … 10. following example shows get list bi-grams starting “great_” along frequencies. also shows get frequency bi-gram “great_deal”.","code":"# The required files rf <- c(\"n2.RDS\") # The test environment is setup ed <- setup_env(rf, ve) #> [1] \"CITATION\" \"demo\" \"DESCRIPTION\" \"examples\" \"extdata\" #> [6] \"help\" \"html\" \"INDEX\" \"LICENSE\" \"Meta\" #> [11] \"NAMESPACE\" \"NEWS.md\" \"R\" # The file name fn <- paste0(ed, \"/n2.RDS\") # An object of class DataAnalyzer is created. The fn parameter is the path to # the n-gram file. da <- DataAnalyzer$new(fn = fn) # The top 10 most occurring features are plotted df <- da$plot_n_gram_stats(opts = list( \"type\" = \"top_features\", \"n\" = 10, \"save_to\" = NULL, \"dir\" = NULL )) # The test environment is cleaned up clean_up(ve) # The required files rf <- c(\"n2.RDS\") # The test environment is setup ed <- setup_env(rf, ve) #> [1] \"CITATION\" \"demo\" \"DESCRIPTION\" \"examples\" \"extdata\" #> [6] \"help\" \"html\" \"INDEX\" \"LICENSE\" \"Meta\" #> [11] \"NAMESPACE\" \"NEWS.md\" \"R\" # The file name fn <- paste0(ed, \"/n2.RDS\") # An object of class DataAnalyzer is created. The fn parameter is the path to # the n-gram file. da <- DataAnalyzer$new(fn = fn) # The top 10 most occurring features are plotted df <- da$plot_n_gram_stats(opts = list( \"type\" = \"coverage\", \"n\" = 10, \"save_to\" = NULL, \"dir\" = NULL )) # The test environment is cleaned up clean_up(ve) # The required files rf <- c(\"n2.RDS\") # The test environment is setup ed <- setup_env(rf, ve) #> [1] \"CITATION\" \"demo\" \"DESCRIPTION\" \"examples\" \"extdata\" #> [6] \"help\" \"html\" \"INDEX\" \"LICENSE\" \"Meta\" #> [11] \"NAMESPACE\" \"NEWS.md\" \"R\" # The file name fn <- paste0(ed, \"/n2.RDS\") # An object of class DataAnalyzer is created. The fn parameter is the path to # the n-gram file. da <- DataAnalyzer$new() # Bi-grams starting with \"great_\" are returned df <- da$get_ngrams(fn = fn, c = 10, pre = \"^great_*\") # The data frame is sorted by frequency df <- df[order(df$freq, decreasing = T),] # The frequency of the bi-gram \"great_deal\" f <- as.numeric(df[df$pre == \"great_deal\", \"freq\"]) # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"customizing-the-n-gram-model","dir":"","previous_headings":"","what":"Customizing the n-gram model","title":"Develop Text Prediction Models Based on N-Grams","text":"dc_opts parameter ModelGenerator class specifies data cleaning options. following code shows data cleaning options default values: tg_opts parameter ModelGenerator class specifies token generation options. following code shows token generation options default values:","code":"# @field dc_opts The options for the data cleaner object. # min_words -> The minimum number of words per sentence. # line_count -> The number of lines to read and clean at a time. # save_data -> If the combined processed lines should be saved. # output_file -> Name of the output file used to store the data. # sw_file -> The stop words file path. # dict_file -> The dictionary file path. # bad_file -> The bad words file path. # to_lower -> If the words should be converted to lower case. # remove_stop -> If stop words should be removed. # remove_punct -> If punctuation symbols should be removed. # remove_non_dict -> If non dictionary words should be removed. # remove_non_alpha -> If non alphabet symbols should be removed. # remove_extra_space -> If leading, trailing and double spaces # should be removed. # remove_bad -> If bad words should be removed dc_opts = list( \"min_words\" = 2, \"line_count\" = 1000, \"save_data\" = T, \"output_file\" = NULL, \"sw_file\" = NULL, \"dict_file\" = NULL, \"bad_file\" = NULL, \"to_lower\" = T, \"remove_stop\" = F, \"remove_punct\" = T, \"remove_non_dict\" = T, \"remove_non_alpha\" = T, \"remove_extra_space\" = T, \"remove_bad\" = F ) # @field tg_opts The options for the token generator obj. # min_freq -> All ngrams with frequency less than min_freq are # ignored. # stem_words -> If words should be transformed to their stems. tg_opts = list( \"stem_words\" = F, \"min_freq\" = -1 )"},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"evaluating-model-performance","dir":"","previous_headings":"","what":"Evaluating model performance","title":"Develop Text Prediction Models Based on N-Grams","text":"wordpredictor package allows evaluating n-gram model performance. can measure performance single model well compare performance multiple models. evaluating performance model, intrinsic extrinsic evaluation performed. Intrinsic evaluation measures Perplexity score sentence validation text file. returns minimum, maximum mean Perplexity score sentences. Extrinsic evaluation measures accuracy score sentences validation text file. tries predict last word sentence. word correctly predicted, accuracy count increased. extrinsic evaluation returns number valid invalid predictions. following example shows evaluate performance model:","code":"# The required files rf <- c(\"def-model.RDS\", \"validate.txt\") # The test environment is setup ed <- setup_env(rf, ve) # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # The validation file name vfn <- paste0(ed, \"/validate.txt\") # ModelEvaluator class object is created me <- ModelEvaluator$new(mf = mfn, ve = 2) # The performance evaluation is performed. The performance stats are returned as # a data frame and also saved within the model file itself. stats <- me$evaluate_performance(lc = 20, fn = vfn) # The test environment is cleaned up clean_up(ve)"},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"demo","dir":"","previous_headings":"","what":"Demo","title":"Develop Text Prediction Models Based on N-Grams","text":"wordpredictor package includes demo called “word-predictor”. demo Shiny application displays ten likely words given set words. access demo, run following command R shell: demo(\"word-predictor\", package = \"wordpredictor\", ask = F). following screenshot demo:","code":""},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"website","dir":"","previous_headings":"","what":"Website","title":"Develop Text Prediction Models Based on N-Grams","text":"wordpredictor website provides details package works. includes code samples details classes methods.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"benefits","dir":"","previous_headings":"","what":"Benefits","title":"Develop Text Prediction Models Based on N-Grams","text":"wordpredictor package provides easy use framework working n-gram models. allows n-gram model generation, performance evaluation word prediction.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"limitations","dir":"","previous_headings":"","what":"Limitations","title":"Develop Text Prediction Models Based on N-Grams","text":"n-gram language model requires lot memory storing n-grams. wordpredictor package tested machine dual core processor 4 GB RAM. works well input data files size less 40 Mb n-gram size 4. larger data files n-gram size, memory CPU power needed.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"future-work","dir":"","previous_headings":"","what":"Future Work","title":"Develop Text Prediction Models Based on N-Grams","text":"wordpredictor package may extended adding support different smoothing techniques Good-Turing, Katz-Back-handling Vocabulary Words. Support different types n-gram models Skip-Grams Syntatic n-grams. wordpredictor package used predicting words. may extended support use cases spelling correction, biological sequence analysis, data compression . require performance optimization. source code organized using R6 classes. easy extend. Contributions welcome !.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/index.html","id":"acknowledgments","dir":"","previous_headings":"","what":"Acknowledgments","title":"Develop Text Prediction Models Based on N-Grams","text":"motivated develop wordpredictor package taking courses Data Science Specialization offered John Hopkins university Coursera. like thank course instructors making courses interesting motivating students.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Base.html","id":null,"dir":"Reference","previous_headings":"","what":"Base class for all other classes — Base","title":"Base class for all other classes — Base","text":"Provides basic structure processing text files. Also provides methods reading writing files objects.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Base.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for all other classes — Base","text":"provides pre-processing, processing post-processing methods, need overridden derived classes. pre-processing function called reading file. process function called processing given number lines. post processing function called processed data. Also provides methods reading writing text files R objects. class methods private.","code":""},{"path":[]},{"path":"https://pakjiddat.github.io/word-predictor/reference/Base.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Base class for all other classes — Base","text":"Base$new() Base$clone()","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Base.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"Base class for all other classes — Base","text":"initializes current object. used set file name verbose options.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Base.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for all other classes — Base","text":"","code":"Base$new(fn = NULL, lc = 100, ve = 2)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/Base.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for all other classes — Base","text":"fn path file clean. lc number lines read clean time. ve level detail information messages. Reads given file one line time. runs given pre-processing function reading file. runs given","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Base.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Base class for all other classes — Base","text":"objects class cloneable method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Base.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for all other classes — Base","text":"","code":"Base$clone(deep = FALSE)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/Base.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for all other classes — Base","text":"deep Whether make deep clone.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":null,"dir":"Reference","previous_headings":"","what":"Analyzes input text files and n-gram token files — DataAnalyzer","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"provides method returns information text files, number lines number words. also provides method displays bar plots n-gram frequencies. Additionally provides method searching n-grams n-gram token file. file generated using TokenGenerator class.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"provides method returns text file information. text file information includes total number lines, max, min mean line length file size. also provides method generates bar plot showing common n-gram tokens. Another method provided returns list n-grams match given regular expression.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"super-class","dir":"Reference","previous_headings":"","what":"Super class","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"wordpredictor::Base -> DataAnalyzer","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"methods","dir":"Reference","previous_headings":"","what":"Methods","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"Inherited methods","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"DataAnalyzer$new() DataAnalyzer$plot_n_gram_stats() DataAnalyzer$get_file_info() DataAnalyzer$get_ngrams() DataAnalyzer$clone()","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"initializes current object. used set file name verbose options.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"","code":"DataAnalyzer$new(fn = NULL, ve = 0)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"fn path input file. ve level detail information messages.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"method-plot-n-gram-stats-","dir":"Reference","previous_headings":"","what":"Method plot_n_gram_stats()","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"allows generating two type n-gram plots. first reads n-gram token frequencies input text file. n-gram frequencies displayed bar plot. type plot specified type option. type options can values 'top_features' 'coverage'. 'top_features' displays top n occurring tokens along frequencies. 'coverage' displays number words along frequencies. plot stats returned data frame.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"","code":"DataAnalyzer$plot_n_gram_stats(opts)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"opts options analyzing data. type. type plot display. options : 'top_features', 'coverage'. n. 'top_features', number top occurring tokens. 'coverage' first n frequencies. save_to. graphics devices save plot . NULL implies plot printed. dir. output directory plot saved.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"returns","dir":"Reference","previous_headings":"","what":"Returns","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"data frame containing stats.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL value implies tempdir will # be used. fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"n2.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The n-gram file name nfn <- paste0(ed, \"/n2.RDS\") # The DataAnalyzer object is created da <- DataAnalyzer$new(nfn, ve = ve) # The top features plot is checked df <- da$plot_n_gram_stats(opts = list( \"type\" = \"top_features\", \"n\" = 10, \"save_to\" = NULL, \"dir\" = ed )) # N-gram statistics are displayed print(df) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"method-get-file-info-","dir":"Reference","previous_headings":"","what":"Method get_file_info()","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"generates information text files. takes input file directory containing text files. file calculates total number lines, maximum, minimum mean line lengths total file size. file information returned data frame.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"","code":"DataAnalyzer$get_file_info(res)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"res name directory file name.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"returns-1","dir":"Reference","previous_headings":"","what":"Returns","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"data frame containing text file statistics.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"examples-1","dir":"Reference","previous_headings":"","what":"Examples","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"test.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The test file name cfn <- paste0(ed, \"/test.txt\") # The DataAnalyzer object is created da <- DataAnalyzer$new(ve = ve) # The file info is fetched fi <- da$get_file_info(cfn) # The file information is printed print(fi) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"method-get-ngrams-","dir":"Reference","previous_headings":"","what":"Method get_ngrams()","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"extracts given number n-grams frequencies n-gram token file. prefix parameter specifies regular expression matching n-grams. parameter specified given number n-grams randomly chosen.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"usage-3","dir":"Reference","previous_headings":"","what":"Usage","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"","code":"DataAnalyzer$get_ngrams(fn, c = NULL, pre = NULL)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"arguments-3","dir":"Reference","previous_headings":"","what":"Arguments","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"fn n-gram file name. c number n-grams return. pre n-gram prefix, given regular expression.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"examples-2","dir":"Reference","previous_headings":"","what":"Examples","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"n2.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The n-gram file name nfn <- paste0(ed, \"/n2.RDS\") # The DataAnalyzer object is created da <- DataAnalyzer$new(nfn, ve = ve) # Bi-grams starting with \"and_\" are returned df <- da$get_ngrams(fn = nfn, c = 10, pre = \"^and_*\") # The data frame is sorted by frequency df <- df[order(df$freq, decreasing = TRUE),] # The data frame is printed print(df) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"objects class cloneable method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"usage-4","dir":"Reference","previous_headings":"","what":"Usage","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"","code":"DataAnalyzer$clone(deep = FALSE)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"arguments-4","dir":"Reference","previous_headings":"","what":"Arguments","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"deep Whether make deep clone.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataAnalyzer.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Analyzes input text files and n-gram token files — DataAnalyzer","text":"","code":"## ------------------------------------------------ ## Method `DataAnalyzer$plot_n_gram_stats` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL value implies tempdir will # be used. fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"n2.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The n-gram file name nfn <- paste0(ed, \"/n2.RDS\") # The DataAnalyzer object is created da <- DataAnalyzer$new(nfn, ve = ve) # The top features plot is checked df <- da$plot_n_gram_stats(opts = list( \"type\" = \"top_features\", \"n\" = 10, \"save_to\" = NULL, \"dir\" = ed )) # N-gram statistics are displayed print(df) #> # A tibble: 10 × 2 #> pre freq #> #> 1 in_the 4 #> 2 of_the 4 #> 3 on_the 4 #> 4 to_the 4 #> 5 from_the 3 #> 6 in_a 3 #> 7 a_thin 2 #> 8 and_the 2 #> 9 between_the 2 #> 10 down_the 2 # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env() ## ------------------------------------------------ ## Method `DataAnalyzer$get_file_info` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"test.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The test file name cfn <- paste0(ed, \"/test.txt\") # The DataAnalyzer object is created da <- DataAnalyzer$new(ve = ve) # The file info is fetched fi <- da$get_file_info(cfn) # The file information is printed print(fi) #> $file_stats #> fn total_lc max_ll min_ll mean_ll size #> 1 /tmp/RtmpcJbhpv/test.txt 73 51 28 41 3 Kb #> #> $overall_stats #> total_lc max_ll min_ll mean_ll total_s #> 1 73 51 28 41 3 Kb #> # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env() ## ------------------------------------------------ ## Method `DataAnalyzer$get_ngrams` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"n2.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The n-gram file name nfn <- paste0(ed, \"/n2.RDS\") # The DataAnalyzer object is created da <- DataAnalyzer$new(nfn, ve = ve) # Bi-grams starting with \"and_\" are returned df <- da$get_ngrams(fn = nfn, c = 10, pre = \"^and_*\") # The data frame is sorted by frequency df <- df[order(df$freq, decreasing = TRUE),] # The data frame is printed print(df) #> # A tibble: 15 × 2 #> pre freq #> #> 1 and_the 2 #> 2 and_cart 1 #> 3 and_fired 1 #> 4 and_forget 1 #> 5 and_leave 1 #> 6 and_open 1 #> 7 and_out 1 #> 8 and_phrase 1 #> 9 and_say 1 #> 10 and_tea 1 #> 11 and_tell 1 #> 12 and_then 1 #> 13 and_threw 1 #> 14 and_was 1 #> 15 and_watch 1 # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":null,"dir":"Reference","previous_headings":"","what":"Provides data cleaning functionality — DataCleaner","title":"Provides data cleaning functionality — DataCleaner","text":"provides memory efficient method removing unneeded characters text files. suitable cleaning large text files.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Provides data cleaning functionality — DataCleaner","text":"provides method cleaning text files. allows removing bad words, stop words, non dictionary words, extra space, punctuation non-alphabet characters. also allows conversion lower case. supports large text files.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"super-class","dir":"Reference","previous_headings":"","what":"Super class","title":"Provides data cleaning functionality — DataCleaner","text":"wordpredictor::Base -> DataCleaner","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"methods","dir":"Reference","previous_headings":"","what":"Methods","title":"Provides data cleaning functionality — DataCleaner","text":"Inherited methods","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Provides data cleaning functionality — DataCleaner","text":"DataCleaner$new() DataCleaner$clean_file() DataCleaner$clean_lines() DataCleaner$clone()","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"Provides data cleaning functionality — DataCleaner","text":"initializes current object. used set file name verbose options.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Provides data cleaning functionality — DataCleaner","text":"","code":"DataCleaner$new(fn = NULL, opts = list(), ve = 0)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Provides data cleaning functionality — DataCleaner","text":"fn path file clean. opts options data cleaning. min_words. minimum number words per sentence. line_count. number lines read clean time. save_data. combined processed lines saved. output_file. Name output file used store data. sw_file. stop words file path. dict_file. dictionary file path. bad_file. bad words file path. to_lower. words converted lower case. remove_stop. stop words removed. remove_punct. punctuation symbols removed. remove_non_dict. non dictionary words removed. remove_non_alpha. -> non alphabet symbols removed. remove_extra_space. -> leading, trailing double spaces removed. remove_bad. bad words removed ve level detail information messages.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"method-clean-file-","dir":"Reference","previous_headings":"","what":"Method clean_file()","title":"Provides data cleaning functionality — DataCleaner","text":"provides efficient method cleaning text files. removes unneeded characters given text file several options. allows removing punctuation, bad words, stop words, non-alphabetical symbols non-dictionary words. reads certain number lines given text file. removes unneeded characters lines saves lines output text file. File cleaning progress displayed verbose option set class constructor. suitable cleaning large text files.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Provides data cleaning functionality — DataCleaner","text":"","code":"DataCleaner$clean_file()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Provides data cleaning functionality — DataCleaner","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"test.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The cleaned test file name cfn <- paste0(ed, \"/test-clean.txt\") # The test file name fn <- paste0(ed, \"/test.txt\") # The data cleaning options dc_opts <- list(\"output_file\" = cfn) # The data cleaner object is created dc <- DataCleaner$new(fn, dc_opts, ve = ve) # The sample file is cleaned dc$clean_file() # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"method-clean-lines-","dir":"Reference","previous_headings":"","what":"Method clean_lines()","title":"Provides data cleaning functionality — DataCleaner","text":"cleans given lines text using options passed current object.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Provides data cleaning functionality — DataCleaner","text":"","code":"DataCleaner$clean_lines(lines)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Provides data cleaning functionality — DataCleaner","text":"lines input sentences.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"returns","dir":"Reference","previous_headings":"","what":"Returns","title":"Provides data cleaning functionality — DataCleaner","text":"cleaned lines text.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"examples-1","dir":"Reference","previous_headings":"","what":"Examples","title":"Provides data cleaning functionality — DataCleaner","text":"","code":"# The level of detail in the information messages ve <- 0 # Test data is read l <- c( \"If you think I'm wrong, send me a link to where it's happened\", \"We're about 90percent done with this room\", \"This isn't how I wanted it between us.\", \"Almost any cute breed can become ornamental\", \"Once upon a time there was a kingdom with a castle\", \"That's not a thing any of us are granted'\", \"Why are you being so difficult? she asks.\" ) # The expected results res <- c( \"if you think wrong send me a link to where its happened\", \"were about percent done with this room\", \"this how i wanted it between us\", \"almost any cute breed can become ornamental\", \"once upon a time there was a kingdom with a castle\", \"thats not a thing any of us are granted\", \"why are you being so difficult she asks\" ) # The DataCleaner object is created dc <- DataCleaner$new(ve = ve) # The line is cleaned cl <- dc$clean_lines(l) # The cleaned lines are printed print(cl)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Provides data cleaning functionality — DataCleaner","text":"objects class cloneable method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"usage-3","dir":"Reference","previous_headings":"","what":"Usage","title":"Provides data cleaning functionality — DataCleaner","text":"","code":"DataCleaner$clone(deep = FALSE)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"Provides data cleaning functionality — DataCleaner","text":"deep Whether make deep clone.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataCleaner.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Provides data cleaning functionality — DataCleaner","text":"","code":"## ------------------------------------------------ ## Method `DataCleaner$clean_file` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"test.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The cleaned test file name cfn <- paste0(ed, \"/test-clean.txt\") # The test file name fn <- paste0(ed, \"/test.txt\") # The data cleaning options dc_opts <- list(\"output_file\" = cfn) # The data cleaner object is created dc <- DataCleaner$new(fn, dc_opts, ve = ve) # The sample file is cleaned dc$clean_file() # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env() ## ------------------------------------------------ ## Method `DataCleaner$clean_lines` ## ------------------------------------------------ # The level of detail in the information messages ve <- 0 # Test data is read l <- c( \"If you think I'm wrong, send me a link to where it's happened\", \"We're about 90percent done with this room\", \"This isn't how I wanted it between us.\", \"Almost any cute breed can become ornamental\", \"Once upon a time there was a kingdom with a castle\", \"That's not a thing any of us are granted'\", \"Why are you being so difficult? she asks.\" ) # The expected results res <- c( \"if you think wrong send me a link to where its happened\", \"were about percent done with this room\", \"this how i wanted it between us\", \"almost any cute breed can become ornamental\", \"once upon a time there was a kingdom with a castle\", \"thats not a thing any of us are granted\", \"why are you being so difficult she asks\" ) # The DataCleaner object is created dc <- DataCleaner$new(ve = ve) # The line is cleaned cl <- dc$clean_lines(l) # The cleaned lines are printed print(cl) #> [1] \"if you think wrong send me a link to where its happened\" #> [2] \"were about percent done with this room\" #> [3] \"this how i wanted it between us\" #> [4] \"almost any cute breed can become ornamental\" #> [5] \"once upon a time there was a kingdom with a castle\" #> [6] \"thats not a thing any of us are granted\" #> [7] \"why are you being so difficult she asks\""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates data samples from text files — DataSampler","title":"Generates data samples from text files — DataSampler","text":"provides method generating training, testing validation data sets given input text file. also provides method generating sample file given size number lines input text file. contents sample file may cleaned randomized.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"super-class","dir":"Reference","previous_headings":"","what":"Super class","title":"Generates data samples from text files — DataSampler","text":"wordpredictor::Base -> DataSampler","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"methods","dir":"Reference","previous_headings":"","what":"Methods","title":"Generates data samples from text files — DataSampler","text":"Inherited methods","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Generates data samples from text files — DataSampler","text":"DataSampler$new() DataSampler$generate_sample() DataSampler$generate_data() DataSampler$clone()","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"Generates data samples from text files — DataSampler","text":"initializes current object. used set verbose option.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates data samples from text files — DataSampler","text":"","code":"DataSampler$new(dir = \".\", ve = 0)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates data samples from text files — DataSampler","text":"dir directory storing input output files. ve level detail information messages.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"method-generate-sample-","dir":"Reference","previous_headings":"","what":"Method generate_sample()","title":"Generates data samples from text files — DataSampler","text":"Generates sample file given size given input file. file saved directory given dir object attribute. file generated, contents may cleaned randomized.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates data samples from text files — DataSampler","text":"","code":"DataSampler$generate_sample(fn, ss, ic, ir, ofn, is, dc_opts = NULL)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates data samples from text files — DataSampler","text":"fn input file name. short file name relative dir attribute. ss number lines proportion lines sample. ic sample file cleaned. ir sample file contents randomized. ofn output file name. saved dir. sampled data saved file. dc_opts options cleaning data.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates data samples from text files — DataSampler","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"input.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The sample file name sfn <- paste0(ed, \"/sample.txt\") # An object of class DataSampler is created ds <- DataSampler$new(dir = ed, ve = ve) # The sample file is generated ds$generate_sample( fn = \"input.txt\", ss = 0.5, ic = FALSE, ir = FALSE, ofn = \"sample.txt\", is = TRUE ) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"method-generate-data-","dir":"Reference","previous_headings":"","what":"Method generate_data()","title":"Generates data samples from text files — DataSampler","text":"generates training, testing validation data sets given input file. first reads file given parameter current object. partitions data training, testing validation sets, according perc parameter. files named train.txt, test.txt va.txt saved given output folder.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates data samples from text files — DataSampler","text":"","code":"DataSampler$generate_data(fn, percs)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates data samples from text files — DataSampler","text":"fn input file name. relative dir attribute. percs size training, testing validation sets.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"examples-1","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates data samples from text files — DataSampler","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be # used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"input.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve) # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The files to clean fns <- c(\"train\", \"test\", \"validate\") # An object of class DataSampler is created ds <- DataSampler$new(dir = ed, ve = ve) # The train, test and validation files are generated ds$generate_data( fn = \"input.txt\", percs = list( \"train\" = 0.8, \"test\" = 0.1, \"validate\" = 0.1 ) ) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Generates data samples from text files — DataSampler","text":"objects class cloneable method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"usage-3","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates data samples from text files — DataSampler","text":"","code":"DataSampler$clone(deep = FALSE)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"arguments-3","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates data samples from text files — DataSampler","text":"deep Whether make deep clone.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/DataSampler.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates data samples from text files — DataSampler","text":"","code":"## ------------------------------------------------ ## Method `DataSampler$generate_sample` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"input.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The sample file name sfn <- paste0(ed, \"/sample.txt\") # An object of class DataSampler is created ds <- DataSampler$new(dir = ed, ve = ve) # The sample file is generated ds$generate_sample( fn = \"input.txt\", ss = 0.5, ic = FALSE, ir = FALSE, ofn = \"sample.txt\", is = TRUE ) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env() ## ------------------------------------------------ ## Method `DataSampler$generate_data` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be # used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"input.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve) # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The files to clean fns <- c(\"train\", \"test\", \"validate\") # An object of class DataSampler is created ds <- DataSampler$new(dir = ed, ve = ve) # The train, test and validation files are generated ds$generate_data( fn = \"input.txt\", percs = list( \"train\" = 0.8, \"test\" = 0.1, \"validate\" = 0.1 ) ) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":null,"dir":"Reference","previous_headings":"","what":"Allows managing the test environment — EnvManager","title":"Allows managing the test environment — EnvManager","text":"class provides method creating directories tempdir folder testing purposes. also provides method reading files inst/extdata folder.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"super-class","dir":"Reference","previous_headings":"","what":"Super class","title":"Allows managing the test environment — EnvManager","text":"wordpredictor::Base -> EnvManager","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"methods","dir":"Reference","previous_headings":"","what":"Methods","title":"Allows managing the test environment — EnvManager","text":"Inherited methods","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Allows managing the test environment — EnvManager","text":"EnvManager$new() EnvManager$get_data_fn() EnvManager$remove_files() EnvManager$td_env() EnvManager$cp_env() EnvManager$setup_env() EnvManager$clone()","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"Allows managing the test environment — EnvManager","text":"initializes current object. simply calls base class constructor.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows managing the test environment — EnvManager","text":"","code":"EnvManager$new(rp = \"../../\", ve = 0)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Allows managing the test environment — EnvManager","text":"rp prefix accessing package root folder. ve level detail information messages.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"method-get-data-fn-","dir":"Reference","previous_headings":"","what":"Method get_data_fn()","title":"Allows managing the test environment — EnvManager","text":"Checks given file exists. exist, tries load file inst/extdata data folder package. throws error file found. file exists, method simply returns file name.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows managing the test environment — EnvManager","text":"","code":"EnvManager$get_data_fn(fn, dfn)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Allows managing the test environment — EnvManager","text":"fn file name. dfn name default file external data folder package.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"returns","dir":"Reference","previous_headings":"","what":"Returns","title":"Allows managing the test environment — EnvManager","text":"name file exists, full path default file.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"method-remove-files-","dir":"Reference","previous_headings":"","what":"Method remove_files()","title":"Allows managing the test environment — EnvManager","text":"Removes files given directory.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows managing the test environment — EnvManager","text":"","code":"EnvManager$remove_files(dn)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"Allows managing the test environment — EnvManager","text":"dn directory name.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"method-td-env-","dir":"Reference","previous_headings":"","what":"Method td_env()","title":"Allows managing the test environment — EnvManager","text":"Removes ed folder created setup_env method. Also sets R option, \"ed\" NULL.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"usage-3","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows managing the test environment — EnvManager","text":"","code":"EnvManager$td_env(rf = F)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"arguments-3","dir":"Reference","previous_headings":"","what":"Arguments","title":"Allows managing the test environment — EnvManager","text":"rf environment folder removed.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"method-cp-env-","dir":"Reference","previous_headings":"","what":"Method cp_env()","title":"Allows managing the test environment — EnvManager","text":"Copies ed folder created setup_env method inst/extdata.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"usage-4","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows managing the test environment — EnvManager","text":"","code":"EnvManager$cp_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"method-setup-env-","dir":"Reference","previous_headings":"","what":"Method setup_env()","title":"Allows managing the test environment — EnvManager","text":"Copies given files test folder environment folder.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"usage-5","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows managing the test environment — EnvManager","text":"","code":"EnvManager$setup_env(fns = c(), cf = NULL)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"arguments-4","dir":"Reference","previous_headings":"","what":"Arguments","title":"Allows managing the test environment — EnvManager","text":"fns list test files copy cf custom environment folder. path relative current directory. specified, tempdir function used generate environment folder.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"returns-1","dir":"Reference","previous_headings":"","what":"Returns","title":"Allows managing the test environment — EnvManager","text":"list folders can used testing.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Allows managing the test environment — EnvManager","text":"objects class cloneable method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"usage-6","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows managing the test environment — EnvManager","text":"","code":"EnvManager$clone(deep = FALSE)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/EnvManager.html","id":"arguments-5","dir":"Reference","previous_headings":"","what":"Arguments","title":"Allows managing the test environment — EnvManager","text":"deep Whether make deep clone.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":null,"dir":"Reference","previous_headings":"","what":"Represents n-gram models — Model","title":"Represents n-gram models — Model","text":"Model class represents n-gram models. instance class single n-gram model. attributes class used store n-gram model information. class provides methods loading saving model.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Represents n-gram models — Model","text":"attributes class used store n-gram model information model name, model description, model file name, n-gram size, transition probabilities data, default probability words, data cleaning tokenization options, word list, model path, data directory path performance stats. model saved single file R object. model file contains information required model. model object used input classes perform operations model evaluation model performance, text predictions comparison model performance.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"super-class","dir":"Reference","previous_headings":"","what":"Super class","title":"Represents n-gram models — Model","text":"wordpredictor::Base -> Model","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"public-fields","dir":"Reference","previous_headings":"","what":"Public fields","title":"Represents n-gram models — Model","text":"pstats performance stats model. name model name. desc model description.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"methods","dir":"Reference","previous_headings":"","what":"Methods","title":"Represents n-gram models — Model","text":"Inherited methods","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Represents n-gram models — Model","text":"Model$new() Model$load_model() Model$get_config() Model$get_size() Model$clone()","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"Represents n-gram models — Model","text":"initializes current object. used set maximum n-gram number, sample size, input file name, data cleaner options, tokenization options, combined transition probabilities file name verbose.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Represents n-gram models — Model","text":"","code":"Model$new( name = NULL, desc = NULL, fn = NULL, df = NULL, n = 4, ssize = 0.3, dir = \".\", dc_opts = list(), tg_opts = list(), ve = 0 )"},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Represents n-gram models — Model","text":"name model name. desc model description. fn model file name. df name file used generate model. n maximum n-gram number supported model. ssize sample size proportion input file. dir directory containing model files. dc_opts data cleaner options. tg_opts token generator options. ve level detail information messages.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"method-load-model-","dir":"Reference","previous_headings":"","what":"Method load_model()","title":"Represents n-gram models — Model","text":"loads model using given information","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Represents n-gram models — Model","text":"","code":"Model$load_model()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"method-get-config-","dir":"Reference","previous_headings":"","what":"Method get_config()","title":"Represents n-gram models — Model","text":"returns given configuration data","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Represents n-gram models — Model","text":"","code":"Model$get_config(cn)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Represents n-gram models — Model","text":"cn name required configuration.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"returns","dir":"Reference","previous_headings":"","what":"Returns","title":"Represents n-gram models — Model","text":"configuration value.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"method-get-size-","dir":"Reference","previous_headings":"","what":"Method get_size()","title":"Represents n-gram models — Model","text":"returns size current object. object size calculated sum sizes object attributes.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"usage-3","dir":"Reference","previous_headings":"","what":"Usage","title":"Represents n-gram models — Model","text":"","code":"Model$get_size()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"returns-1","dir":"Reference","previous_headings":"","what":"Returns","title":"Represents n-gram models — Model","text":"size object bytes.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Represents n-gram models — Model","text":"objects class cloneable method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"usage-4","dir":"Reference","previous_headings":"","what":"Usage","title":"Represents n-gram models — Model","text":"","code":"Model$clone(deep = FALSE)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/Model.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"Represents n-gram models — Model","text":"deep Whether make deep clone.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":null,"dir":"Reference","previous_headings":"","what":"Evaluates performance of n-gram models — ModelEvaluator","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"provides methods performing extrinsic intrinsic evaluation n-gram model. also provides method comparing performance multiple n-gram models. Intrinsic evaluation based calculation Perplexity. Extrinsic evaluation involves determining percentage correct next word predictions.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"performing intrinsic extrinsic model evaluation, validation file must first generated. can done using DataSampler class. line validation file evaluated. intrinsic evaluation Perplexity line calculated. overall summary Perplexity calculations returned. includes min, max mean Perplexity. extrinsic evaluation, next word prediction performed line. actual next word one three predicted next words, prediction considered accurate. extrinsic evaluation returns percentage correct incorrect predictions.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"super-class","dir":"Reference","previous_headings":"","what":"Super class","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"wordpredictor::Base -> ModelEvaluator","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"methods","dir":"Reference","previous_headings":"","what":"Methods","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"Inherited methods","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"ModelEvaluator$new() ModelEvaluator$compare_performance() ModelEvaluator$plot_stats() ModelEvaluator$evaluate_performance() ModelEvaluator$intrinsic_evaluation() ModelEvaluator$extrinsic_evaluation() ModelEvaluator$clone()","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"initializes current object. used set model file name verbose options.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"ModelEvaluator$new(mf = NULL, ve = 0)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"mf model file name. ve level detail information messages.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"method-compare-performance-","dir":"Reference","previous_headings":"","what":"Method compare_performance()","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"compares performance models given folder. performance model compared 4 metric time taken, memory used, Perplexity accuracy. performance comparison displayed plots. 4 plots displayed. One performance metric. fifth plot shows variation Perplexity accuracy. 5 plots plotted one page.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"ModelEvaluator$compare_performance(opts)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"opts options comparing model performance. save_to. graphics device save plot . NULL implies plot printed. dir. directory containing model file, plot stats.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be # used. fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # ModelEvaluator class object is created me <- ModelEvaluator$new(ve = ve) # The performance evaluation is performed me$compare_performance(opts = list( \"save_to\" = NULL, \"dir\" = ed )) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"method-plot-stats-","dir":"Reference","previous_headings":"","what":"Method plot_stats()","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"plots given stats 5 plots. plots displayed single page. 4 performance metrics time taken, memory, Perplexity accuracy plotted model name. Another plot compares Perplexity accuracy model.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"ModelEvaluator$plot_stats(data)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"data data plot","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"returns","dir":"Reference","previous_headings":"","what":"Returns","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"ggplot object returned.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"method-evaluate-performance-","dir":"Reference","previous_headings":"","what":"Method evaluate_performance()","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"performs intrinsic extrinsic evaluation given model validation text file. given number lines validation file used evaluation performs two types evaluations. One intrinsic evaluation, based Perplexity, extrinsic evaluation based accuracy. returns results evaluation. 4 evaluation metrics returned. Perplexity, accuracy, memory time taken. Memory size model object. Time taken time needed performing evaluations. results model evaluation saved within model object also returned.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"usage-3","dir":"Reference","previous_headings":"","what":"Usage","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"ModelEvaluator$evaluate_performance(lc, fn)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"arguments-3","dir":"Reference","previous_headings":"","what":"Arguments","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"lc number lines text validation file used evaluation. fn name validation file. exist, default file validation-clean.txt checked models folder","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"returns-1","dir":"Reference","previous_headings":"","what":"Returns","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"performance stats returned.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"examples-1","dir":"Reference","previous_headings":"","what":"Examples","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\", \"validate-clean.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # The validation file name vfn <- paste0(ed, \"/validate-clean.txt\") # ModelEvaluator class object is created me <- ModelEvaluator$new(mf = mfn, ve = ve) # The performance evaluation is performed stats <- me$evaluate_performance(lc = 20, fn = vfn) # The evaluation stats are printed print(stats) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"method-intrinsic-evaluation-","dir":"Reference","previous_headings":"","what":"Method intrinsic_evaluation()","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"Evaluates model using intrinsic evaluation based Perplexity. given number sentences taken validation file. sentence, Perplexity calculated.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"usage-4","dir":"Reference","previous_headings":"","what":"Usage","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"ModelEvaluator$intrinsic_evaluation(lc, fn)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"arguments-4","dir":"Reference","previous_headings":"","what":"Arguments","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"lc number lines text validation file used evaluation. fn name validation file. exist, default file validation-clean.txt checked models folder","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"returns-2","dir":"Reference","previous_headings":"","what":"Returns","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"min, max mean Perplexity score.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"examples-2","dir":"Reference","previous_headings":"","what":"Examples","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\", \"validate-clean.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # The validation file name vfn <- paste0(ed, \"/validate-clean.txt\") # ModelEvaluator class object is created me <- ModelEvaluator$new(mf = mfn, ve = ve) # The intrinsic evaluation is performed stats <- me$intrinsic_evaluation(lc = 20, fn = vfn) # The evaluation stats are printed print(stats) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"method-extrinsic-evaluation-","dir":"Reference","previous_headings":"","what":"Method extrinsic_evaluation()","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"Evaluates model using extrinsic evaluation based Accuracy. given number sentences taken validation file. sentence, model used predict next word. accuracy stats returned. prediction considered correct one predicted words matches actual word.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"usage-5","dir":"Reference","previous_headings":"","what":"Usage","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"ModelEvaluator$extrinsic_evaluation(lc, fn)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"arguments-5","dir":"Reference","previous_headings":"","what":"Arguments","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"lc number lines text validation file used evaluation. fn name validation file.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"returns-3","dir":"Reference","previous_headings":"","what":"Returns","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"number correct incorrect predictions.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"examples-3","dir":"Reference","previous_headings":"","what":"Examples","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\", \"validate-clean.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # The validation file name vfn <- paste0(ed, \"/validate-clean.txt\") # ModelEvaluator class object is created me <- ModelEvaluator$new(mf = mfn, ve = ve) # The intrinsic evaluation is performed stats <- me$extrinsic_evaluation(lc = 100, fn = vfn) # The evaluation stats are printed print(stats) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"objects class cloneable method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"usage-6","dir":"Reference","previous_headings":"","what":"Usage","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"ModelEvaluator$clone(deep = FALSE)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"arguments-6","dir":"Reference","previous_headings":"","what":"Arguments","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"deep Whether make deep clone.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelEvaluator.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Evaluates performance of n-gram models — ModelEvaluator","text":"","code":"## ------------------------------------------------ ## Method `ModelEvaluator$compare_performance` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be # used. fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # ModelEvaluator class object is created me <- ModelEvaluator$new(ve = ve) # The performance evaluation is performed me$compare_performance(opts = list( \"save_to\" = NULL, \"dir\" = ed )) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env() ## ------------------------------------------------ ## Method `ModelEvaluator$evaluate_performance` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\", \"validate-clean.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # The validation file name vfn <- paste0(ed, \"/validate-clean.txt\") # ModelEvaluator class object is created me <- ModelEvaluator$new(mf = mfn, ve = ve) # The performance evaluation is performed stats <- me$evaluate_performance(lc = 20, fn = vfn) # The evaluation stats are printed print(stats) #> $m #> [1] 279320 #> #> $t #> [1] 1.018 #> #> $p #> [1] 2297.35 #> #> $a #> [1] 0 #> # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env() ## ------------------------------------------------ ## Method `ModelEvaluator$intrinsic_evaluation` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\", \"validate-clean.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # The validation file name vfn <- paste0(ed, \"/validate-clean.txt\") # ModelEvaluator class object is created me <- ModelEvaluator$new(mf = mfn, ve = ve) # The intrinsic evaluation is performed stats <- me$intrinsic_evaluation(lc = 20, fn = vfn) # The evaluation stats are printed print(stats) #> $min #> [1] 282 #> #> $max #> [1] 8248 #> #> $mean #> [1] 2297.35 #> # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env() ## ------------------------------------------------ ## Method `ModelEvaluator$extrinsic_evaluation` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\", \"validate-clean.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # The validation file name vfn <- paste0(ed, \"/validate-clean.txt\") # ModelEvaluator class object is created me <- ModelEvaluator$new(mf = mfn, ve = ve) # The intrinsic evaluation is performed stats <- me$extrinsic_evaluation(lc = 100, fn = vfn) # The evaluation stats are printed print(stats) #> $valid #> [1] 1 #> #> $invalid #> [1] 74 #> #> $valid_perc #> [1] 1.333333 #> #> $invalid_perc #> [1] 98.66667 #> # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates n-gram models from a text file — ModelGenerator","title":"Generates n-gram models from a text file — ModelGenerator","text":"provides method generating n-gram models. n-gram models may customized specifying data cleaning tokenization options.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates n-gram models from a text file — ModelGenerator","text":"provides method generates n-gram model. n-gram model may customized specifying data cleaning tokenization options. data cleaning options include removal punctuation, stop words, extra space, non-dictionary words bad words. tokenization options include n-gram number word stemming.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"super-class","dir":"Reference","previous_headings":"","what":"Super class","title":"Generates n-gram models from a text file — ModelGenerator","text":"wordpredictor::Base -> ModelGenerator","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"methods","dir":"Reference","previous_headings":"","what":"Methods","title":"Generates n-gram models from a text file — ModelGenerator","text":"Inherited methods","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Generates n-gram models from a text file — ModelGenerator","text":"ModelGenerator$new() ModelGenerator$generate_model() ModelGenerator$clone()","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"Generates n-gram models from a text file — ModelGenerator","text":"initializes current object. used set maximum n-gram number, sample size, input file name, data cleaner options, tokenization options verbose option.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates n-gram models from a text file — ModelGenerator","text":"","code":"ModelGenerator$new( name = NULL, desc = NULL, fn = NULL, df = NULL, n = 4, ssize = 0.3, dir = \".\", dc_opts = list(), tg_opts = list(), ve = 0 )"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates n-gram models from a text file — ModelGenerator","text":"name model name. desc model description. fn model file name. df path input text file. short file name present data directory. n n-gram size model. ssize sample size proportion input file. dir directory containing input output files. dc_opts data cleaner options. tg_opts token generator options. ve level detail information messages.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"method-generate-model-","dir":"Reference","previous_headings":"","what":"Method generate_model()","title":"Generates n-gram models from a text file — ModelGenerator","text":"generates model using parameters passed object's constructor. generates n-gram model file saves model directory.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates n-gram models from a text file — ModelGenerator","text":"","code":"ModelGenerator$generate_model()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates n-gram models from a text file — ModelGenerator","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"input.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # ModelGenerator class object is created mg <- ModelGenerator$new( name = \"default-model\", desc = \"1 MB size and default options\", fn = \"def-model.RDS\", df = \"input.txt\", n = 4, ssize = 0.99, dir = ed, dc_opts = list(), tg_opts = list(), ve = ve ) # The n-gram model is generated mg$generate_model() # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Generates n-gram models from a text file — ModelGenerator","text":"objects class cloneable method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates n-gram models from a text file — ModelGenerator","text":"","code":"ModelGenerator$clone(deep = FALSE)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates n-gram models from a text file — ModelGenerator","text":"deep Whether make deep clone.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelGenerator.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates n-gram models from a text file — ModelGenerator","text":"","code":"## ------------------------------------------------ ## Method `ModelGenerator$generate_model` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"input.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # ModelGenerator class object is created mg <- ModelGenerator$new( name = \"default-model\", desc = \"1 MB size and default options\", fn = \"def-model.RDS\", df = \"input.txt\", n = 4, ssize = 0.99, dir = ed, dc_opts = list(), tg_opts = list(), ve = ve ) # The n-gram model is generated mg$generate_model() # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":null,"dir":"Reference","previous_headings":"","what":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"provides method predicting new word given set previous words. also provides method calculating Perplexity score set words. Furthermore provides method calculating probability given word set previous words.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"super-class","dir":"Reference","previous_headings":"","what":"Super class","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"wordpredictor::Base -> ModelPredictor","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"methods","dir":"Reference","previous_headings":"","what":"Methods","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"Inherited methods","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"ModelPredictor$new() ModelPredictor$get_model() ModelPredictor$calc_perplexity() ModelPredictor$predict_word() ModelPredictor$get_word_prob() ModelPredictor$clone()","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"initializes current object. used set model file name verbose options.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"","code":"ModelPredictor$new(mf, ve = 0)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"mf model file name. ve level detail information messages.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"method-get-model-","dir":"Reference","previous_headings":"","what":"Method get_model()","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"Returns Model class object.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"","code":"ModelPredictor$get_model()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"returns","dir":"Reference","previous_headings":"","what":"Returns","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"Model class object returned.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"method-calc-perplexity-","dir":"Reference","previous_headings":"","what":"Method calc_perplexity()","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"Perplexity given sentence calculated. word, probability word given previous words calculated. probabilities multiplied inverted. nth root result perplexity, n number words sentence. stem_words tokenization option specified creating given model file, previous words converted stems.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"","code":"ModelPredictor$calc_perplexity(words)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"words list words.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"returns-1","dir":"Reference","previous_headings":"","what":"Returns","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"perplexity given list words.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # ModelPredictor class object is created mp <- ModelPredictor$new(mf = mfn, ve = ve) # The sentence whoose Perplexity is to be calculated l <- \"last year at this time i was preparing for a trip to rome\" # The line is split in to words w <- strsplit(l, \" \")[[1]] # The Perplexity of the sentence is calculated p <- mp$calc_perplexity(w) # The sentence Perplexity is printed print(p) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"method-predict-word-","dir":"Reference","previous_headings":"","what":"Method predict_word()","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"Predicts next word given list previous words. checks last n previous words transition probabilities data, n equal 1 - n-gram size model. match, top 3 next words highest probabilities returned. match, last n-1 previous words checked. process continued last word checked. match, empty result returned. given words may optionally stemmed.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"usage-3","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"","code":"ModelPredictor$predict_word(words, count = 3, dc = NULL)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"words character vector previous words single vector containing previous word text. count number results return. dc DataCleaner object. given, given words","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"returns-2","dir":"Reference","previous_headings":"","what":"Returns","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"top 3 predicted words along probabilities.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"examples-1","dir":"Reference","previous_headings":"","what":"Examples","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, \"rp\" = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # ModelPredictor class object is created mp <- ModelPredictor$new(mf = mfn, ve = ve) # The next word is predicted nws <- mp$predict_word(\"today is\", count = 10) # The predicted next words are printed print(nws) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"method-get-word-prob-","dir":"Reference","previous_headings":"","what":"Method get_word_prob()","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"Calculates probability given word given previous words. last n words converted numeric hash using digest2int function. words ignored. n equal 1 - size n-gram model. hash looked data frame transition probabilities. last word converted number checking position list unique words. hash word position found, probability previous word hash returned. found, hash n-1 previous words taken processed repeated. data found data frame, word probability returned. known back-. word probability found default probability returned. default probability calculated 1/(N+V), N = number words corpus V number dictionary words.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"usage-4","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"","code":"ModelPredictor$get_word_prob(word, pw)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"arguments-3","dir":"Reference","previous_headings":"","what":"Arguments","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"word word whose probability calculated. pw previous words.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"returns-3","dir":"Reference","previous_headings":"","what":"Returns","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"probability word given previous words.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"examples-2","dir":"Reference","previous_headings":"","what":"Examples","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, \"rp\" = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # ModelPredictor class object is created mp <- ModelPredictor$new(mf = mfn, ve = ve) # The probability that the next word is \"you\" given the prev words # \"how\" and \"are\" prob <- mp$get_word_prob(word = \"you\", pw = c(\"how\", \"are\")) # The probability is printed print(prob) # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"objects class cloneable method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"usage-5","dir":"Reference","previous_headings":"","what":"Usage","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"","code":"ModelPredictor$clone(deep = FALSE)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"arguments-4","dir":"Reference","previous_headings":"","what":"Arguments","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"deep Whether make deep clone.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/ModelPredictor.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Allows predicting text, calculating word probabilities and Perplexity — ModelPredictor","text":"","code":"## ------------------------------------------------ ## Method `ModelPredictor$calc_perplexity` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # ModelPredictor class object is created mp <- ModelPredictor$new(mf = mfn, ve = ve) # The sentence whoose Perplexity is to be calculated l <- \"last year at this time i was preparing for a trip to rome\" # The line is split in to words w <- strsplit(l, \" \")[[1]] # The Perplexity of the sentence is calculated p <- mp$calc_perplexity(w) # The sentence Perplexity is printed print(p) #> [1] 1767 # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env() ## ------------------------------------------------ ## Method `ModelPredictor$predict_word` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, \"rp\" = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # ModelPredictor class object is created mp <- ModelPredictor$new(mf = mfn, ve = ve) # The next word is predicted nws <- mp$predict_word(\"today is\", count = 10) # The predicted next words are printed print(nws) #> $found #> [1] TRUE #> #> $words #> [1] \"a\" \"the\" \"used\" \"better\" \"hard\" \"rare\" \"to\" \"best\" #> [9] \"carved\" \"dry\" #> #> $probs #> [1] 0.17460317 0.11111111 0.06349206 0.03174603 0.03174603 0.03174603 #> [7] 0.03174603 0.01587302 0.01587302 0.01587302 #> # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env() ## ------------------------------------------------ ## Method `ModelPredictor$get_word_prob` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"def-model.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, \"rp\" = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The model file name mfn <- paste0(ed, \"/def-model.RDS\") # ModelPredictor class object is created mp <- ModelPredictor$new(mf = mfn, ve = ve) # The probability that the next word is \"you\" given the prev words # \"how\" and \"are\" prob <- mp$get_word_prob(word = \"you\", pw = c(\"how\", \"are\")) # The probability is printed print(prob) #> [1] 0.0024581 # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates transition probabilities for n-grams — TPGenerator","title":"Generates transition probabilities for n-grams — TPGenerator","text":"provides method generating transition probabilities given n-gram size. also provides method generating combined transition probabilities data n-gram sizes 1 given size. combined transition probabilities data can used implement back-.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generates transition probabilities for n-grams — TPGenerator","text":"provides method generating n-gram transition probabilities. reads n-gram frequencies input text file generated TokenGenerator class. parses n-gram prefix, next word, next word frequency next word probability. Maximum Likelihood count used generate next word probabilities. n-gram prefix converted numeric hash using digest2int function. next word replaced position next word list words. transition probabilities data stored dataframe file. Another method provided combines transition probabilities n-grams size 1 given size. combined transition probabilities can saved file data frame. file may regarded completed self contained n-gram model. combining transition probabilities n-grams, back-may used evaluate word probabilities predict next word.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"super-class","dir":"Reference","previous_headings":"","what":"Super class","title":"Generates transition probabilities for n-grams — TPGenerator","text":"wordpredictor::Base -> TPGenerator","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"methods","dir":"Reference","previous_headings":"","what":"Methods","title":"Generates transition probabilities for n-grams — TPGenerator","text":"Inherited methods","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Generates transition probabilities for n-grams — TPGenerator","text":"TPGenerator$new() TPGenerator$generate_tp() TPGenerator$generate_tp_for_n() TPGenerator$clone()","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"Generates transition probabilities for n-grams — TPGenerator","text":"initializes current obj. used set transition probabilities options verbose option.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates transition probabilities for n-grams — TPGenerator","text":"","code":"TPGenerator$new(opts = list(), ve = 0)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates transition probabilities for n-grams — TPGenerator","text":"opts options generating transition probabilities. save_tp. data saved. n. n-gram size. dir. directory containing input output files. format. format output. two options. plain. data stored plain text. obj. data stored R obj. ve level detail information messages.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"method-generate-tp-","dir":"Reference","previous_headings":"","what":"Method generate_tp()","title":"Generates transition probabilities for n-grams — TPGenerator","text":"first generates transition probabilities n-gram size 1 given size. transition probabilities combined single data frame saved output folder given parameter current object. combining transition probabilities n-gram sizes 1 n, back-can used calculate next word probabilities predict next word.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates transition probabilities for n-grams — TPGenerator","text":"","code":"TPGenerator$generate_tp()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates transition probabilities for n-grams — TPGenerator","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"n1.RDS\", \"n2.RDS\", \"n3.RDS\", \"n4.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The list of output files fns <- c(\"words\", \"model-4\", \"tp2\", \"tp3\", \"tp4\") # The TPGenerator object is created tp <- TPGenerator$new(opts = list(n = 4, dir = ed), ve = ve) # The combined transition probabilities are generated tp$generate_tp() # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"method-generate-tp-for-n-","dir":"Reference","previous_headings":"","what":"Method generate_tp_for_n()","title":"Generates transition probabilities for n-grams — TPGenerator","text":"generates transition probabilities table given n-gram size. first reads n-gram token frequencies input text file. generates data frame whose columns n-gram prefix, next word next word frequency. data frame may saved file plain text R obj. n = 1, list words saved.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates transition probabilities for n-grams — TPGenerator","text":"","code":"TPGenerator$generate_tp_for_n(n)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates transition probabilities for n-grams — TPGenerator","text":"n n-gram size tp data generated.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Generates transition probabilities for n-grams — TPGenerator","text":"objects class cloneable method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"usage-3","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates transition probabilities for n-grams — TPGenerator","text":"","code":"TPGenerator$clone(deep = FALSE)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates transition probabilities for n-grams — TPGenerator","text":"deep Whether make deep clone.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates transition probabilities for n-grams — TPGenerator","text":"","code":"## ------------------------------------------------ ## Method `TPGenerator$generate_tp` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"n1.RDS\", \"n2.RDS\", \"n3.RDS\", \"n4.RDS\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The list of output files fns <- c(\"words\", \"model-4\", \"tp2\", \"tp3\", \"tp4\") # The TPGenerator object is created tp <- TPGenerator$new(opts = list(n = 4, dir = ed), ve = ve) # The combined transition probabilities are generated tp$generate_tp() # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":null,"dir":"Reference","previous_headings":"","what":"Generates n-grams from text files — TokenGenerator","title":"Generates n-grams from text files — TokenGenerator","text":"generates n-gram tokens along frequencies. data may saved file plain text format R object.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"super-class","dir":"Reference","previous_headings":"","what":"Super class","title":"Generates n-grams from text files — TokenGenerator","text":"wordpredictor::Base -> TokenGenerator","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"methods","dir":"Reference","previous_headings":"","what":"Methods","title":"Generates n-grams from text files — TokenGenerator","text":"Inherited methods","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Generates n-grams from text files — TokenGenerator","text":"TokenGenerator$new() TokenGenerator$generate_tokens() TokenGenerator$clone()","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"Generates n-grams from text files — TokenGenerator","text":"initializes current obj. used set file name, tokenization options verbose option.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates n-grams from text files — TokenGenerator","text":"","code":"TokenGenerator$new(fn = NULL, opts = list(), ve = 0)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates n-grams from text files — TokenGenerator","text":"fn path input file. opts options generating n-gram tokens. n. n-gram size. save_ngrams. n-gram data saved. min_freq. n-grams frequency less min_freq ignored. line_count. number lines process time. stem_words. words transformed stems. dir. dir output file saved. format. format output. two options. plain. data stored plain text. obj. data stored R obj. ve level detail information messages.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"method-generate-tokens-","dir":"Reference","previous_headings":"","what":"Method generate_tokens()","title":"Generates n-grams from text files — TokenGenerator","text":"generates n-gram tokens frequencies given file name. tokens may saved text file plain text R object.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates n-grams from text files — TokenGenerator","text":"","code":"TokenGenerator$generate_tokens()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"returns","dir":"Reference","previous_headings":"","what":"Returns","title":"Generates n-grams from text files — TokenGenerator","text":"data frame containing n-gram tokens along frequencies.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates n-grams from text files — TokenGenerator","text":"","code":"# Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"test-clean.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The n-gram size n <- 4 # The test file name tfn <- paste0(ed, \"/test-clean.txt\") # The n-gram number is set tg_opts <- list(\"n\" = n, \"save_ngrams\" = TRUE, \"dir\" = ed) # The TokenGenerator object is created tg <- TokenGenerator$new(tfn, tg_opts, ve = ve) # The n-gram tokens are generated tg$generate_tokens() # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Generates n-grams from text files — TokenGenerator","text":"objects class cloneable method.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Generates n-grams from text files — TokenGenerator","text":"","code":"TokenGenerator$clone(deep = FALSE)"},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generates n-grams from text files — TokenGenerator","text":"deep Whether make deep clone.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generates n-grams from text files — TokenGenerator","text":"","code":"## ------------------------------------------------ ## Method `TokenGenerator$generate_tokens` ## ------------------------------------------------ # Start of environment setup code # The level of detail in the information messages ve <- 0 # The name of the folder that will contain all the files. It will be # created in the current directory. NULL implies tempdir will be used fn <- NULL # The required files. They are default files that are part of the # package rf <- c(\"test-clean.txt\") # An object of class EnvManager is created em <- EnvManager$new(ve = ve, rp = \"./\") # The required files are downloaded ed <- em$setup_env(rf, fn) # End of environment setup code # The n-gram size n <- 4 # The test file name tfn <- paste0(ed, \"/test-clean.txt\") # The n-gram number is set tg_opts <- list(\"n\" = n, \"save_ngrams\" = TRUE, \"dir\" = ed) # The TokenGenerator object is created tg <- TokenGenerator$new(tfn, tg_opts, ve = ve) # The n-gram tokens are generated tg$generate_tokens() # The test environment is removed. Comment the below line, so the # files generated by the function can be viewed em$td_env()"},{"path":"https://pakjiddat.github.io/word-predictor/reference/wordpredictor-package.html","id":null,"dir":"Reference","previous_headings":"","what":"wordpredictor: Develop Text Prediction Models Based on N-Grams — wordpredictor-package","title":"wordpredictor: Develop Text Prediction Models Based on N-Grams — wordpredictor-package","text":"framework developing n-gram models text prediction. provides data cleaning, data sampling, extracting tokens text, model generation, model evaluation word prediction. information n-gram models work referred : \"Speech Language Processing\" . optimizing R code using R6 classes referred \"Advanced R\" . writing R extensions referred \"R Packages\", .","code":""},{"path":[]},{"path":"https://pakjiddat.github.io/word-predictor/reference/wordpredictor-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"wordpredictor: Develop Text Prediction Models Based on N-Grams — wordpredictor-package","text":"Maintainer: Nadir Latif pakjiddat@gmail.com (ORCID)","code":""},{"path":[]},{"path":"https://pakjiddat.github.io/word-predictor/news/index.html","id":"bug-fixes-0-0-3","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"wordpredictor 0.0.3","text":"Disabled caching R Markdown files, causing problems CRAN checks.","code":""},{"path":"https://pakjiddat.github.io/word-predictor/news/index.html","id":"wordpredictor-002","dir":"Changelog","previous_headings":"","what":"wordpredictor 0.0.2","title":"wordpredictor 0.0.2","text":"CRAN release: 2021-06-19","code":""},{"path":"https://pakjiddat.github.io/word-predictor/news/index.html","id":"bug-fixes-0-0-2","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"wordpredictor 0.0.2","text":"Fixed small bugs causing problems GitHub actions CRAN checks. Removed custom .Rprofile file causing problems GitHub actions. Updated sample code features.Rmd vignette cause issues R CMD Check MacOs. Removed inst/extdata folder .gitignore since causing problems check-standard workflow GitHub. Removed non-standard characters example data-cleaner.R file causing problems CRAN check “Debian Linux, R-devel, clang”. Issues related bug fixes: #318, #319, #320","code":""},{"path":"https://pakjiddat.github.io/word-predictor/news/index.html","id":"wordpredictor-001","dir":"Changelog","previous_headings":"","what":"wordpredictor 0.0.1","title":"wordpredictor 0.0.1","text":"CRAN release: 2021-06-14 Initial Release.","code":""}] diff --git a/docs/sitemap.xml b/docs/sitemap.xml index bbdcf9c..06265cb 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -1,8 +1,32 @@ + + https://pakjiddat.github.io/word-predictor/404.html + + + https://pakjiddat.github.io/word-predictor/LICENSE-text.html + + + https://pakjiddat.github.io/word-predictor/LICENSE.html + + + https://pakjiddat.github.io/word-predictor/articles/features.html + + + https://pakjiddat.github.io/word-predictor/articles/index.html + + + https://pakjiddat.github.io/word-predictor/articles/overview.html + + + https://pakjiddat.github.io/word-predictor/authors.html + https://pakjiddat.github.io/word-predictor/index.html + + https://pakjiddat.github.io/word-predictor/news/index.html + https://pakjiddat.github.io/word-predictor/reference/Base.html @@ -34,15 +58,15 @@ https://pakjiddat.github.io/word-predictor/reference/TPGenerator.html - https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html + https://pakjiddat.github.io/word-predictor/reference/TextFileProcessor.html - https://pakjiddat.github.io/word-predictor/reference/wordpredictor-package.html + https://pakjiddat.github.io/word-predictor/reference/TokenGenerator.html - https://pakjiddat.github.io/word-predictor/articles/features.html + https://pakjiddat.github.io/word-predictor/reference/index.html - https://pakjiddat.github.io/word-predictor/articles/overview.html + https://pakjiddat.github.io/word-predictor/reference/wordpredictor-package.html diff --git a/man/figures/README-analyze-ngrams-1-1.png b/man/figures/README-analyze-ngrams-1-1.png index d777f9b516c7ab7a428d69aead8ac686c370e70d..d96ff1123814a1abc7e6d398b581d469934f67d6 100644 GIT binary patch delta 5448 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 I`_23R1MR2N;{X5v delta 5312 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 diff --git a/man/figures/README-analyze-ngrams-2-1.png b/man/figures/README-analyze-ngrams-2-1.png index 805ae2af86020361dc2b595f4af08fdebe9c9538..2b2c116785466c10b92089863f16589426a3075b 100644 GIT binary patch literal 6506 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 H`}98m&lY&G literal 13111 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 diff --git a/man/wordpredictor-package.Rd b/man/wordpredictor-package.Rd index 776f9e8..32836ee 100644 --- a/man/wordpredictor-package.Rd +++ b/man/wordpredictor-package.Rd @@ -6,14 +6,7 @@ \alias{wordpredictor-package} \title{wordpredictor: Develop Text Prediction Models Based on N-Grams} \description{ -A framework for developing n-gram models for text prediction. - It provides data cleaning, data sampling, extracting tokens from text, - model generation, model evaluation and word prediction. For information on how n-gram models - work we referred to: "Speech and Language Processing" - . For optimizing R code and - using R6 classes we referred to "Advanced R" - . For writing R extensions we referred to - "R Packages", . +A framework for developing n-gram models for text prediction. It provides data cleaning, data sampling, extracting tokens from text, model generation, model evaluation and word prediction. For information on how n-gram models work we referred to: "Speech and Language Processing" . For optimizing R code and using R6 classes we referred to "Advanced R" . For writing R extensions we referred to "R Packages", . } \seealso{ Useful links: diff --git a/vignettes/features.Rmd b/vignettes/features.Rmd index f9dad89..74e3ce4 100644 --- a/vignettes/features.Rmd +++ b/vignettes/features.Rmd @@ -11,14 +11,14 @@ vignette: > knitr::opts_chunk$set( collapse = TRUE, comment = "#>", - fig.path = "man/figures/" + fig.path = "reference/figures/" ) ``` ```{r setup, echo=FALSE, results='hide', message=FALSE} library(wordpredictor) -# If level of verbosity in the information messages +# The level of verbosity in the information messages ve <- 0 #' @description @@ -59,7 +59,7 @@ The first step in generating a n-gram model is data exploration. This involves d It is also important to determine the unwanted words and symbols in the data such as vulgar words, punctuation symbols, non-alphabetical symbols etc. The **wordpredictor** package provides the **DataAnalyzer** class which can be used to find out statistics about the input data. The following example shows how to get statistics on all text files within a folder: -```{r data-exploration, cache=TRUE} +```{r data-exploration, cache=FALSE} # The required files rf <- c( "test.txt", @@ -88,7 +88,7 @@ The next step is to generate training, testing and validation samples from the i The **wordpredictor** package provides the **DataSampler** class which can be used to generate a random sample containing given number of lines. The following example shows how to generate a random sample of size 10 Mb from an input text file: -```{r data-sampling-1, cache=TRUE} +```{r data-sampling-1, cache=FALSE} # The required files rf <- c("input.txt") # The test environment is setup @@ -124,7 +124,7 @@ Usually we need a train data set for generating the n-gram model. A test data se The data in the validation file must be different from the data in the train file. Otherwise it can result in over-fitting of the model. When a model is over-fitted, the model evaluation results will be exaggerated, overly optimistic and unreliable. So care should be taken to ensure that the data in the validation and train files is different. -```{r data-sampling-2, cache=TRUE} +```{r data-sampling-2, cache=FALSE} # The required files rf <- c("input.txt") # The test environment is setup @@ -153,7 +153,7 @@ The next step is to remove unwanted symbols and words from the input text file. The **wordpredictor** package provides the **DataCleaner** class which can be used to remove unwanted words and symbols from text files. The following example shows how to clean a given text file: -```{r data-cleaning, cache=TRUE} +```{r data-cleaning, cache=FALSE} # The required files rf <- c("input.txt") # The test environment is setup @@ -189,7 +189,7 @@ The **clean_file** method reads a certain number of lines at a time, cleans the ### Tokenization The next step is to generate n-gram tokens from the cleaned text file. The **TokenGenerator** class allows generating n-gram tokens of given size from a given input text file. The following example shows how to generate n-grams tokens of size 1,2,3 and 4: -```{r tokenization-1, cache=TRUE} +```{r tokenization-1, cache=FALSE} # The required files rf <- c("test-clean.txt") # The test environment is setup @@ -219,7 +219,7 @@ The **stem_words** option is used to transform n-gram prefix components to their The n-gram token frequencies may be analyzed using the **DataAnalyzer** class. The following example displays the top most occurring 2-gram tokens: -```{r tokenization-2, cache=TRUE, out.width="70%", out.height="70%"} +```{r tokenization-2, cache=FALSE, out.width="70%", out.height="70%"} # The required files rf <- c("n2.RDS") # The test environment is setup @@ -234,11 +234,11 @@ df <- da$plot_n_gram_stats(opts = list( "type" = "top_features", "n" = 10, "save_to" = "png", - "dir" = "./man/figures" + "dir" = "./reference/figures" )) # The output file path -fn <- paste0("./man/figures/top_features.png") +fn <- paste0("./reference/figures/top_features.png") knitr::include_graphics(fn) # The test environment is cleaned up @@ -247,7 +247,7 @@ clean_up(ve) The following example shows the distribution of word frequencies: -```{r tokenization-3, cache=TRUE, out.width="70%", out.height="70%"} +```{r tokenization-3, cache=FALSE, out.width="70%", out.height="70%"} # The required files rf <- c("n2.RDS") # The test environment is setup @@ -262,11 +262,11 @@ df <- da$plot_n_gram_stats(opts = list( "type" = "coverage", "n" = 10, "save_to" = "png", - "dir" = "./man/figures" + "dir" = "./reference/figures" )) # The output file path -fn <- paste0("./man/figures/coverage.png") +fn <- paste0("./reference/figures/coverage.png") knitr::include_graphics(fn) # The test environment is cleaned up @@ -275,7 +275,7 @@ clean_up(ve) The following example returns top 10 2-gram tokens that start with **and_**: -```{r tokenization-4, cache=TRUE} +```{r tokenization-4, cache=FALSE} # The required files rf <- c("n2.RDS") # The test environment is setup @@ -303,7 +303,7 @@ The tp files are then combined into a single file containing tp data for n-grams The following example shows how to generate combined tps for n-grams of size 1, 2, 3 and 4: -```{r transition-probabilities, cache=TRUE} +```{r transition-probabilities, cache=FALSE} # The required files rf <- c("n1.RDS", "n2.RDS", "n3.RDS", "n4.RDS") # The test environment is setup @@ -325,7 +325,7 @@ The final step is to generate a n-gram model file from the files generated in th ### Generating the model in one step All the previous steps may be combined into a single step. The **ModelGenerator** class allows generating the final n-gram model using a single method call. The following example generates a n-gram model using default data cleaning and tokenization options: -```{r generate-model, results='hide', cache=TRUE} +```{r generate-model, results='hide', cache=FALSE} # The required files rf <- c("input.txt") # The test environment is setup @@ -362,7 +362,7 @@ The **wordpredictor** package provides the **ModelEvaluator** class for evaluati The following example performs Intrinsic evaluation. It measures the Perplexity score for each sentence in the **validation.txt** file, that was generated in the data sampling step. It returns the minimum, mean and maximum Perplexity score for each line. -```{r model-evaluation-1, cache=TRUE} +```{r model-evaluation-1, cache=FALSE} # The required files rf <- c("def-model.RDS", "validate-clean.txt") # The test environment is setup @@ -383,7 +383,7 @@ clean_up(ve) The following example performs Extrinsic evaluation. It measures the accuracy score for each sentence in **validation.txt** file. For each sentence the model is used to predict the last word in the sentence given the previous words. If the last word was correctly predicted, then the prediction is considered to be accurate. -```{r model-evaluation-2, cache=TRUE} +```{r model-evaluation-2, cache=FALSE} # The required files rf <- c("def-model.RDS", "validate-clean.txt") # The test environment is setup @@ -406,7 +406,7 @@ clean_up(ve) The n-gram model generated in the previous step can be used to predict the next word given a set of words. The following example shows how to predict the next word. It returns the 3 possible next words along with their probabilities. -```{r predict-word, cache=TRUE} +```{r predict-word, cache=FALSE} # The required files rf <- c("def-model.RDS") # The test environment is setup diff --git a/vignettes/man/figures/coverage.png b/vignettes/man/figures/coverage.png deleted file mode 100644 index 47b7eda5b1773de0cccf7f6ae07864ca14ac3ead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56053 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 gb6Rg)wgg{cqHK)@Xa|7x0c-(nE90@_G?Cw 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 QZ;<~yUHx3vIVCg!0QK-OVgLXD diff --git a/vignettes/overview.Rmd b/vignettes/overview.Rmd index eb78847..3a240dd 100644 --- a/vignettes/overview.Rmd +++ b/vignettes/overview.Rmd @@ -13,14 +13,14 @@ nocite: '@*' knitr::opts_chunk$set( collapse = TRUE, comment = "#>", - fig.path = "man/figures/VIGNETTES-" + fig.path = "reference/figures/" ) ``` ```{r setup, echo=FALSE, results='hide', message=FALSE} library(wordpredictor) -# If level of verbosity in the information messages +# The level of verbosity in the information messages ve <- 0 #' @description @@ -111,7 +111,7 @@ Extrinsic evaluation involves calculating the accuracy score. The model tries to The **ModelGenerator** class allows generating the final n-gram model using a single method call. The following example generates a n-gram model using default data cleaning and tokenization options: -```{r generate-model, results='hide', cache=TRUE} +```{r generate-model, results='hide', cache=FALSE} # The required files rf <- c("input.txt") # The test environment is setup @@ -150,7 +150,7 @@ The **wordpredictor** package provides the **ModelEvaluator** class for evaluati The following example performs intrinsic evaluation. It measures the Perplexity score for each sentence in the **validation.txt** file. It returns the minimum, mean and maximum Perplexity score for each line. -```{r model-evaluation-1, cache=TRUE} +```{r model-evaluation-1, cache=FALSE} # The required files rf <- c("def-model.RDS", "validate-clean.txt") # The test environment is setup @@ -171,7 +171,7 @@ clean_up(ve) The following example performs extrinsic evaluation. It measures the accuracy score for each sentence in **validation.txt** file. For each sentence the model is used to predict the last word in the sentence given the previous words. If the last word was correctly predicted, then the prediction is considered to be accurate. The extrinsic evaluation returns the number of correct and incorrect predictions. -```{r model-evaluation-2, cache=TRUE} +```{r model-evaluation-2, cache=FALSE} # The required files rf <- c("def-model.RDS", "validate-clean.txt") # The test environment is setup @@ -194,7 +194,7 @@ clean_up(ve) The following example shows how to predict the next word. It returns the 3 possible next words along with their probabilities. -```{r predict-word, cache=TRUE} +```{r predict-word, cache=FALSE} # The required files rf <- c("def-model.RDS", "validate-clean.txt") # The test environment is setup diff --git a/vignettes/man/figures/README-tokenization-2-1.png b/vignettes/reference/figures/README-tokenization-2-1.png similarity index 100% rename from vignettes/man/figures/README-tokenization-2-1.png rename to vignettes/reference/figures/README-tokenization-2-1.png diff --git a/vignettes/man/figures/README-tokenization-3-1.png b/vignettes/reference/figures/README-tokenization-3-1.png similarity index 100% rename from vignettes/man/figures/README-tokenization-3-1.png rename to vignettes/reference/figures/README-tokenization-3-1.png diff --git a/vignettes/man/figures/VIGNETTES-tokenization-2-1.png b/vignettes/reference/figures/VIGNETTES-tokenization-2-1.png similarity index 100% rename from vignettes/man/figures/VIGNETTES-tokenization-2-1.png rename to vignettes/reference/figures/VIGNETTES-tokenization-2-1.png diff --git a/vignettes/man/figures/VIGNETTES-tokenization-3-1.png b/vignettes/reference/figures/VIGNETTES-tokenization-3-1.png similarity index 100% rename from vignettes/man/figures/VIGNETTES-tokenization-3-1.png rename to vignettes/reference/figures/VIGNETTES-tokenization-3-1.png diff --git a/vignettes/reference/figures/coverage.png b/vignettes/reference/figures/coverage.png new file mode 100644 index 0000000000000000000000000000000000000000..97adecd3a67bad420394ea6b2ab4a8f4a25057ef GIT binary patch literal 53316 zcmeFa2Uu2VmnBM-mY4t)6;TN)iV_tiNE8!-1QigFR3H*0gGdf05K$2j5y>JVk|ax3 zf}%(k5D*Y0N68uPI^V&+s&CKp-#at?%yiHEU$i9V-s+EU`e=C2-JB0$fLh+v!x~HX%Q!Ntz6P_FGhj&(4oKmxvGSaEc3rno;=28{edqO4uc=QJ9PXOmH5Ak^ zbS*e|xhgxgL|A_L1vSSZZ2=>V=GOkS)#qZA*5ZnA{)Yt`43xj9obp$)Q~q)bze!K| zkWpw?`*^_iGKX2^v7EM0pLHoxa ze`NA(CN9@)$m_ZihkxJJFK;2aJ&G-#Eal0S)1kbCe2!8+R#gk?D`Ndh&ru62vTaRb(ay3~r_nNX^IV&TO97iUZ94Iu-S30;!breS?xfb6M#?FtT!uS~ z624`2g^EmmwXPASremI)ZC%V$&oB%0j!#Hf7!6w#wQ4W9RQjm)YTjtM$TDi$uWdGz z`8@I|h(6nGvei|BJMi}VAH4Z4jY6y3z&R)wIU>1Ek$3j`AQAmsKXbSF0fK=^%=cCF}E zGHK2lzsq>=LWWtca}+tuAttv&-eY1}WP=3a(;Jd6m73?zr@wwJWWng~?_U$G;5s{y zAu;vs25!l!_|B#iCr;pvRvizft5_~!cHccUv#)aR-Mdmlc~_if_QX8KV6xd3*Hmaf z+UXw<5b*F}e@3f|^UN5dkj1xE?7@{WiqT9q@k$)y#SGdx)15(n>D;9_{qw)<9Sa+YzN;`vuq!*$KCPf{499DucV~()xIkvQp!8Q z{*_k1GFqW;d9#Be1F1E9QX7ry;*9DOG)+@*vmG5B7#*7UUWtVt5>G{LYC8=VyG|9d z@Uie2lm~A!&#^4Hxhl|u$>#Ifi|_B3Ei^wgJoRdJFgsBzH>-2BFEL+Sx9E1%=>Rk5 zl4W$F7R8%Xjyt~dW|453`pK2J#jE)H@D#C~M#}^P{QWPvD#h1pyUsuL;<=D+qNcg5 zG0k{#>W6pO)kdQvRW5%S|A!AhyBOuqPXtN0x=hqJN@p+;cWF4o)%P$l)OBGxH8iC{ zTtx4;p`20q?5hK2`0A$*$GJAo_Qod4OU#e`xG!Q>`%;|d9Y~Je@ip2 zpXjME=>L*LlT~!lTZ~xPD(BA&q^2L=X<04Jevd^$yzub=9s6aIudgjD!zBX~Hz{js zI)C?M&zt)0rFP%7?G}SOEz^@zY+KK&e_Ogj$pX(D7}h+ij*o^F6}XE(Rahik=Ar_$ zp48cQ1{%l*379r#*?iFB^Et((oi_)wcKGL;Wsw)pCu%jvswA!*QWzU*&BwY*E0gxy z6R(!?Try2;^wYtr&U=C_s`VGnZ4)r*u8pn#6nHQ)B-e4$WnsFDf%`%#e(}Uyuj8Y? z>wKR!HSP8-OaeB&pLZN{KV&GKs>ESaBPW;({my&?SGA>R*reRc7X_U~XNCR-eb;-#LSi(y%udY^Vyl54YZ zLvqJ!%OCPWZ8x*z7dnH?X_LC*rj8#Xlv>FI%zJ4j$=p5a#i* znB!IV{7LU(T?JUHKNvLD4KQK>1sa5Amc2FF=FD=XQqsDsyev7rrzU!`uRbxoA>Vb; zFy^cRHZKg8N|Q-z-h5Y>YfF|*->0syg9h@GgU!Y_0_{Y#ur9ko9qagAf_&cGTt!bT z-sz)Fk;%!)=B;^EY4I4g+=cnsdVZJEN8H#c3ikH)rWJ>~f=4mOn^#P>ciPH1qb zigzgV{KpN!vIHy)d%Hdx?}vr_En&7NI_$aFpex)wA3J@LYX975#bPn9%ld)LvFg)( zjS1n#^$FBWSI(GP6M(^k-e}h1E9SCkd%980^HhmkSByok^KoXcVp{R3Z$K!i>4B%% z7Jhn2=&7mSgZb(IthaNs7ff9a+(cCr%NFS-9k}>z zyF+&b4F{LU(&%3%M!%;zs!IR;eWnzRU4|m}n8kz}w~N~SOnT28RCdj%;(cjpX`e&% zj?G?h#&T7i#2PZ;NwWO$4xTwZozeR}5JFCwkLyfL*wfPG^E37N_uuUZ41sN}+OLnb zLDN{^094aJXO@apww6UaCw=-OXQD|%a#X@w_(aE4d)(k77-~mPJJHb1f7EjR{qlN( z%=0`2;7nVo7~T|?`fWxz8#K@Kc-yg>s{j~+tXIBS(BLA`J}NEtD&S3_KdI%XHwoC=7}vAW z`3^j`%<0qKq9Y~!bSwvSkEc!-tl|AU{(i`DFtZB={BjWXgVW;tWS`h#h;0j_XO$hSuY#~Jxe2uBX0Hc z_1|I>^Mo67U<(e0Ibq5H3@lAkoM$J*94EeZmUxTL>}@nDqFu)%a`mo2M$2L(56wrb zbj1r=%Jq&bjIJpj8#;O6&j*sU<|4%DDwp$@+WdCtBsTNYvU}SESG?{fEN~gII%tG* zo;`ae<;`5>=LE|M%kri38w=KJR8&-2YkiR?J+MMHvGZ(3@PBz4b9$Z!^{$q$-uXz} zc}7poH9oa#p+RDI>keb#cz`L_g)UcOD;~D)BxWCW^lPe7O?5AQ9^F0cEFWdYS#61NRM2Cxjp&Cb@g``hd zbNDyvyT@7GrH`-M(R2@}1!A8%B z{c=2rhCBJy{w8hKUwfs7*emKD^Z;t(<$2w-uG=++R+;BbcN&gj<9>1Ygq=v>qDK9* zXU}$)?eBH)2sdhcZFw=@WnRF%W%~eZMF)-G*Pj9TbC(w8rm;60a_p^l`oIsy+}?fq zk)HKJ>P@4*Tu#1Hmx~i~`nQ@AYm9KpjoOp>0OVCt?EzX2M%Zlb*6D^-J7-p(a+k{tx{mPWgi72U zgg3ck)!5m|u9tSCI8QVfATCHN8}F+(_+sN^+_1Q|y`F^BR|U+mHPeB+FV}K3jsoNl z_InM&lVeJ*{?YJQ&|E83Z75+AyxkT76ID~|AMft5IQ^7td|VYNB^4B)VI|#ZO<;h= zIRpiK-W3su=wQo_JHqetUFohg@%7{im=*@~e_CdE#^+vbtct;5K5sM1PF?3_u~Ylr z_QQOQP5^+_6LeqNXyM}x51M-YF!>aG_+VrI*G%hN4-Mz>+Nw?jx(uc~+IddBpJUR> z?lXxz-;|k_8Xynjm*QYt;@^;BAZ2@x86nz%_uKtClGJ$m9$pp9n;R+ZFZC+c)pj0N zeza?}n_T9Z!^#@ot;B-oL$T8z3Otp_Z!9*n}*O8IK7O4J@dqWpG{mhF<-MFHZyw+vT)e z3c2hal`A?7#9!xhD(ak(v2Y0Hb3F8wE9R(k4R6jFTDD^fNgq2xYFgH`|F)LNuapr7W#s-@mgSPELoEi*}R~4#mmbtsMCP6)e z2n6p=XxO#gQe$>}^BXln#~o>9SO@hcHa~wB(n)z}+BVxX1joO6_0xTu+3g7p7-^C5 zdwwTRH;szUvVE&lH!oY@Se!6l+-$04Q>)yNQ}aM}55W!eC;Cc}KxE|+A)nTTv1kc? z^A^!Y>#vsY%K{HZTN(rb{biUncb12!*SjHhJV05*$)Ao^Gs|XNuD$%m?Y9PoiCFD< zjz(exI5|049Q%_RLt&yNZ>+dvpYF3u>fMjw#!f`^$qH&mdodTO#40ne{tVfvE`*AzK>D42-rEFu2Dm*um>u@c1ZQax{yWvaLTvIb z;whg~pC>e2raKxE9h4AiUG4v3Sn>G4MP|Ei*ZTWn4p?`7I=S6HH`U@hfaL5%lleiG z5$qEtg!D97G9XJ76~s0T*!RXnyVJ2~si|d_4SOE{o?ObajsLRJjf4%QVSmlKqr^;= zclE-#JglG3iV948dL_W{y<(z1r*d$&)G#=Ry#mWRv@p|#)(D&smLX_f5TK4e7X$PE zd_b`|Q9D1iBcfON{Q1pddh;{mT_LtwSKh#{ehsJBx>9xG1~uLN2@U%W|6}fJV+0L7 zi*@0i{PxHZ!(I_8wzx2vFW8+$lZ6bl8gTL3~QyY!y?d=^I8QG`!{3}8m0;5T@hdh+Kd-fs- z0OJ3BD#odjAle;%g9p(q<3W9s#?*bAy`s*=;8%jJPVg$BM94zR!^t@dMl87F{Fk#v z4bo$2p5-ATQY_yMBC#K8RkY{B!pSug$d&Rjgy#6+%S~E5i|=r(=!l>)l8X z*}HeI9bnPycpt-n1~v-@EeiuI2rn5P4hIbzJ4|3(=L~&V69RBI+Vg4e)h3trtCUTj zvtNr&e}_4e=y<4@+$xaCL%{2V+=)gE*rhGj0Ik~Cw=`nb@SX_5{IK9(tykW?!Sj6l zg?R0Jmp)#xk&<1zPTn;vIxJ}R)eZ|%K2$Vw{rfs0gsEYO^Rx1{I;-X*Ffsq~Dq?+r z(Bj-^%_Gg1^#sH7j?n-t*0}-OWd@=6k72tj_6f{l z4s$uuZf7M_{XquLZ*I@wlD~QZMNmr)z$e6A-?1sWR85x;9vXA%c6x0d1(Xh8SxV*^t*;ah@MrV} z`TleGl^GlvHh{!TcVvjL&Bu`!R|gvJVMzfm5O5MR9MW-?J=E^|olTqx`3o}+DG%Uy z?}I04Of^yy&q+AlC{E8$Fr=80*s3lrF0P#KcQ`TlHl^Gd4<9|!w^veAYXH>*iZlK_ zvtwLUK>0aQW){o^z_xm-p^tq#g1{W0P3sD=jH-H$y?eI^U+Kmm5u7GK?%<2a`y8;I zTwEqK&&%L|Y;k0#pKqzLNQFU1T`urW&E1)-tr6SPx^#2NaWx4hxP_YMa}sGyx!GN+Za3p!ODUe76Xk2(iV6l=f#T` z2;;HTw;LA2TdDOF=|{|Id(8T#l^({R0DvW3$sJ5*p6Dc z4&&Wb7eS5FEHYtjB6iLNECF}BI98(oqVz(lp(WwJ!0m&wCPLh+`V#l{gOcr*-$c+U zSaHpjeusuhquIZJiKfwHzoIOk& z??~uy=kj$yxKk$EuSv)|I7lHU;EiCMJ5UIl3jlU1M0q>$)mNpIuO7H~5|k+x9fB!> zqW$45;ewrN4zf~OT3S+4a;J|f2uyps3@7$p=d6rV_cF@V5lZib1Ui z5=;blk(uxZ@%0jkM>fCXdQ5NyYc_K|#=RgU>?#k*#=3xEPteG;!eT+v1VC4){lPIJ z2+KnN3Vshqp(IlnDF;&dN4}_3m@=SL{|l2r|3RrKBByj@83LExKBwBV?r3mu&9w?~ z`^&(CY~Q?W96Jy%g!Z5k>(h?xNt1}>pDU^!tCd|PyTWirR{I0*^ThTwH7XzxqxjUr88rB0`J{sQHttW3B%jr!jM zAL8ZjUn`&zf1zXXTU8No%%06&2&~hyvV@6q<3s^ZdW>ys(t0@Mf_pga-;en_`OJ^; z3ny1`^^qC7|E>AC|DY-PCx^NGsPFgiHnUv*i8}S-4|=7Tl&B+nkZMaRD0r&$^3qP9 zz6-2=h(=UJwVF(lE}f?Jx)yiH7%pVu6dSUj38$~guKqEsDk)iJP^0oB55sv7{}sjj zdH3}3=oP*=tA1aUuU@%-=S}+di0RRbHPH+X!yck%zo~Ffzf<6v-l?^?&hRMaodMIq zB$0%0seM8DnN-o6W>4DX& zSBD~PomyUSG%=MIuuX4jtIO;kvC*qw zaZ79{j`+=_5{#*iv~)u37qzDf+5ndy`(aV*99Xqe47O3;4#Ag?g3Hg)s_GgU2 z3winbcVyjJhZr8O-kHmt63G?5mqI8P`QNH_aFjo^11b49+fPVe|E^T6hYVu!t20k2 z$?5htGvj@+w$1FR2sR8vnG>fq)YR0@p7qgbpU{>Us=AqK)+{{ghBL_p3EbNE+z5^% zlZP_4Q=!P_i|FxoKj-zA8R#GS%o0H%761F3rr#!$)fz|6wBRcUxoNf@ z+FP$oPTT@;3gxf=WaS?JNA3Clp?&^er7-88%oORd-Pd~B4CWxDMmVn#@O$7P1idd_ z?DaXNq^#VLwYh|i*_(lZp!PY-33-(T3G(jU`(oN;My5vP zptIZ_KYRvA%Xh$e_t4|KK^fl=k*=(pnjRL{MaOEw-nq=wa0dyhn0$HAcaGH$A>-5P z>f_4F#qiYl(LTI*IAcxCG}1oa4cudvAz-ST^rbV+Sgbe7lhceuYXZ(uJ+t{W^}W4! z(u}P&*XZfa$g~`AzGa#mM^;Sz=h!fWEv4Fu>W42t?f(9^Hf_q}xwP$E_E6~Ms+~)l z{E%kBs*%c$fcIK<5p0_|KiKSOO6?gb<#d_v(@>#UkIE}*b!7S1e~x0Wf3l|j>v{bD zTX+AzpD6;myP%?4u zoNtpZ`9aS*e1I~!t7RTU5!uF#?de-6pBM@glc8BtaBB@JzSKtTzr4~>W41xXmN~-V zLN|JOAsrC+P3juroLrx72*sn$uI1^8gxGLt6b&Y+#vwDqJ$I@yHERB9Gnh^*I)^bBC#otG6g(;8R-}l>eK?TS3?$L*=fwF^cr%e|3-3A)F`0nmLUS8CtV2bLs z9OL;(B*-cwl(Y*$z6Xno-ON}If0@YO>qt;T86-7yMDe0pG}9h`nR!%*IH4ru@{|1e z0dqQ3EvyKM0I3YZoN)!x+j~ZzZ_LiI6Kxr5JuZ#v&7nyN%<3BAr5K~M)2GCS`vJl7 zlx?ly&+A%@-@yyt$FubR zn*HkCCwjWyi#++un#{5XZtuEp*e%U$-|q8i8R}P&A+32lb9Gbvg|s{65>K9kk-bAX zKPnvXij9q}k5>;MB4S@(-|ko!p!?COyL%DGJbLqOuBEtOVn0vWRm<5a)XJMw77|3g{F6g5&!>Z0=bmHUGPz0D z@r0|bXyRpq!PBe!(XDfxf*|cam`YPtTjj%5?CGaD{2jnnF81Xw#6I5_Ncq6cVHNvU zK;&kmb%Apej9RWXnVz?%?0U*)`|ug^ok-co7$FYHH!Y(5Liy!SG1!E=dVKb%Gn}7v zU9^=OZC#vibsX>YZ}O#lgH?Ma`&O<%+54cRktxL}Vk00KRJBow_e1{RSWUU zmBg;1y?pc3g^TRv&y0lcJ(m+MU+3w$HIVJfLqlD;$MWY4K0nvJxM^D)_wBeNY;nA9 z8@}ZB^JF`kFTNgl#G`*HK&&E@0cGwkjv$0X)rP*QpxBS(H>S49)ru zUA|NNT_tbCKQ5ZGuiRwV{;enMkFlgpvduM}W`)VJ+mO0YKTMN07{4 zgmausVJ7K0;^WmaQPpyS%@5f=AZbg~%^8SMD%Gi!4q57ML}$cR)R{{A5;^zr@o_b8 z^4hS;g)V>})I!08FB_4*MLHw-*I`41ER}FrqNa`Q1F9nc=^u>?QLgsPA4Q&#BS`Qm zAoF_Kw;ib3(8T1E10_#J_2T#MMI}g?8WSv|9~%fQ#m!u*4}SfY>2eBl_yuHS^5>iK z<$T$~Dq2x>o2fC_J!y{ufQhlOwMlPL6SA3C%V~_-LD9(2(D3o0eSQ1v6k`(;!`hFX zQa;>vlRlaGxBI88t*z^Jz1e?=^3oIgBPR*DmFPqz2K-xte*qB++Gt&pLAHr2Th;S(`4Gn18-wXm=-I5-$*a4q6>xf=BK^;ydtxy2clx7q7Nm@-Fj zjmpdW_*d)`mUoAqvAegIgP|Oydp$Q;=DzirS$8k4ml*N!ez+LrYHZwxdi|{j*(l3L ziO*8E{eHV}+_f`pPq`^??HxU0LivOBAt$@L0h0SjO)@zI0opcW(RPfZmb2;0m&Xel zl@{~3FMQ9_|XYg zj_ye_(|8tM$`V}LX5nS3uJhmC-UvcA0sx2bi~<4zTGnO!;443MSPj!t z*7K2KEA{BqD>gRqU?Ne68Fg-7pBm*@;n!bV>9SqEe7PJQXEh2E&hPFra&vRb$;pA> zl=j`|Rg9u3aqx$&^Mkh8Sy{ep_T3R4ofTn3Yo5O70m?y?)>`VawM>`W=8c97iO!8b zdGZ8}b(&~dMm1*(I#SRc6~y)dWk{B9|6q8XNjkNMnemDo_^SA1W`%$Kt)n{lR>Lo7 zc`W!;X@5fsbsf4`F1Y(qPIKhMdiHAHipAE7^oWQZg(O!K{`5Azkv%SEMIBg|4;Ezi z@{7ISk8{v6i`v0AKdK*c9&*%Na)iqO(Y`%C$Kfw5B0`iAB5OR*kistQi(WJ>l$lCR zO%Ux+`T4H5X;2X}u_u4!u7FaS;dnrs5}j`}wVyw;N&8lGISa*Dq@^tmIfW-ABq(uQ z;$OQx6VPWzIZgP6?KA6bWR7%L&&Z@%%*gm#&B%0!jP1IhsOUGbPqLh)RjLPtx2_annYbb1b@f8uj(bO8!O_lt;P)S8-uMJoud86|dAvW|DBzP$J4H(rr1IxVyqk4q(MX`seVPr8>PWXD|ZG(ybXZT49277Wxr|x z@~4V{H0R&4%t_W=B-dEf&rhC8xE}O^kNZe5?{g)%uC&zDoVIK&)Ne-!zKD;HkB!}S zYx?DRfLrk}*JcCxjS8Zctu+b;e4FM3fZy)jyO*1r8xj(tR`L6>n8ZZ$%a^xKjR@vX z->X^1@f8hqzHB|+-Q9hCr4F07d|V99+avAECMG6^;=7Wo%v&x@kEJChCPqf?>Qno3 z?+tnF$$=&nuFVI7saqZpXbuqsb!fQgSWjPs`u)e8?B{$cx&nB$^K=T`vCQ{KkDwHE z3N`yKg|_p9LkokI+cvJgh54;wOcJIU4!D#!`;)HZ{4{-Ep>)T#v22Yb)v+cfNM`Sb+$!C3w3ut8fcedC@l1< z_78rgUJwW1Z(3T@R=4T*HD+2H*dMU`USz^f0``wPge>7v zqP5()3CLV~wy}Qot)tVWr+IS^HQ7@pH{9y8zSxm*d-Q3bxHIj~x7Rar2Ta+6EeZgM zvF$&$0=%P5Lq*W!ivU8~^b126+qgLdp!@1cDoGdaQ%@MqvR+;Bw zu1vi{G5K@>L*6?6t(5O6{bs3qWxLiM>}evvL9o{~Iv7I6B8yVNThd_^2zC^`7wF{c zYHDn3Y-$1{>x_Cv{N{rndjtdIsc2L+ zHEVYNM{|ZUg7RZyW6!c&DGNKi_t`dfqK{f)HbuhN*!c7~$?hN7B#rM)OeDaGqgw<> zAs4-fS=rf&VkA3pX8L;Q;UrWkqhuP9FgLOzD2zTpy~MSg>0Xuu#vmhaJl;0v2NPa+nrC)ALJt(JLvDQh08FBtqGAma54q@aIv4Y>mrThW={O}Q zFB>X4J=2%iiYhFkSa`Z4fFnKzlMD1Z18(qbqp@9pls9ZW+x)$R3L**{ukevOF^oq=vbeq`ju@!ndnSX)!y zB7^yeOO4NEZpzzr?#JT7(Bj}xlD-mpq_>WJ#dhG7u(@`27$_)Vyhe)G$>ryMqMRGu zzz0w=PFyo`nt^Lcrv7dM*N-AM^m0z4;evDHYND}tXuf5LW@ZqU_zFxfGums2Zq@ok z?V+Vpy|}z-J^RP4TepgjMbHsy0j8#=Fm4h~H;6By*xByANXu~LF*@m`P(F%duRNP{ zbxqAE3a=m17n?VA0w-j*`<^aGC*8!vL`ehX&fU(Q-Dmk7AE_ggjEO_8c>#shbTfnK zaZ^%JvF+w0S_IJ5ABz6SH;klnIs3pec<;v5gbWN|SJ$V&6v!)p$2pcS0>)(|@)gk; zQ(j(9j7v0r_{P@J(Xj$0^hYDsiStuVyx*#!$n#vx*r$UPM86IS{=c$|4|}Gkr%P@l zI+8FxdXA2>{Ph|KG4yQGy?uQWKd;e2nMDU!cA3Jn?!m!@+5E-X?jG`*BG)moqmtVd zFhVX&eEy-L{Pdu0zDRdAO5o<+3FZ;qbuF%o^9G^z`aA(5PILyrmhX67r%R!65;xcJ zgx~la3+b7*h)G&LRpm-RV@cK16J=#(Dw;O6SOzOhf3{!=p_>4i^?LL!C}7t`OrBR% zOhLka!~uE77+KQEK8q9>Se7%>8%qokh{GI^IEDElxRd-TulyXF8K-ct#&}%=SBL}E3^)F)0B^?IJA2$ zpXTK)fV792~s0!_qa81erp{nI67CK5O{ZZRxJXRa5g$UtnRlR{ECg$55c2>-dJ#LA_0af8SdxeP6k(?cJt0`BA$(Zb1X4L0p)g)b z9^_2zjB?3-hK+#x9VVPdDQ~`0cOQCZiD=Z_?ji_k_#biD=7-eeFOEhzsz)aizK*EY zfi{g#en(2!d_RJ1RFDL=C{YIT$ex|wkNdKL#-1ml*FNpVnZ$+OM6^4&H0fixW_LVN zheJf8$zgO-K3=l0r(#;`dd`^Jm#XJMon)~?d!YlG9!*V6t{BAuAZR5HNZYs|l*S>9 z&CKoxlj)4x3>2rNf#}EDdKB$b+g(Y=%c?HcpN)IE199dAj)YXsHEQNlzIs@qP|!fRM-S5)%5}cjjD620jYdFQ zbmFo}Cp(PyBAYdjbuIJKgADdKv`t?+@@`!1Iws{hcF)}DhjrNOR|Tk?pl8&neHY7g z5xY2{izJ77mGpFhfKsNm1UQLvOq(dDxb0&WOf(CIN6XE9qn4O@OXsrxx@IOPc~9H7 zRp-W&%*q?qUzGwJ%}v5!ktW8+qZ~-Xi(B8u4x;Hv?*i#%U;aoZSH)id+JDeA4KPkyp3$^*g-V8Dm1 zGj$n+9Kz4|&dyGWxk3riA9oKzOs%n|CI$TlvrtZoWSKWS=|}P(#jCR7YhYd=_F{)g zbRPE7-mbLAC5UCdTWWNn-rQw0D3x8*ifCF$zI56?7r63RX^|VkUN8_jIeEbHV63(X zvQREoDgCyPCFnBG z1jM<0kQr^xXSGr@GQ2zWqzn)ckViR1i+GMuC0LQiwQ;pMw*5@vViuUC+cYpJcIAh= z)*3fnloelet)KZ^TT86d!e2DsId%2E6q#F`uIH(Vm;kJ4tj@QRd#Jfm<|%o#<+ANZQcm_mIK-YM+i^yi%#<1ZE(_6wVPmNV6FAR%&{&xh>;R3Nprl$3(E z*ljrJ%LWRKmj_*z_01-g)_Z^$iB{mTP;|||4Gj(5ApnBr9qJvuuT);tl#?q9&zHOL z@nJ>R`@4*O;~V#{kkcl1G~y|dD*cr*#ecKbI?o7mL~$1z$j70FH0L$IgqH0M z4IaTU<`v9>%~e$g?%ZIC%E;;9UZxQAdLX??YqC?`adJ=-RjLt*2ry5sCH>VVUfcul z>_diSlagDLK!inx=#RnR69OE(iH;5q1U^Nd|EtKzNT*dg5oZW%O1zhlz_a*;oO9ZM z@1`Mu@!DEq4hdak_NZ zs!a$}nP<}F>G#NPnTgo=J_iQz+8VPv#ZPC)&bEzAJBf#(AP+|%7{d=8Rvua}r}r$n z(kMs3f=c@$gjv)dYKe?X=$jvQ?R@uU?S5KT!_|B5yIJu+Sy}mG_oksEQae;)B2F^X zSoI9wy#2(JTiz(X`|=b0s7FuTmUkJ3vp(&Xl=QjQw&BFyn^p#|KZWLYO}_8S)*oIL z=x*sM?r82Hy5KM%HdHY?U(H|I^0R-`MdZ&XTn4i;W=YPwRlel;TAOHp*d*7Qw@{<# z^JHg%#Z$ESg7sf>oz>@*)AwOl>SpaLFW}BSPN225rllo%%s2F zN3U}5@QDBPjfGCpOy9v|4Rq>WXZ@1vnBjNugH?KB`y-3l3y2H9vFPtu)A0AJo%IhQ zt`<=f96HVQKOrJRXokF7%XvO-rPtdV)X^y^hZqkTRuZuv^v%^t`r=+P$r4tfz*+{`?o+-BWy5tljdUyu3OZ z6b7aB$FP!pA+@dU9xTH14lz;?R%rEcyB!mi5yuL@i?mLIF?75?HcYg`BTu2@j1!Qd|#IfTm0bqHx< zUc9)SP;r}x_GlJM;G?_vn#d@Sa@7R|1%&iQT(o?M0~im%VZJV$oDhmbg~pr^VvS%C zdLxKapdHOZm5xPx?v3#i%1wXM*0|YreBE-u%=+1}9{M^g?!nJ7H6RRf(ZP@M(C%-r zcSMMZ5Uv}_tB|=Us~Xhn!tHtIDFd`bF2>^|g5wk?;0UI!5e%G#1!O^vN!P0|fk zLcO8GUj-5mN$|p~D=!-x6Oh8F`q|vv9Ks&~jpGOKA(;`>Ead56E9T~wV;Z2s?cZY{5MKkgID58 zag#luU}i!1EJ8pdr!BefMyh$M3xa7uoEs9U>l7}Q`2_?Jo#s%qLHL>q?Ggy)V)o6A zjCz1o5o+e6I2jt9JT+pZV}EpKU+_uxaLnld z9>^)G*%cPCb8vG*R}QaFS9Vc`=)px@8uqQwRS1QK79nSN@;qr``S#uyApt+t)?XsW zs=s84|Jfg#P72Q=<5$gJ3lR{%gc!X^Ch zzoe6VTRHW;a5JVcM(O3gUG$zsM1V$UEkJhEX?i@-b-vwC;eH&Yqo0a(*;5+!JXDpl z^z1^wF*D>`G%Etrdu8v@K2qNgCKPTdh*NClU z1xZrxnOxm1`Us+KAB>3PIuKK>@Bo2k(JO%qzlP9sK*7PCzC)XV0I1)IcI*w<{ldExxl$OiQb-MKfXwStd%=^iT^T1Wnw|y*`%3sK z`aOhDBUD2I%}85tD#)-k*w7s}y_Q*Y3YwD8614-u=4&QnwFmk*Du{r~Gv8npfbno{ zzAP8=^6q*G1pn+M&tUN&E|08mrxKd^?_Q!99`Jm-G+`eI<>B7lIT*T|O@%BW&uaSRRU6{Bl@eF`>P#V)0l{rT@q_(7 zL0}`sdGF1l4W;DeZwciZPM&Gu|B!qI4jkfxPGeP4J_6*DE85p+q1#^KgA5qmbplFfAu=CD zT%e())zV!R8Lbe;y!gbtwN=oLcNqoew-k!mRT4xu`E1qI4ck32uIMP36n0y@KZR~&*QQZrKk z5{E(JyxL4|yf73g@Y#K8|gOGKP)MCAnSHUX}eWG}Ou z9ge$k^JZ}%R~i;VIJd&7^B|$3DFF%9La}5_3#54FfNSUKGV*GFcEHs2LHVeAhFmP) zmA3TsL+W%I>1HBKyv2gz3Qw+=|SdAtWEELjka&r@e5209$ z5EH)4&Vk&?-#1Pt$y2|iIHo!D3c<#(n8T;RM&oASEzDtHA^k!K!w?tQ_5NW1WvZwc z*BcA12gVcu5cP(#UY_%AbrpkOwE(m4@`Wkid!VMJNd7?gm-hZ&fB0V$fx(6r9{dMf zXbe!q^>AQZMkDg-ZfnQ26=5u&%ZJRMRYxD`8fq79ZS6(R8}MeTlfAW^_ZKKfck3?R zNQ5?n$UKEX>9B?+5KZ~u5;oQ0*dm>eFYfFi;o5DL?Y8oBy(;;=a3t$@(@U2LT+Bh4LU+emup`_n%R9Eg&2?wuzz+i7`g>I!%)k6mU57C!K~Ih zMeB^ftmzDwnY*MgegK$6L!qqdl41V#Vm*!npZscz$kl#!+LF>zV<&f5clTmgmFh2K z>h6K$dUtw=W$LRE>~5IVOJF^hMl*77`(Z|sfcIZP2=H>tS|CE5Doo4R7`Z$2F2GU% z#}`5>(`lq}dQlI{b18E9`{A*u)_5VB7BF|m0NpG`ky1?!Nl!g6!s$^Eyw(dWlAyUe zSXl#|1Ao48`};YH{wciw$7rl&UqQ#LaqirP*7yVzdU z7AW-T)16u3B;O^pWFE#UkLid3WP(c0X}jL{E*@g>h;&eP)%G5ITst)9Ye{dlE)k&$ z>q>$bn(V1zk3&mcGq`Ao={thV{-8Hf`4+`epl=2tC`!oo!7F%Z(=zh4Lw@Xbsx&!s z^6u8Wax^KSgf*GUktk(47o@A`vJUO^mmy$m+Yf?Yg2~uEMj&m>_<6)#HXf979|_(`N1!Q) zF`$DH8>Mzk3g$u`{|}&lch-`7*m<9T@vwxb(}12_$9stdOUOmh3dW(u3~`n%Bs%xQ z>VE(J{U0VpX-k(b27#am0gh2n0wFW#Ok{y|uR{TwS@X;@KlxsifI$Ld8<`>b*1g$S zs45&%=E&#~74&?`OXh=Embh1FQDD^}?4SrdHXkMLf!1^X5@c9;{m;%%fmQM3Ww$>P z;wd7uL@%n6$g*S=4g+gUU!fD>oF&ME{?v_~Oy`|`J-J|K$*W_*ziW%DmxT-68_ug)N;vnCrMJ8%7cF3))x<9q?!u1 z`~aWlWp6}ohiyen@?40|*OIv1%~g)4h>RcpavA^LiTqE#qx`s~2SSj(0Ri`;?REskB)8cgYBRLJ)SB{j_>y7YI=FJVhV7N zQhr7yCH8B)lYX_8|5y5hV{T0G(-Zz!WRhztYF_^xxNmv3V`&#ojg21Sai3dq-q$WJ z_0IhjvqrV4M#GS@`F%LKB2FW71a)gY*IEge24Y7TR1I?O49njFy`ecc1y&I1Zrg?W zp9h)s;+Z(nLuA^egxP2%J0W*?(j^OJdeqEztZ~^keF6l-e9Qwso}i~DvW7@&{&?@5 zn2D72Ub=c`hLnN1%Ptn%Ih#( z5R!KSjs?O|UAG)1wS!O^L^0^be;{$#-jnyYXTlt^t|Y1_kcc=ekuP0}-3O6-2awK^ z>-upqMYq@g1^H>-3p16&gTiLfFMs<=r!XOJrgxXKs8cV<6s^}5Ixxfdi&@e;?7Xw{ zJbq3nOQOS{=;B6-6ZJfD0X&*G_(6+rN2t$Hw%eNsSQR`9BJ)T z?uSpq`|PG6Q6C7NiKuT`_;!PicFqdu2>uggi zm_oe-ZOW9D>|CFBm;yw;;Gr3#`lr}7P|Nx628Iff-Baj*MsuRxQTS@V>X|bS0s>T2 zRgt}5C*&&8M!$-hmC*aWpg)?BL zJYz_VQQ`n^f;f@J3o$l=Cil~?2u5*i?BO0LPU@&`=LuYSot2l@9P$G?xtJ@VMv7l@ z(*TaL?1>6+FZRL@Ah)=^=LcxgcHDS@a8rS&yUI?W`K^qP!WI`7#-TNEqJ^GvBB5Q7)R&;0EI}TLc$g183WC&IXU-P}5Y<&)csx~K z3ggz6cBl>40_DtlUc}l>!P;S6c_H28u-(sZQ%@-S-mU+U3LHVt?~rS*Cu*^7UHfKy&W=L{nR9CrkHI<@2tASN2-aZb$aZW1MIfM8usBav6`q0H6Z7 z9SZLUvv8di5Ox-sP6Ah@a-oJg1^Kg7S^r3cBWqT#E^xq#`nRMv%1RMk>1Qz*%0iP1 z6vtL^01|$GnMzMfeqxdF%t z1P1Yt6hg|Ku|gi24zBqVhC)-QjHwJd~(5&`SHi@ilzt`^~sTY`noz;Y1+ zw;)I%d;)_E=aGjFH%zG*%AG-YEcT2(+Jb&SVu#`ZJ1eh;hlhV7_;=L4VbhI{j{1FQ z2W}<0L7_t;y!|WK5ad|%_bqBb<&=1_mPU1yd9J-lFLjMbsuECo-Evel&rDaiwt(0^ z_8!G#ZA9=m)mQ|u;fP3lp~i?<;(B}yC2qK3X#e(<4a^u;!XUffsDM-n*zto+bcYfU zzk&AvxezLH^xdY-o1xGDwCx9ENKENUtSAWsupbqiFZB*LsaSapaArdDBpep6EpmXf zp<=>cqY621_mYU=0YX>veCy!@prW7)jSv=Gs5!9g`uGj`coYT^g6fE&u$xG8d2Blj z6Hh!ZO>$j(SC>MFa2iCO6?rttg|2W|THbiZdH4YhM1S$Z#ez2o?9mE80IG(XIqS7e z-+2-JUpXBtVaRw~;jP?)Ydrnh8R~hM*gpfcXQuSbVPgol9&4V8NJ2R(4I!AbtDjtoR#LFXpet3k zU!q>Lf%A^gLdIyXW@}P>nBKboe2i$Y1@W=;A*K1nK>ZVuRpgI9itPw^4hC_ z(9`)T(9gP(sFp=$;qlCpS=tQSi;T(5V%YVr?(?47$TC19F&_WqP(%!wEi}FJ^)@s4OA_r0Mkw}^%tOHMm5Ps7@k~|DG(n(%d$VI`LaeSLR zI=Tg_r^%Qi_=hSP9$JbSw~csw68r#=&8b;(8|l)U3Jnvb+^Ec_sK0 zMi@`P@o%`xWq2H6E7BQoh@4<*^86nqx(HjIU2+HZ+vlEnoWW5T^MUx?gdWg2$zMf|Q@rspLW3bwGNh1sI@kUG z*FNuA-}jw$)_Tu5Yn|_8t@nNRe)<2O=lMOq-#uLSeO-4S_#YMj2r|v}eMXSWV-8da zGw)N;v-}@1CPtZB)F=~S8)3jRb}$3h=FCH4d8~d&**}%ctCN{O^~9WH#%p1qXLiug z`ZFH@ZN!Gnpuz2?&X2Y><_0Z#h|mnYDq#^2TxuS3P`3SAm$_-~0VH24ZmO~yOcl{k zwdHM105O2t9^Or@c~^hnd|~XcOla5h*@8OT=9jM>(bsUurKJ%vTstg&WTBs6L>+OA z8!q@zyETYGeE{#md-kCV1dqEG0pYhM?@3dz0T$~q5n83k43L2$V9s{x8X%Q1VA0vw z1(>zRs4BO-xJ-pzRO%?f$))DBuY5fq|Ny|3{PyD688S!o`qDD}ElC3vUmJ{%#9&W}83_ zK;S_Y^SJy*IoWGqUa04Kpi^M|SP*&&l8`Dcs~_Cz_~RIG%-<$GA2VmS15t*h3A3HBNT$sAtj9jBGAujbV- zVEJxdafTZJ6bkxC1h94VXonBJp(K@i40AwDwka-8h>JsC&6BV$-jM&MNIZJBAnQdH z{)EKD*3u|Nz>MhElj>f*DgVZ4_HoB;N9St<3Xit=M>c6XH_xUR&Gw|>{t>lT)P$4A zr4fVWDnOG!AJztOF3EKzrS%bp``TzXaO#d_Q z)U)(zVG%iWKWbn=DJnsLHBd7oO+cXWXyecj2=Q^lu@HJCz}zpN0dR5MLX3!|hQXsI z`QYMa%E+->U%}-gr!r>BI(XmI<0{;^ehY#WY7QVo3c(2caR#OhNYu_}yuNw9>e(`7 zJfUiUR=W_~M&Kr*#=i?D?O^=+ubmVO(Bmly??tAymKtIT*7zN=u>2-2D`e=0N%K#Tuw2qQC;T^%d8rQVt&`h5ij9=AxLa%XKv0S&$d~D)O}ho z#TS_ZD>`dnHGl6$d#i2$Jsd2S1?M z3YT%pJ$?i$&asM-$YRjm zPW>ylcHYcH!i&R=`9R~~sf?f>6Zuy3Zf0q(XeI6)S}|+Uh6C5gJ$w^+DiJwAyOjqB zPNO6cvC2Vr1?LWK-_n42Y>U>kWjN5t2i!jmkLzciZOl4)fiT$!^x#do*jUt1_bQUZ zQx0qI!?wZ`4Vp-lpP=ky*~WaKMfR52^RkeOLyQ(b)b4>GF%6YlDt4ma=mzaT*5z{e z8jvqf_hAkhb?#nucqK!+kOa2bhlj=Nj1R zzqG2%vf3UO{q(b%S_{ zhdD*M01(VG{nUlT#30T)vx6>I_e3^jOsVPrmRrHTSPmk)s@gifgyX>`X3yMzJik)6 z(cp3#diIQAE-<(h)Dko>pv;Qeo)iEoG%KK~>Sh0rR{fQ^4S6S!BcMV7{m#9qR*2!p zF->Y+#d79;Y`Z*Ui_*my`f@xl0MP{P*3i{KI&GfG$Jp~ce}v5v#6F;)K-5qgmmsYq zjlIl-$ZL7`8TN+I1++A<8^GlvTw;}RY7i8+!`E%CIU0ohkHVF^Z|_XB*F{a&NOC7@=c6ao>6IxaJk)wR*CoXRA9IS z)+91h3K@R?ImwzBX-tGK`Xs`UsXsp{nqV6Z!$xVfSo+74m|B5K)W&G$Zt;!`d1V`o zBHn(UGWfC+%+vAB7dC@B{;*9Jt1uRWWkMGYQ_Q_#j%64#m6L97vB+e;kdG#QKO3q3 z?x^}-`VSUMti6Bs0?@+!Ym3?c(gpb+vIu(n8jPNNSJrV?WME}<@%Qy3o~duJeTejA`~l3>eM-gyKEFe3FF`TVb@*9KoIT{} zkOAM3bmLWN>E*G&7CgY@oW$mn&z?=xdtL{42rx;fM5zMUA$R%)ZxK^8fX_m|l&dSy zUh1=6^+EqZ{fV4tbOG$NnRS}ovL8!!dJCvTXa;guE+sKpCT6@QtwtOjx}P>UJ6e`S zpII&;bL0N~`?$5RuF3vNfV9PHCrhfrjmGWu=G!--cJIE&@2xv$XvpR*kU%uVkz6ZN7!_ ze6cmN3KDp=MkYv#5;?Fub_Xn77tJ9tiXi8(yAn7yoJT*5SECR?rHlosm<9P2iYnw- zF_^p(5fMB(f?)N5$rtc6`6qm$j@D<_UN~u*fmn=ZrqkEDt1A5BwR0p3`a^3L95v}^ zZ$~5*N+9QqBPIySf-c=GUAd7^anwCfB07Dn=|lCy8m-?WRU$Ao(q{`+gr?h@zkCg! zQ!oP(bDgzWX&e$O*0YYjcz{YchO0j{{}?rUppb#Qj~O6CAF5a`vocJ5m`%js6)t=L z%P4&)C0t$Lh)MA*Td+W?pIgS>)I5T*3A`hUmU7&MtHFIutz#P70VvPy1AHRf@&efjbPmk^R?g6lE9((9a2(p(+t`{$p3 zqCv(LouG))UYVyr;?3IHdf&c}V7}L+SZJEHGEy(^1YV7oWgkC&Y=shB<8f3B(M_Na zhJ0J1YOv(`^>?Z7|9L14fP4KKRLyvXwVT(6a`S|e z9zk7QUE?q)y0^p`?v6!5P~&Aj6ut@@4}d9f*~rPj%!la+9p?*vYQ#A3BX->oTY!x2 z^B?+LZH-~kV+?JLHzQa^%ft- zVt6O;X}o+7JV>p>-`^ipL_{a7bLWOC453qp>Tx+kB{mR006~Tz502~}IB8HC!w52` zNt-nV3ed|P9oQ3voE%`vF59KjcYzx zW#03gnjQ-a3tw16WQ}UWcjDxI%u)=N#0Ac#3NG&b+GO*mc3}^}-%a{HbL|}eq?j{J z!nd0S)%Hkd2aC1@BFO;zJJ(;zRFdPhH+7vWP#v4 zU!H2FK>vvgJ-dX7d{^dANwzpL9D5R+Qqb**t_-v@%eLVezbdL-P-7q|LaHT*9?1e& zE4+?b(A4GA$6~AM@AJT<6Zd>K8zYDtAcXIweOqjb-S7PUa~bfkP_GtrBwx(As{_@D z=H}+kZ3@onIl;HIRz-#;`s^D=^vJK;_(ZKwxS+4xr*&xJu*#XnpncFvn;UoA9uMr- zBy8C*sMd}LUi`FB-|j%wp1pgwci>$BHi@!o-CNfK;SrR0fg^XeL2USWY)QQR=wLUV zoI~?C>+=@-Sd*1aO-;GExuI8QJU@)bva$-laz*<1_d~H3C+qjNw`g0F8fpO(2W~6)Ji9};7&H;#`0eVBw@*3dTmTQ7M|K> z$EYd=H|xqm$wb+hx_Hms^61fP1I3Jw^UTfj&A|THY?qAchInZ*NKPtkiKw@oy~2c> z6Rt_GTY|1&5z#+=d`5a!m~XmVDe{URWhY(oU}A&M@Pw!Vkq=s6@Y}tuNW%Yc1{+n z3Gh$1*nn}euZO?cb=>=*)sZ8$NN-UZ5fl{k@$vZzxKroLV+^a=yLT_21rsE*`t;m4 z1K3+7EDKZtJrm~QfvCOC7@++&4W@n5dlkxV(X5wryb{558c;eI8S0t>0~sd-BWW>H zARC9t7|m${s@iQ#eWmM}XW1=;RD(gG#t&7;%TpLDsWdzNE;IM~6$$)`1pdn+fnQ3& z|Fe~Xemn6uLBwjpGbcz3C^wbhMT zB2ZcKQ*Y^y4EsiPvSaYII}jO!u}tS-$$%{djJYkcMutY zN{4TQo>odqF9OFW?FosfUun0MF>L;IPG5ElE5tvseSa~2_yXkYF=yQbs(B>-=a6AI z?T1Sex(N5CRvM_l&d&Z7ihvqfYa&X3o_QcjmT-U9k(A@@e9)>j zCOmwi?(7|{RW1YCEx`~gMyXnT#}2*Yi&w>eH(t}@A3MA#U@GerT}1?n`Q4!pZQXxA z#$}@F7q-F#0ku?wd~Ot+oP*;#@RrfYaoNyb75X@vH*XH+M+ooYk`57CHz?VnVk!~# z5)l+?vFHOj!C|auht{|ry8{UGhew*^oXZWSCWM(}#P~UjST?Lx%5*6V=4GAo_rG5B zD!dlDw)44fN|M$pqUjAI_%;}|MGX&ai&u)-40Aj^hNP3h*hHIJi^zFqy~#m*{rY2{ zj_ls6Fv3)6vcdd{MjybAE0!+3)yXX0Xvx=9S!O?OmH#@_BIadaNR(kP^yR;>x#H#{ zN?Q@*wzqRGUoJ1(8>`dJx+njbLR1vut4=vBW3)IK8P(#+pn@qRKj&gdi8->Q?JN8* zT*$Z|EL4qY4aKGfg@v^T!-ZN0)iM_{!rqpoHlK42KNhpCu)3$dEPQ4sJ19ZA=h+d( zXH1*3SY1)?{Q2|J>vUSqd1WqJwygKAaY7^l!A552&4~ZLH+AIYDTnbrHSlG}AeI1# z%AE6SXlQt@!K}7cZjQXN4W&#WQD`O!%Q6eux@>j_vhmg52L_f@LwY%MITO!J@R43; z;t4qaauxap7DY18Lc%%ebz*>Q$4J{IJ^ORCpBh^fV_UOW3Ck-D|2B87$5@An31~zX z7Og1ULgMnA=31y;A)d#R4U>Jv+->nQGA-r(@JV}C}nQwiPYYC)2&}V$P)jmT_lUbasR6#U)2?`C2A2l}SinZzJ zFx4noynFqA4dnVYr0mzswO>Fv%dgpdEdP&rg}37O^ZY|Ez`vu+UWvT?5aKfQX?S3K z12tGdhrtA1+zUVjbnFE}446!2^O2K7?%Bxqfnt($F*wVx@7>bNkmHv2}@i*6>Up3L!Krs=x3G#U8A){^v@iR<__)?S6 zOKoJk*I_6+kR0G~2bf@Xwx^@xcN=aTwxM(v^?+RqOg6r7fz4 zBuf;p024!z1a$NT&h=GmZ+_qJmkqVeEi^SX?VwLcgGs)IFy50AC!D?0;J1eIXq%Uv9_lVxbTX^0nBJaQ(QjFLlRE#4`{S%t?qr$_5QXn0Y zk62A&S#J$yidlj*qoc2{|8)PyhXB;T!4Br9;K^D_b}Sb=<_A)0b$GeiZKoeNo?Ur& zD&FL1n$C4K>1^$>lL1MdsxSAf)-X+Z*I4#N7f_tm9yV6iYyF`cj=YytP%t*nMNcd# zq=#K_?ZVVH`uV=l_BdMh5bzT|x*yLNxr~>i#PfjoS>aMYW#a*2Ld>1ptH5j=i8&#??yzbw z)%o-Lh+dR%1md|gW!H|zV{B7r2E~>*P^%9RDHP2iQ<~oga<06TlvDYiKq}FUv80+QR{w7fp=vOC^<&c&Aen;=Mw~)T zb#<7U?(S|#yonKyk(*l-RN6vCZB)3`+{f3bu3x*Uw#t6o!;WzQdb{_zVnvAvUN1e%FeC0<&ySjW| zoRoz56CE*P=pGMsy^X@i7nrG$^2^yc0pmF)M(MT<;K;ti;JwzJ%+EzS;&Uk-q-sl@ z^_cq%L#qJ27=YY37y5>F`NVAg_U8tiEHyS}Ca2f>*pK~(c7%cZQxrMS;7Z!pvVKX- zw+EH|{7giDq`Vt?j5zrKiZtbeW1Ke>;DI0Fh(u1;w?mwzC6x5x(r(+V1<09|oq zIn$y*U}ch7LrSU9Wrz3|*v0)`NJ7JaN7z_bxOFB&cvIxlluCQ2*z7@)KSEhp+5Np` z{Md_}(e1k`PPEHB)fR&m(-`6dd;&IT3ad1aAHFZr=(db*Yi+rmJZThNnh#Kr6@l<7!Z}3{%FvxaGD7J6hkT(UbU+dLLv`&? zZRW9d4M=m*xVN}oC#ZLDqOX2>&-9`r9E$7q)K5kix{I7AW=nl7+b$$uvL}1;NH|pP z(2)+7ctT7}OnUkt$#$a@+1TyEzd!~W*;H7R|FV`Zu|ocfvfat!`;b^rMEl65o_o|3 zP$c!*5f2^zJpnr0XXpeju9#A^9FH>&BErtLq+NIukbB3I1}xh^vfJdt!Z+Ali%!JV z9qW=GKYlFWJNeCK4mrBZspWE6)6qR@RT0o4e1FN=!X|LAliJhVjvHSvJ#=i(DGm4E zeGCUcRwYdt*FAzC@Ls7U6ixksDU)wi$7x1+f-3@174Z+gES-LLY$jPXL3j0~(`**E z(DQdR4p;fg3Km&nx&!H;@IsEg<-&$KN`1Co;5-8DC<2brkeG&cN?&CX3KYENLY?{s zI~Mc!K*3|~@{JEsmnRYg#18luyhF|fE-~mT??@$`H>kY4oTlJlnC%75^=h@1q@q>t zIdUdQQb~Si1pCdtHA)W-Np1wm%_`yvs48IK9^hYKi7tPvRl*VLq1l~%)E$bB2vl2X zxD0w$AwtOooe^RfeYI5NFt}Qk&hD%cnAO-l2nmv?vutwT{vv?^gi!dOvO^CcR0S=W zVPe{(H{waSJqH^)&1MG*N0)tmXAw09aa=Rh-O--Xg;!n&{=gwg&I?;9;=mC`@1_Nm zT6_zj+#3b0@{JxK8Q6SEaG6pXZlf2R6F0JH+@twYJ6|wV|8FH=~8v0qohi zOqw_D8x6hd-=>LR3%z%YmfqAAuIM$6Ex(`}q#&n>#?6SGPSqM=m5F_GCVYibmu1zR zcSNRudW3!@59b9;7N&U)np|^2tnzHl@(5rtCGTrT()am^o!fvVoUvuFa(hJH% z94xeI)verzEd8@dpn&%?taR$K>Dhf%d%Ifi^{BHM=CH6>V8B zOUJMCwu{{ObKxZZM!d)rv_!W(e%`Z)XF21d?D@0o-@tU9l6Jn58cLyvtU;l9~r?g=+$Sbbp;0>E$x{1k?l1xPEAVG3?#JE+fXlsj=^8o_JE=V z{x*9zcI4Ghi6SPG%7cO`E!W6)?-sPzU7G^si{2jX9dDXv1W!#|%p#NuMIIs;5`!9J zzETQ|kdJrZ2$|s7{?wjwYd||{>0O&i{kr#yt*{(WG|_rdhp!DbGd;HFg+`6cCVwGe z;q6l)hpbvF?ppV?CL@K_Ve+k3<~f=G+Y~Ypa3MsUU45;Mlu{wwl>xs8Gl|tbyY*(b zi#wi!#!zARgXYZXs|;=u*-DcBSn}H2W78VOF>xc!5PVuSk8hj*o&NnXmy%fAXru0N zYJ4@zURRD=b86*1#bCJmOw}3J>--9vpuYt2;?~A*z#rU4`nRw z&PbkZ)0~Ilxz`+f(d@OLcwok)c`&s^8H!O2S>S_JmWL9~;hMdYobp6dgpP7v116T_ z;En!fI!ntY*5Saz>}hZLCi+Y!LT65&%c=WiiM>vW`?R-4TX)5$cEVe5Evh+SU~GJC zc;o;oRx=ynuihNl!_ub}Ek0i^*%_Llz<&_UW;|7D=c;}FkJ9Xi$udLLiK9iRw;_9n9f=w!m? zC{ZbeYg;2Eq?SkHUR9!4`u4OlZ0|6&dMm$%Ks2nYMT{oa#q{s}tqYp|De1m1mtI^J zV>>Y6Iz{EuTZ=~IbE;ha-0~!X$kC}dSWhB?;&0a|jfFPm9rBnH7za}_J>PeZX!^c@ zYX`4|Bk18_yl0p^f3&aZ!4xm(231)5;V3%F*f$|)0x7dyPQv>*FYX-7#-|GG97*c% z(qMfGoW!9ve`Mi(TqxhSY10b&WbcdyhLct7RM;oFRD zYDr4%?3)k|Nw`c2!>vE~`P~_Z(a7Yx51|L>*P)MyMv45Jy&Hm+o1g#2la}AqO)P7u z1^ed03z}O+`I<76XPi5#)-;Vxc_UkSjgDhNDy%Kq%YJX1&$rd|z6F-t$P@=MLSvy| zkr7yrY*OwyNN*wX;cR&y{tM<^Y(8!5rzw1s`pvMh5oSa|ueb3Vl3=JjXcpAB!0&m1 zrLn*c-CtKvOe&Wl3#QwFo;H=KFic&bKg4CG{@jvn{9f1@smrInxo}AGIA$?;LaQQ3 z#S}+5L{Jk-^E&t^n41^RpJ&4r!1hgZ+f5@m&zw19P_l$)W)B!=`*c5)#8Smv@rcetT^QB2%o9z4UF9O2cTG#? zUD!(Zf75?sLfp{gH*8_@jD<6UL4|~dS{{_ROkq3AT|*Iqv4zXI_MiwKJQ|{GwqgI} z#7RVnHn6y=r>9RhbSGr`Z4(v)(yUK~;2iW=MTCVvjHSUYFI#VQ(PztKT_IOX?NG^_ zxchD?U<-F)GM&Ol?KfK1|ghvU{Jt3J8|BmM25*=M9t+=S&QB!v3PiP?Y@)u@F*xSSJpG*q> zbHRmu^?fj|3Xq+m)@K}?0feesy__KcZYG=hq!1F=oTK|Mix>odab#h!|Kk*C$N!aW zhL~hSjqPT=oC{lT!mc9lI1GD1tAihH0w9}4@tv5tla9Ei?2x42>Pam3HR-kU91ecLHVbh#3nwfualo+%Ndj*4~AN& zkUj=>6Q7R@RwNx&8ol+RVq&z#NvDS@{Gg@dkXs?x27R7NM<|6PAqIz`2t0(t$z$YbHJBOxmevz7(5 zX3*R3Ad-Y}#%b+*eIpm@F0dl$2ucKp%8c7SAn78$KJpz(8Gs%OiHLNfryrRCq~go) z>-RB6@eU%(;ls%8L0CWvI*?G*l!Uwp=wKwaL)sEh%qP8|d+akeITh}Xmtbe{o>(-4 z#e3cuG}KtDqLF6bdNhWqBO#ZQzzw&GErGfR+EePWJ`1gBHo{M$)Cf(IoE(cu3~r&<1X%P(u>1&0aqKqzi2>ug zQftkf{413(0R?VB`>~s+=QvH2#pz5q4&}Bj2Oei#yy`SjG>+iySb%+Ei+j<>r4A0} z#u$+JbdH~&UxoW3mcQysNVl}e68XJXPlIUcxzl(K60pNQsDl>MxqI2@jz|6g(es0q z*_N)ZL$7iW!m=q0GUWSFfUMnHa3Hxk7nxmO=eu5%_w*XG&+U2MnI1f2k*~5biU&Ao z5Tm%C(2sUvsNEFe_`5stn8f4%)@M$5o5#+}tQLMp(V<)8} zP{qdZ%Rf*YW#4{HLZPt#4R-EZ=sjV}#vamvNGGyU$eOsp2Zl<`EQlE09p4;PJ;?W> z$i1kD9(pp%eOZEi+taWk&}(l7G{!do=Z-ZdY?BFmJq`?>bgnAC zP9UiyH_R8Lg0PX~^YEYBj~~k|_5(W5hN#gJq2KEV09UZ~5FzvU76L&sYoI6y8_pBT zXN?bn-$)`{IEE>*_h`f(sITXhd2y7y0OstvXBf8h4P_)avWVWMuOS61=u1du-93RR zr=NjdtP&MP0j-_J@u72ANz1JpI7eN!hZ{`Z znl%VtyHJsY?jwAwB-|)YOe|oyVqd&-4afkHgcNK=S!qKh_Dchn`-}T|c`o3b#lG z6t89A62K;nqcntI;S`e0K6wcTef1szH?$2B2Q^`OD8yRV;rG{j!6CuUiaDeRxTv}8 z2}(VoQX{y4^Mp+q_&5f7X~!fB%k>QnBO}{s^nuz0E7D~(&nuO%CU{+X9_WIaz9vG_ zGB`+%-AZaj`+@Tr5)w_^9aCAfILNaFRyetKkt$aR8#U5Hszb0*;*~V%J11Ig_eO2n zqo-K#ss0s(XDlpik*dm@bQ@rfuX(Z}TRsk>tYc&B0cEub1{xc{XWYtMSH+o z(-4kIo6SqBaXVy-0a<++PegG21R?9w2E?bA8{0O(F`ccbS8@Y5f>hkHeQX(0Ml??< zPUWM78%AocUK7AT*p%r$H2ooeiHV`*3*y}Xc-bLQsARv&*8-1I*2o%^khb>?j`m3dA^XR4*4ri zHoF~8Ah|3xu|w1SVKN$WeFPhEP(2~JYx(ILRB<*Odd;)t6r{L-6pBiZV&Eu+d6KgA zM$%2kfpzN`hIWBPqBY|^jsetZ%iB^!Nn>l19LDV=gqK9hNVs%r@7!624%f@krAReM zqw1jnr7j-_)H$!iNDnGp2W&s> zo-OwH+aL4lZFA>lb+YATLB4d|Sx7qN043TZFz@8?jRlf4OjnN)a%_Vx|1h3MW4stk z9l{nez?F?zhUIO&w{H5+ZbU$_@#^K63I}@uB2$&ONtM*KA2K9;N5dl#@X|B7MfXlV z-HGhtw??CW9#ud9WEtjjLEg(TU|4-+q|B~R7rASOk=t8kcG9!=7|$VL{vDH7-l{%$ z#|bYy@Fc~z8L@zIV`7@gLLi_9ul;0H00FcnjR;Wyhlxq6d)Da89vT{gq@GG1jCLYa z0s4POUaVHT5ApfaqwGk=px4!AsvT-ukoux(d8id^z&r~6u1dD6AXqt>UY=B(1dols z_f3Zu==D>q36DxKL1d~|a>8k;!h{DnU+}xrd=N%#Z`E63XuD~i7vlZ(o&&aTI@axy zMa-qLvNFU0fuBYRv|gsNr4Pg3wpT`WHqluuv9ROhOO{7OD_!uN%{c=+T$)T#Uuz!P7c~8zDei zeeBfhPrLPk3-!KuaGz+le~(`@b-NgOT}%x+b@1g!42tHN#yIWUakQa3UInZSf@zRs zG{FA3_5DE;z`|fQWCy!W4X9bLeXvT~rQx}1N6*bbD}hKmvoWhpt_S5 z8-XY~_TSN<7^QvsjgsU9#7MuNtw^%vx8Ypjs|*8-wDy9-t-~2o1uyBeYTqZGq(KG9 zn}bI&g?Jsm*40jZqwz1wQ)lE%sq6|(s z(44dK(aT|rGUPfuFe1molink$>e+u}JoF4te8H7&OxjkOE%OBAD(?g?r?>kzjY8bW zLM&(^q!`er#M`}2g?i59)OoG}p>OZV2~vr9zik4#A_`}rEp^456CU&SGSjgX!mH<% z;uMzX|8B#Etv$e%6U6)XH7K!ov%R=l5*Y5@2*HtRZSX5kx?p#${}9F#DBG04hbRb> zQdRQ+h6qO5{*fwn`%!bqWBDH7^r7YgG?=26rz2`hPdcPZg3KouUmheH=*#%fof#4Z znOFYay-##^?|ut#>*Lz=gr(U4lc>D$v;hiThbw5&{P`6#TgjwZH2J_NiXDrzqc6np@p#X{OtCK3UWpW^(l^ zcw{Y;TA0&KqmUUlT^E8=E_0SHx~Kn=Y?InHY^ZsK2a>HmV1OjwSzvMrM-=g-RyjKW z<2Xa3e7eumN0U~&!(dlF@--bv0RW8L%FK2UQJU^ZFfanD7CmhsNJKD9?}%pW=GqJE zmi)uzjSz}$8YS7cC`HA+Vdqg4IEyBrE8{nNg+p-`;_tMbw@7{LXB*jVpMM zNfmIB!O-18`SCF3sC>rcfZ43r?|WX1aa(o5Zf0US+^JmBFOv#uewAJx^w`o?RaG_h z3z7WbvXx0B^-Y#GfvT2W${sa#g~z_u$(Qk1v;o++L0Yk%Io2fRRlyZLiVYJO?qLC2_)_7B*7T`+M+C%GJ>ZsiXrr*i$5&jj}SL|4t{S%r&REisC)!E%k%K{HBbTN z4k&cC>Ca_T{N7P5CQU}Q;$68+Q@^7E|C{`!4yJ#{H0{Z-@0zHV!lC)*f^h8AR^Ea< zc^s}EjY3Nd>qXYAF#;VMcy>3W$8V#K?89YWM2&(k6~sJ2C5`|X5BGUeomHkekbn}T z8c+GmAcq2#HBx-{8uam!#sCefCDyFaPX(^NFpqNcg8}lFBKODAVgD%Hj{OOB&nD7K zgliS_e1K#Jt|rp<*{mGUEs>7EafWu7L#DbtqP%{?| zTNGJLI@Hk7@uJ49(RIiYFr0eO$ni$H8_ycJ3;fSbvb#bE^~&HPfIIo)b4 zwwpvj4P(2Bva+zO9PW*p;JUK~>3?950*Z+=@A*rcnhVfHy<;wU^S4bcL5^|JQvhG9 zgOIjD{W_AF{r-nFXRL?yzD^2mQPC~%%}$zp00kQAcR*JD^5vKmi({ygVvro6PQbyZ zDY_y~)-grI7o<^q1NlFEGUtY)hTlQ}9mw{X@HIJDYsOBTj|0x1gp~Z44XoIv5rWo* zicfRC^vPU$utfa!%`n%pElZ}Yp}cqE;AEE0{2Cef*(aEqAPqTL&|GM!;JcC-V2P+2 zd!e*Q1?qa3E8$e2ISvC!fslvo9L=gti{}@am9*yix9{@&-q79??qF`{0GfmXlAh$YNYMm;|RWvAI|l4~pX zDe#-RQ?fCM<*g9|mSf=nl3R+>33I_30;Gim%V3kD z8xbzK3dtQ6W3~v)<&;csi;K92$y`|29bw{TC~70$0NQsDEfM?oHxM+6ApM}f%qLiy zFPMEHBf%^;ZH`VGft93w2UVW<(20XDn$-F2)OgL!h0N8?lDtzP4;07tUX9)S1| zc^zg%wVs!FwG?&K3u5Er5CsSNGlxdR;q_sUx&14AgBrs`Th#b%U{}azdb~EMvi8qW zUD*+pAGD1d1q%~Vg9pt>Lc_3|0Nz74&p=D-HFQUrgOfC5uxll>7bV7qm-w81>A$X; zEOK#lcl)(*WGMFs==a!2O^iw~*2aQBwzu(QomfU9QIf^#iOmQ4W{m*}Vx{HI0X%zCyXhg zh&3G}C6Hm?Kv zih!A^!uP#$dVs5H>ih)0TYgSO`k&r7S2;05R3>iY)Yy*=)ZC`JMML@CANx-J3#Rp6 AEC2ui literal 0 HcmV?d00001 diff --git a/vignettes/reference/figures/top_features.png b/vignettes/reference/figures/top_features.png new file mode 100644 index 0000000000000000000000000000000000000000..807775f9430a6a7f7a66a0ec6e01c2c5b501f9a1 GIT binary patch literal 62981 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 UGdC8lwE_9c)78&qol`;+0Dxn}#{d8T literal 0 HcmV?d00001