diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ad0dc044f4..aa82362b9e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,12 +28,12 @@ jobs: bundle exec jekyll build # Next we check all the links in our site to make sure we aren't pushing up broken links. - name: Check HTML - uses: chabad360/htmlproofer@master + uses: zoeleblanc/htmlproofer@master if : github.event.action != 'closed' with: directory: "./_site" # The directory to scan - arguments: '--assume-extension --empty-alt-ignore --alt-ignore "/.*/" --file-ignore "/assets/,/retired/,/retirada/,/retrait/,/posts/" --timeframe "30d" --only-4xx --http-status-ignore 429,403,400 --url-ignore "/http://www.gutenberg.org/*/,/https://github.com/programminghistorian/jekyll/(commits|blob)/*/,/\#/,/espanol/,/deprecated/,/collection.britishmuseum.org/,/analytics.hathitrust.org/,/fr.wikipedia.org/wiki/,https://web.archive.org/web/20180831094856/http://www.dlsi.ua.es/~borja/riilua/6.TopicModeling_v02.pdf"' + arguments: --assume-extension --empty-alt-ignore --alt-ignore "/.*/" --file-ignore "/assets/,/retired/,/retirada/,/retrait/,/posts/" --timeframe "30d" --only-4xx --http-status-ignore 429,403,400 --url-ignore "/http://www.gutenberg.org/*/,/https://github.com/programminghistorian/jekyll/(commits|blob)/*/,/\#/,/espanol/,/deprecated/,/collection.britishmuseum.org/,/analytics.hathitrust.org/,/fr.wikipedia.org/wiki/,https://web.archive.org/web/20180831094856/http://www.dlsi.ua.es/~borja/riilua/6.TopicModeling_v02.pdf" --allow-hash-href # The arguments to pass to HTMLProofer # Finally if we are successful in building, we trigger a rebuild of our search index in the search-index repository - name: Trigger next workflow diff --git a/Gemfile b/Gemfile index 49745fd41a..4779aebab5 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' gem 'github-pages' gem 'jekyll-redirect-from' -gem 'html-proofer' -gem 'jekyll-paginate' \ No newline at end of file +gem 'jekyll-paginate' +gem 'html-proofer', "~> 3.0", "< 3.18" \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 14249d6dbd..4484dd0b56 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,89 +1,92 @@ GEM remote: https://rubygems.org/ specs: - activesupport (6.0.2.2) + activesupport (6.0.5.1) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - zeitwerk (~> 2.2) - addressable (2.7.0) + zeitwerk (~> 2.2, >= 2.2.2) + addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.11.1) colorator (1.1.0) - commonmarker (0.17.13) - ruby-enum (~> 0.5) - concurrent-ruby (1.1.6) - dnsruby (1.61.3) - addressable (~> 2.5) - em-websocket (0.5.1) + commonmarker (0.23.5) + concurrent-ruby (1.1.10) + dnsruby (1.61.9) + simpleidn (~> 0.1) + em-websocket (0.5.3) eventmachine (>= 0.12.9) - http_parser.rb (~> 0.6.0) - ethon (0.12.0) - ffi (>= 1.3.0) + http_parser.rb (~> 0) + ethon (0.15.0) + ffi (>= 1.15.0) eventmachine (1.2.7) - execjs (2.7.0) - faraday (1.0.1) - multipart-post (>= 1.2, < 3) - ffi (1.12.2) + execjs (2.8.1) + faraday (2.3.0) + faraday-net_http (~> 2.0) + ruby2_keywords (>= 0.0.4) + faraday-net_http (2.0.3) + ffi (1.15.5) forwardable-extended (2.6.0) gemoji (3.0.1) - github-pages (204) - github-pages-health-check (= 1.16.1) - jekyll (= 3.8.5) + github-pages (227) + github-pages-health-check (= 1.17.9) + jekyll (= 3.9.2) jekyll-avatar (= 0.7.0) jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.1.6) + jekyll-commonmark-ghpages (= 0.2.0) jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.13.0) + jekyll-feed (= 0.15.1) jekyll-gist (= 1.5.0) jekyll-github-metadata (= 2.13.0) - jekyll-mentions (= 1.5.1) + jekyll-include-cache (= 0.2.1) + jekyll-mentions (= 1.6.0) jekyll-optional-front-matter (= 0.3.2) jekyll-paginate (= 1.1.0) jekyll-readme-index (= 0.3.0) - jekyll-redirect-from (= 0.15.0) + jekyll-redirect-from (= 0.16.0) jekyll-relative-links (= 0.6.1) - jekyll-remote-theme (= 0.4.1) + jekyll-remote-theme (= 0.4.3) jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.6.1) + jekyll-seo-tag (= 2.8.0) jekyll-sitemap (= 1.4.0) jekyll-swiss (= 1.0.0) - jekyll-theme-architect (= 0.1.1) - jekyll-theme-cayman (= 0.1.1) - jekyll-theme-dinky (= 0.1.1) - jekyll-theme-hacker (= 0.1.1) - jekyll-theme-leap-day (= 0.1.1) - jekyll-theme-merlot (= 0.1.1) - jekyll-theme-midnight (= 0.1.1) - jekyll-theme-minimal (= 0.1.1) - jekyll-theme-modernist (= 0.1.1) - jekyll-theme-primer (= 0.5.4) - jekyll-theme-slate (= 0.1.1) - jekyll-theme-tactile (= 0.1.1) - jekyll-theme-time-machine (= 0.1.1) + jekyll-theme-architect (= 0.2.0) + jekyll-theme-cayman (= 0.2.0) + jekyll-theme-dinky (= 0.2.0) + jekyll-theme-hacker (= 0.2.0) + jekyll-theme-leap-day (= 0.2.0) + jekyll-theme-merlot (= 0.2.0) + jekyll-theme-midnight (= 0.2.0) + jekyll-theme-minimal (= 0.2.0) + jekyll-theme-modernist (= 0.2.0) + jekyll-theme-primer (= 0.6.0) + jekyll-theme-slate (= 0.2.0) + jekyll-theme-tactile (= 0.2.0) + jekyll-theme-time-machine (= 0.2.0) jekyll-titles-from-headings (= 0.5.3) - jemoji (= 0.11.1) - kramdown (= 1.17.0) + jemoji (= 0.12.0) + kramdown (= 2.3.2) + kramdown-parser-gfm (= 1.1.0) liquid (= 4.0.3) mercenary (~> 0.3) minima (= 2.5.1) - nokogiri (>= 1.10.4, < 2.0) - rouge (= 3.13.0) + nokogiri (>= 1.13.6, < 2.0) + rouge (= 3.26.0) terminal-table (~> 1.4) - github-pages-health-check (1.16.1) + github-pages-health-check (1.17.9) addressable (~> 2.3) dnsruby (~> 1.60) octokit (~> 4.0) - public_suffix (~> 3.0) + public_suffix (>= 3.0, < 5.0) typhoeus (~> 1.3) - html-pipeline (2.12.3) + html-pipeline (2.14.2) activesupport (>= 2) nokogiri (>= 1.4) - html-proofer (3.15.2) + html-proofer (3.17.4) addressable (~> 2.3) mercenary (~> 0.3) nokogumbo (~> 2.0) @@ -91,17 +94,17 @@ GEM rainbow (~> 3.0) typhoeus (~> 1.3) yell (~> 2.0) - http_parser.rb (0.6.0) + http_parser.rb (0.8.0) i18n (0.9.5) concurrent-ruby (~> 1.0) - jekyll (3.8.5) + jekyll (3.9.2) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) i18n (~> 0.7) jekyll-sass-converter (~> 1.0) jekyll-watch (~> 2.0) - kramdown (~> 1.14) + kramdown (>= 1.17, < 3) liquid (~> 4.0) mercenary (~> 0.3.3) pathutil (~> 0.9) @@ -112,23 +115,25 @@ GEM jekyll-coffeescript (1.1.1) coffee-script (~> 2.2) coffee-script-source (~> 1.11.1) - jekyll-commonmark (1.3.1) - commonmarker (~> 0.14) - jekyll (>= 3.7, < 5.0) - jekyll-commonmark-ghpages (0.1.6) - commonmarker (~> 0.17.6) - jekyll-commonmark (~> 1.2) + jekyll-commonmark (1.4.0) + commonmarker (~> 0.22) + jekyll-commonmark-ghpages (0.2.0) + commonmarker (~> 0.23.4) + jekyll (~> 3.9.0) + jekyll-commonmark (~> 1.4.0) rouge (>= 2.0, < 4.0) jekyll-default-layout (0.1.4) jekyll (~> 3.0) - jekyll-feed (0.13.0) + jekyll-feed (0.15.1) jekyll (>= 3.7, < 5.0) jekyll-gist (1.5.0) octokit (~> 4.2) jekyll-github-metadata (2.13.0) jekyll (>= 3.4, < 5.0) octokit (~> 4.0, != 4.4.0) - jekyll-mentions (1.5.1) + jekyll-include-cache (0.2.1) + jekyll (>= 3.7, < 5.0) + jekyll-mentions (1.6.0) html-pipeline (~> 2.3) jekyll (>= 3.7, < 5.0) jekyll-optional-front-matter (0.3.2) @@ -136,129 +141,139 @@ GEM jekyll-paginate (1.1.0) jekyll-readme-index (0.3.0) jekyll (>= 3.0, < 5.0) - jekyll-redirect-from (0.15.0) + jekyll-redirect-from (0.16.0) jekyll (>= 3.3, < 5.0) jekyll-relative-links (0.6.1) jekyll (>= 3.3, < 5.0) - jekyll-remote-theme (0.4.1) + jekyll-remote-theme (0.4.3) addressable (~> 2.0) jekyll (>= 3.5, < 5.0) - rubyzip (>= 1.3.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) jekyll-sass-converter (1.5.2) sass (~> 3.4) - jekyll-seo-tag (2.6.1) - jekyll (>= 3.3, < 5.0) + jekyll-seo-tag (2.8.0) + jekyll (>= 3.8, < 5.0) jekyll-sitemap (1.4.0) jekyll (>= 3.7, < 5.0) jekyll-swiss (1.0.0) - jekyll-theme-architect (0.1.1) - jekyll (~> 3.5) + jekyll-theme-architect (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-cayman (0.1.1) - jekyll (~> 3.5) + jekyll-theme-cayman (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-dinky (0.1.1) - jekyll (~> 3.5) + jekyll-theme-dinky (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-hacker (0.1.1) - jekyll (~> 3.5) + jekyll-theme-hacker (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-leap-day (0.1.1) - jekyll (~> 3.5) + jekyll-theme-leap-day (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-merlot (0.1.1) - jekyll (~> 3.5) + jekyll-theme-merlot (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-midnight (0.1.1) - jekyll (~> 3.5) + jekyll-theme-midnight (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-minimal (0.1.1) - jekyll (~> 3.5) + jekyll-theme-minimal (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-modernist (0.1.1) - jekyll (~> 3.5) + jekyll-theme-modernist (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-primer (0.5.4) + jekyll-theme-primer (0.6.0) jekyll (> 3.5, < 5.0) jekyll-github-metadata (~> 2.9) jekyll-seo-tag (~> 2.0) - jekyll-theme-slate (0.1.1) - jekyll (~> 3.5) + jekyll-theme-slate (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-tactile (0.1.1) - jekyll (~> 3.5) + jekyll-theme-tactile (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) - jekyll-theme-time-machine (0.1.1) - jekyll (~> 3.5) + jekyll-theme-time-machine (0.2.0) + jekyll (> 3.5, < 5.0) jekyll-seo-tag (~> 2.0) jekyll-titles-from-headings (0.5.3) jekyll (>= 3.3, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) - jemoji (0.11.1) + jemoji (0.12.0) gemoji (~> 3.0) html-pipeline (~> 2.2) jekyll (>= 3.0, < 5.0) - kramdown (1.17.0) + kramdown (2.3.2) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) liquid (4.0.3) - listen (3.2.1) + listen (3.7.1) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) - mini_portile2 (2.4.0) + mini_portile2 (2.8.0) minima (2.5.1) jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) - minitest (5.14.0) - multipart-post (2.1.1) - nokogiri (1.10.9) - mini_portile2 (~> 2.4.0) - nokogumbo (2.0.2) + minitest (5.16.2) + nokogiri (1.13.8) + mini_portile2 (~> 2.8.0) + racc (~> 1.4) + nokogumbo (2.0.5) nokogiri (~> 1.8, >= 1.8.4) - octokit (4.18.0) - faraday (>= 0.9) - sawyer (~> 0.8.0, >= 0.5.3) - parallel (1.19.1) + octokit (4.25.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) + parallel (1.22.1) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (3.1.1) - rainbow (3.0.0) - rb-fsevent (0.10.3) + public_suffix (4.0.7) + racc (1.6.0) + rainbow (3.1.1) + rb-fsevent (0.11.1) rb-inotify (0.10.1) ffi (~> 1.0) - rouge (3.13.0) - ruby-enum (0.8.0) - i18n - rubyzip (2.3.0) + rexml (3.2.5) + rouge (3.26.0) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) safe_yaml (1.0.5) sass (3.7.4) sass-listen (~> 4.0.0) sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.2) + sawyer (0.9.2) addressable (>= 2.3.5) - faraday (> 0.8, < 2.0) + faraday (>= 0.17.3, < 3) + simpleidn (0.2.1) + unf (~> 0.1.4) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) thread_safe (0.3.6) - typhoeus (1.3.1) + typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (1.2.7) + tzinfo (1.2.10) thread_safe (~> 0.1) - unicode-display_width (1.7.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.8.2) + unicode-display_width (1.8.0) yell (2.2.2) - zeitwerk (2.3.0) + zeitwerk (2.6.0) PLATFORMS ruby DEPENDENCIES github-pages - html-proofer + html-proofer (~> 3.0, < 3.18) jekyll-paginate jekyll-redirect-from BUNDLED WITH - 2.0.2 + 2.1.4 diff --git a/_build/build.sh b/_build/build.sh index 5c6d3674c0..3ddf87a961 100755 --- a/_build/build.sh +++ b/_build/build.sh @@ -2,15 +2,18 @@ # Build site, and then run htmlproofer to check for broken internal and external links -bundle exec jekyll build && bundle exec htmlproofer ./_site \ - --assume-extension \ - --empty-alt-ignore \ - --alt-ignore '/.*/' \ - --file-ignore "/assets/,/retired/,/retirada/,/retrait/,/posts/"\ - --timeframe '30d' \ - --only-4xx \ - --http-status-ignore 429,403,400 \ - --url-ignore "/http://www.gutenberg.org/*/,/https://github.com/programminghistorian/jekyll/(commits|blob)/*/,/\#/,/espanol/,/deprecated/,/collection.britishmuseum.org/,/analytics.hathitrust.org/,/fr.wikipedia.org/wiki/,https://web.archive.org/web/20180831094856/http://www.dlsi.ua.es/~borja/riilua/6.TopicModeling_v02.pdf" +bundle exec jekyll build && htmlproofer _site --assume-extension --empty-alt-ignore --alt-ignore '/.*/' --file-ignore "/assets/,/retired/,/retirada/,/retrait/,/posts/" --timeframe '30d' --only-4xx --http-status-ignore 429,403,400 --url-ignore "/http://www.gutenberg.org/*/,/https://github.com/programminghistorian/jekyll/(commits|blob)/*/,/\#/,/espanol/,/deprecated/,/collection.britishmuseum.org/,/analytics.hathitrust.org/,/fr.wikipedia.org/wiki/,https://web.archive.org/web/20180831094856/http://www.dlsi.ua.es/~borja/riilua/6.TopicModeling_v02.pdf" --allow-hash-href + +## Updated version of htmlproofer commands (internal linking still doesn't work for some reason). +# htmlproofer ./_site \ +# --assume-extension ./_site \ +# --ignore-empty-alt \ +# --ignore-files "/assets/,/retired/,/retirada/,/retrait/,/posts/"\ +# --cache "{ \"timeframe\": { \"external\": \"30d\" } }" \ +# --only-4xx \ +# --ignore-status-codes 429,403,400 \ +# --ignore-urls "/http://www.gutenberg.org/*/,/https://github.com/programminghistorian/jekyll/(commits|blob)/*/,/\#/,/espanol/,/deprecated/,/collection.britishmuseum.org/,/analytics.hathitrust.org/,/fr.wikipedia.org/wiki/,https://web.archive.org/web/20180831094856/http://www.dlsi.ua.es/~borja/riilua/6.TopicModeling_v02.pdf" \ + # The folllowing comments docuemnt what each line of that build script does. diff --git a/_config.yml b/_config.yml index 6e13ee5c5e..637451c402 100755 --- a/_config.yml +++ b/_config.yml @@ -89,3 +89,5 @@ lesson_donation_alerts: true sitewide_donation_banner: true # For local work: bundle exec jekyll serve --watch --baseurl '/proghistdev' or wherever else your local site is located +baseurl: '' +url: "" \ No newline at end of file diff --git a/_data/ph_authors.yml b/_data/ph_authors.yml index 15d5b788c2..eb8fc2b614 100644 --- a/_data/ph_authors.yml +++ b/_data/ph_authors.yml @@ -843,27 +843,26 @@ url: "http://jessicaparr.org/" team: true team_start: 2017 - institution: Simmons College + institution: Northeastern University sortname: Parr affiliation: en: | - Simmons College, USA. + Northeastern University, United States. es: | - Simmons College, Estados Unidos. + Northeastern University, Estados Unidos. fr: | - Simmons College, États-Unis. - en: | - Simmons College, Estados Unidos da América. + Northeastern University, États-Unis. + pt: | + Northeastern University, Estados Unidos. bio: en: | - Jessica Parr is a Lecturer in History at Simmons College (Boston). - She is a scholar of the early modern Atlantic. + Jessica Parr is a Professor of Digital Humanities in the History Department at Northeastern University, Boston, United States. es: | - Jessica Parr enseña en el Simmons College (Boston). Es especialista en la historia del mundo Atlántico moderno temprano. + Jessica Parr es profesora de humanidades digitales en el Departamento de Historia en la Northeastern University, Boston, Estados Unidos. fr: | - Jessica Parr est maîtresse de conférences au Simmons College à Boston et spécialiste du monde atlantique à l'époque moderne. + Jessica Parr est professeure en Humanités numériques au Département d'Histoire à la Northeastern University, Boston, États-Unis. pt: | - Jessica Parr é professora no Simmons College, em Boston, e especialista no mundo atlântico moderno. + Jessica Parr é professora de Humanidades Digitais no Departamento de História na Northeastern University, Boston, Estados Unidos. team_roles: - global-lead status: volunteer @@ -1532,11 +1531,14 @@ - name: Matthew J. Lavin team: false + orcid: 0000-0003-3867-9138 bio: en: | - Matthew J. Lavin is a Clinical Assistant Professor of English and Director of the Digital Media Lab at the University of Pittsburgh. His current scholarship and teaching focus on book history, cultural analytics, turn-of-the-twentieth-century U.S. literature and culture. + Matthew J. Lavin is an Assistant Professor of Data Analytics specializing in Humanities Analytics at Denison University. His current scholarship focuses on book history, cultural analytics, and turn-of-the-twentieth-century U.S. literature and culture. + fr: | + Matthew J. Lavin est Assistant Professor en analyse de données en sciences humaines à Denison University (Ohio, États-Unis). Ses recherches et enseignements portent sur l'histoire du livre, les cultural analytics et la littérature et la culture états-uniennes à l'aube du vingtième siècle. pt: | - Matthew J. Lavin é professor assistente de Inglês e diretor do Digital Media Lab na University of Pittsburgh. A sua atual pesquisa e ensino focam-se na história do livro, análise cultural e literatura e cultura dos Estados Unidos da América na viragem para o século XX. + Matthew J. Lavin é professor assistente de análise de dados com especialização em Análise de Humanidades na Denison University. Suas pesquisas actuais têm como foco a história do livro, análise cultural e literatura e cultura dos Estados Unidos da América na virada para o século XX. - name: Go Sugimoto team: false diff --git a/_data/topics.yml b/_data/topics.yml index 09eff02b48..b0e3fc27c1 100644 --- a/_data/topics.yml +++ b/_data/topics.yml @@ -142,3 +142,14 @@ fr: "Leçons enseignant ou utilisant le langage de programmation R." pt: "Lições que ensinam a utilizar ou que utilizam a linguagem de programação R." +- type: machine-learning + displayname: + en: "Machine Learning" + es: "Aprendizaje automático" + fr: "Apprentissage automatique" + pt: "Aprendizagem automática" + description: + en: "Lessons focused on machine learning." + es: "Lecciones sobre métodos de aprendizaje automático." + fr: "Leçons sur l'apprentissage automatique." + pt: "Lições focadas em aprendizagem automática" diff --git a/_includes/figure.html b/_includes/figure.html index 192ff50737..eeec53ce09 100644 --- a/_includes/figure.html +++ b/_includes/figure.html @@ -20,9 +20,26 @@ {% endif %} {% endif %} -
+{% if include.alt %} +
+ {{ include.alt }} +
+ {{ include.caption | markdownify}} +
+
+{% else %} +
+ {{ include.caption }} +
+ {{ include.caption | markdownify }} +
+
+{% endif %} + + + diff --git a/assets/forms/Authorial-copyright-and-publishing-rights.pdf b/assets/forms/Authorial-copyright-and-publishing-rights.pdf new file mode 100644 index 0000000000..7fba00cd50 Binary files /dev/null and b/assets/forms/Authorial-copyright-and-publishing-rights.pdf differ diff --git "a/assets/forms/Derechos-de-autor-y-de-publicacio\314\201n.pdf" "b/assets/forms/Derechos-de-autor-y-de-publicacio\314\201n.pdf" new file mode 100644 index 0000000000..ae73002bfb Binary files /dev/null and "b/assets/forms/Derechos-de-autor-y-de-publicacio\314\201n.pdf" differ diff --git "a/assets/forms/Derechos-de-autor-y-de-publicaci\303\263n.pdf" "b/assets/forms/Derechos-de-autor-y-de-publicaci\303\263n.pdf" new file mode 100644 index 0000000000..ae73002bfb Binary files /dev/null and "b/assets/forms/Derechos-de-autor-y-de-publicaci\303\263n.pdf" differ diff --git a/assets/getting-started-with-mysql-using-r/dados-amostra-jardim.csv b/assets/getting-started-with-mysql-using-r/dados-amostra-jardim.csv new file mode 100644 index 0000000000..bbb482c3f5 --- /dev/null +++ b/assets/getting-started-with-mysql-using-r/dados-amostra-jardim.csv @@ -0,0 +1,1243 @@ +"titulo_artigo","data_publicacao_artigo","url_artigo","termo_busca_usado" +"-."e;'N'III GARDEN REQUISITES.","1918-05-11","http://newspapers.library.wales/view/3581057/3581061/27/","AllotmentAndGarden" +"ALLOTMENT HOLDER'S MONSTER POTATO.","1918-09-06","http://newspapers.library.wales/view/4129134/4129140/59/","AllotmentAndGarden" +"Advertising","1918-02-13","http://newspapers.library.wales/view/4119222/4119225/38/","AllotmentAndGarden" +"[No title]","1915-09-03","http://newspapers.library.wales/view/4121416/4121418/15/","AllotmentAndGarden" +"HIRWAIN COTTAGE GARDEN and ALLOTMENT HOLDERS' SOCI ETY.","1918-04-06","http://newspapers.library.wales/view/3581012/3581016/24/","AllotmentAndGarden" +"! GARDEN REQUISITES.","1918-06-08","http://newspapers.library.wales/view/3581093/3581097/45/","AllotmentAndGarden" +"I GENDR09. I","1918-08-24","http://newspapers.library.wales/view/4115950/4115952/53/","AllotmentAndGarden" +"! FFO RESTFACH. !","1917-12-08","http://newspapers.library.wales/view/4104378/4104381/56/","AllotmentAndGarden" +"FfORESTFACH.I","1918-01-19","http://newspapers.library.wales/view/4115802/4115804/54/","AllotmentAndGarden" +"FFORESTFACH ALLOTMENTS. I","1918-01-14","http://newspapers.library.wales/view/4104525/4104528/53/","AllotmentAndGarden" +"Advertising","1918-03-22","http://newspapers.library.wales/view/4124570/4124578/119/","AllotmentAndGarden" +"LOCAL SPORTS & SHOWS I","1917-08-11","http://newspapers.library.wales/view/4115664/4115670/133/","AllotmentAndGarden" +"NEATH ALLOTMENTS.","1918-02-26","http://newspapers.library.wales/view/4104714/4104715/4/","AllotmentAndGarden" +"I ..PONTRHYDYFEN....1 1 .1 . 11 1 .-.. I I I","1917-07-25","http://newspapers.library.wales/view/4103783/4103787/85/","AllotmentAndGarden" +": t^O^TRH YDYFEN. I","1917-07-28","http://newspapers.library.wales/view/4115650/4115652/61/","AllotmentAndGarden" +"WAR SAVINGS. I","1917-06-07","http://newspapers.library.wales/view/4094639/4094642/33/","AllotmentAndGarden" +"I Rhymney Valley Notes.","1917-07-07","http://newspapers.library.wales/view/4001721/4001722/7/","AllotmentAndGarden" +"I TILLERS OF THE SOIL. I","1918-02-11","http://newspapers.library.wales/view/4104645/4104647/43/","AllotmentAndGarden" +"ALLOTMENT HOLDERS AND II REQUISITIONING. --","1918-02-15","http://newspapers.library.wales/view/4128903/4128911/62/","AllotmentAndGarden" +"BIRCHCSOVE.j","1918-03-07","http://newspapers.library.wales/view/4104758/4104760/57/","AllotmentAndGarden" +"! GLVM-MEATH. I","1917-05-25","http://newspapers.library.wales/view/4103517/4103521/72/","AllotmentAndGarden" +"PRIZES FOR PLOT-HOLDERS. I","1917-07-02","http://newspapers.library.wales/view/4103683/4103687/82/","AllotmentAndGarden" +"Advertising","1917-06-09","http://newspapers.library.wales/view/3612393/3612397/33/","AllotmentAndGarden" +"GLYN-NEATH.I","1917-06-02","http://newspapers.library.wales/view/4115594/4115597/73/","AllotmentAndGarden" +"Advertising","1918-03-29","http://newspapers.library.wales/view/4124579/4124587/99/","AllotmentAndGarden" +"I PRICE OF MANURE.","1918-10-26","http://newspapers.library.wales/view/3581273/3581280/91/","AllotmentAndGarden" +"BIRCH GROVE.","1917-07-18","http://newspapers.library.wales/view/4103753/4103757/89/","AllotmentAndGarden" +"BIRCHCROVE.","1917-07-21","http://newspapers.library.wales/view/4115643/4115646/69/","AllotmentAndGarden" +"GROW YOUR OWN PRODUCE!I","1916-12-23","http://newspapers.library.wales/view/4093068/4093071/66/","AllotmentAndGarden" +"I IAllotment Law","1918-01-15","http://newspapers.library.wales/view/4009961/4009965/25/","AllotmentAndGarden" +"FOOD FOR HOSPITAL.","1918-03-02","http://newspapers.library.wales/view/4115832/4115833/4/","AllotmentAndGarden" +"FOOD FOR HOSPITAL. I","1918-02-23","http://newspapers.library.wales/view/4104700/4104701/20/","AllotmentAndGarden" +"I GARDEN PESTS. I","1917-10-03","http://newspapers.library.wales/view/4104085/4104088/52/","AllotmentAndGarden" +"ILlangollen Allotment Holders.","1917-11-23","http://newspapers.library.wales/view/4241817/4241825/66/","AllotmentAndGarden" +"!N m GARDEN. J","1917-03-30","http://newspapers.library.wales/view/4103282/4103284/51/","AllotmentAndGarden" +"Ir LLANHARAN.","1916-08-18","http://newspapers.library.wales/view/3886685/3886691/67/","AllotmentAndGarden" +"TO-DAY'S ALLOTMENT HINT.","1918-08-28","http://newspapers.library.wales/view/4105493/4105494/27/","AllotmentAndGarden" +"FFORESTFACH ALLOTMENTS.I - i","1917-02-19","http://newspapers.library.wales/view/4103106/4103108/60/","AllotmentAndGarden" +"I FFORESTFACH ALLOTMENTS.","1917-02-24","http://newspapers.library.wales/view/4115496/4115500/112/","AllotmentAndGarden" +",Trespassing on an Allotment.","1917-08-25","http://newspapers.library.wales/view/3580724/3580732/72/","AllotmentAndGarden" +"I VALE OF NEATH. I","1918-08-31","http://newspapers.library.wales/view/4115955/4115958/75/","AllotmentAndGarden" +"Advertising","1917-06-08","http://newspapers.library.wales/view/4130594/4130600/28/","AllotmentAndGarden" +"Advertising","1917-06-08","http://newspapers.library.wales/view/3690455/3690459/44/","AllotmentAndGarden" +"-_--_.-----------THE GARDENING-,","1917-10-04","http://newspapers.library.wales/view/3858757/3858764/69/","AllotmentAndGarden" +"----___---------------__---_--__-----------:-ITHE WEEKS GARDENING.I","1918-03-28","http://newspapers.library.wales/view/3858982/3858989/63/","AllotmentAndGarden" +"| CAKlMARTHEN BOYS' GARDEN.","1918-10-18","http://newspapers.library.wales/view/3716475/3716477/8/","AllotmentAndGarden" +"Advertising","1917-06-01","http://newspapers.library.wales/view/4031339/4031340/5/","AllotmentAndGarden" +"WAR -PFtOTEbTibii FOR PRIVATE GARDENS.","1918-01-12","http://newspapers.library.wales/view/4123571/4123574/34/","AllotmentAndGarden" +"Advertising","1918-04-13","http://newspapers.library.wales/view/3581021/3581024/29/","AllotmentAndGarden" +"ALLEGED THEFTS FROM ALLOTMENTS.","1918-07-06","http://newspapers.library.wales/view/3581129/3581135/68/","AllotmentAndGarden" +"ALLOTMENT LAW. I - I I","1918-01-04","http://newspapers.library.wales/view/4104485/4104487/42/","AllotmentAndGarden" +"Advertising","1918-03-30","http://newspapers.library.wales/view/3890318/3890325/48/","AllotmentAndGarden" +"ITHE ALLOTMENTS.!","1918-11-07","http://newspapers.library.wales/view/4105812/4105814/33/","AllotmentAndGarden" +"RESOLVEN PRODUCE. I","1917-09-10","http://newspapers.library.wales/view/4103983/4103984/14/","AllotmentAndGarden" +"Advertising","1918-06-14","http://newspapers.library.wales/view/4109051/4109058/38/","AllotmentAndGarden" +"..i POTATO SPRAYING DEMONSTRATIONS, j","1918-06-20","http://newspapers.library.wales/view/4014023/4014024/3/","AllotmentAndGarden" +"FOOD SUPPLY IN CARNARVONSHIRE.","1915-03-05","http://newspapers.library.wales/view/4242889/4242891/10/","AllotmentAndGarden" +"Advertising","1918-01-12","http://newspapers.library.wales/view/3979246/3979251/35/","AllotmentAndGarden" +"Advertising","1918-07-03","http://newspapers.library.wales/view/4105250/4105253/50/","AllotmentAndGarden" +"IMILFORD HAVEN.","1918-03-27","http://newspapers.library.wales/view/4119252/4119255/31/","AllotmentAndGarden" +"l.-ABEBTYSSWG ALLOTMENTS. ;","1918-08-09","http://newspapers.library.wales/view/4031649/4031652/18/","AllotmentAndGarden" +"LLANTWtT MAJOR. I","1918-08-02","http://newspapers.library.wales/view/3887309/3887311/8/","AllotmentAndGarden" +"I .- -__- . -_ I PRESERVING FOOD SUPPLIES.","1914-08-13","http://newspapers.library.wales/view/4096968/4096971/48/","AllotmentAndGarden" +"ITO-DAY'S ALLOTMENT HINT.","1918-04-17","http://newspapers.library.wales/view/4104925/4104926/28/","AllotmentAndGarden" +"[WASTE LAND CULTIVATION. I","1916-12-20","http://newspapers.library.wales/view/4102781/4102782/19/","AllotmentAndGarden" +"?. ???.???_?__?? __. ?_ ^TO-DAY'S ALLOTMENT HINT.","1918-07-09","http://newspapers.library.wales/view/4105277/4105278/31/","AllotmentAndGarden" +"Advertising","1917-02-05","http://newspapers.library.wales/view/4103032/4103037/103/","AllotmentAndGarden" +"- ,.."e;.,.- -- - li-PAYS ALLOTMENT HINT.","1918-03-08","http://newspapers.library.wales/view/4104763/4104764/26/","AllotmentAndGarden" +"LOVELY! AT LEAST. j -..'","1918-07-19","http://newspapers.library.wales/view/4105324/4105327/51/","AllotmentAndGarden" +"NEARLY A THOUSAND.I","1918-02-16","http://newspapers.library.wales/view/4104670/4104671/30/","AllotmentAndGarden" +"[TO-DAY'S ALLOTMENT HINT.","1918-08-19","http://newspapers.library.wales/view/4105453/4105454/27/","AllotmentAndGarden" +"LOCAL ALLOTMEMT -COMPET)TtOM8.","1917-07-07","http://newspapers.library.wales/view/4110479/4110481/65/","AllotmentAndGarden" +"MUMBLES ALLOTTEES.","1918-10-26","http://newspapers.library.wales/view/4110794/4110797/79/","AllotmentAndGarden" +"I PROFITABLE POTATO. I","1917-01-12","http://newspapers.library.wales/view/4122055/4122061/97/","AllotmentAndGarden" +"!CWMBACH FLOWER SHOW ANDI !"e;SPORTS.","1918-09-14","http://newspapers.library.wales/view/3581219/3581221/10/","AllotmentAndGarden" +"% ' j:LLr.'T"e;"e;"e;'Er'/"e;'f;"e; <:nHr"e;',"e;"e;r1"e;/ ! ALL?ME?T SMEMES i o ¡","1917-01-27","http://newspapers.library.wales/view/4115468/4115469/22/","AllotmentAndGarden" +"GOLF OR "e;SPUDS?"e;I","1917-01-10","http://newspapers.library.wales/view/4102888/4102890/51/","AllotmentAndGarden" +"CLYDACH.","1918-08-24","http://newspapers.library.wales/view/4115950/4115952/46/","AllotmentAndGarden" +"THE POTATO PATCH. ''","1918-01-12","http://newspapers.library.wales/view/4115797/4115801/118/","AllotmentAndGarden" +"ALLOTMENTS.","1917-06-30","http://newspapers.library.wales/view/4103678/4103679/15/","AllotmentAndGarden" +"KEATH, I","1918-01-17","http://newspapers.library.wales/view/4104540/4104544/91/","AllotmentAndGarden" +"----n-nn-nI ! THE POTATO PATCH. I","1918-01-08","http://newspapers.library.wales/view/4104500/4104501/25/","AllotmentAndGarden" +"NEARLY A THOUSAND. I","1918-02-23","http://newspapers.library.wales/view/4115827/4115831/117/","AllotmentAndGarden" +"WHAT ABOUT SOUND POTATOE SEED?","1918-02-08","http://newspapers.library.wales/view/3679003/3679004/13/","AllotmentAndGarden" +"Advertising","1917-06-16","http://newspapers.library.wales/view/4115608/4115613/137/","AllotmentAndGarden" +"[No title]","1917-03-08","http://newspapers.library.wales/view/4094522/4094525/38/","AllotmentAndGarden" +"Advertising","1918-06-15","http://newspapers.library.wales/view/3581102/3581106/45/","AllotmentAndGarden" +"MUMBLES.|","1916-06-14","http://newspapers.library.wales/view/4101677/4101681/96/","AllotmentAndGarden" +"Advertising","1918-04-06","http://newspapers.library.wales/view/3890327/3890334/47/","AllotmentAndGarden" +"I _________ALLOTMENT MEN._,","1917-01-16","http://newspapers.library.wales/view/4102919/4102921/52/","AllotmentAndGarden" +"I ¡ LOCAL OTTEE i - - -I'","1918-08-10","http://newspapers.library.wales/view/4110739/4110740/20/","AllotmentAndGarden" +"!IN MY GARDEN. -1","1917-04-11","http://newspapers.library.wales/view/4103327/4103329/32/","AllotmentAndGarden" +"BARRY BUILDING AND SITES COMMITTEE.","1917-09-21","http://newspapers.library.wales/view/4130729/4130736/47/","AllotmentAndGarden" +"Women and Garden Work.","1917-03-15","http://newspapers.library.wales/view/3858496/3858501/47/","AllotmentAndGarden" +""e;WHAT, WErt AND HOW."e; f","1917-01-06","http://newspapers.library.wales/view/4110319/4110324/84/","AllotmentAndGarden" +"....,''''-;.--r?_::., ALLOTMENTS AT BillLTH. -","1918-03-21","http://newspapers.library.wales/view/3858973/3858979/65/","AllotmentAndGarden" +"BARRY PARKS AND LICENSING COMMITTEE.","1918-10-11","http://newspapers.library.wales/view/4129169/4129174/56/","AllotmentAndGarden" +"Importance of Gardening.","1917-04-05","http://newspapers.library.wales/view/4241520/4241527/51/","AllotmentAndGarden" +"SEED POTATOES. I","1917-04-30","http://newspapers.library.wales/view/4103407/4103409/47/","AllotmentAndGarden" +"PCMTAR9AWE. |","1917-05-05","http://newspapers.library.wales/view/4115566/4115568/54/","AllotmentAndGarden" +"Advertising","1918-04-13","http://newspapers.library.wales/view/3979363/3979370/60/","AllotmentAndGarden" +"j BEDWELLTY DISTRICT COUNCIL.","1917-07-27","http://newspapers.library.wales/view/4031379/4031382/18/","AllotmentAndGarden" +"PONTARDAWE COUNCIL._____I","1917-02-02","http://newspapers.library.wales/view/4103018/4103023/122/","AllotmentAndGarden" +"r CORRESPONDENCE.","1918-02-15","http://newspapers.library.wales/view/4128903/4128908/31/","AllotmentAndGarden" +"Advertising","1918-07-19","http://newspapers.library.wales/view/4109096/4109103/29/","AllotmentAndGarden" +"TO-DAY'S ALLOTMENT HINT. |","1918-03-15","http://newspapers.library.wales/view/4104793/4104794/29/","AllotmentAndGarden" +"WAR AGRICULTURAL COMMITTEE.","1916-01-21","http://newspapers.library.wales/view/3413115/3413120/54/","AllotmentAndGarden" +"3ESCLVEN PRODUCE. t","1917-09-15","http://newspapers.library.wales/view/4115699/4115704/155/","AllotmentAndGarden" +"Advertising","1918-09-06","http://newspapers.library.wales/view/4109159/4109166/27/","AllotmentAndGarden" +"Advertising","1918-10-04","http://newspapers.library.wales/view/4109195/4109202/27/","AllotmentAndGarden" +"YR AMERICANIAID.","1918-05-24","http://newspapers.library.wales/view/4109024/4109031/26/","AllotmentAndGarden" +"Advertising","1918-05-31","http://newspapers.library.wales/view/4109033/4109040/22/","AllotmentAndGarden" +"Advertising","1918-07-12","http://newspapers.library.wales/view/4109087/4109094/23/","AllotmentAndGarden" +"Advertising","1918-08-02","http://newspapers.library.wales/view/4109114/4109121/29/","AllotmentAndGarden" +"Advertising","1918-08-09","http://newspapers.library.wales/view/4109123/4109130/24/","AllotmentAndGarden" +"GARDEN AND ALLOTMENTI CULTIVATION.","1915-03-12","http://newspapers.library.wales/view/4242898/4242903/54/","AllotmentAndGarden" +"SURPLUS GARDEN CROPS. I","1917-07-27","http://newspapers.library.wales/view/4122307/4122309/7/","AllotmentAndGarden" +"NORTH WALES FRUIT ANDI VEGETABLE SOCIETY.","1918-10-11","http://newspapers.library.wales/view/4245736/4245738/12/","AllotmentAndGarden" +"--------THE WEEK'S GARDENING.","1917-03-15","http://newspapers.library.wales/view/3858496/3858502/59/","AllotmentAndGarden" +"I ALLOTMENT SCHEMES¡","1917-01-25","http://newspapers.library.wales/view/4102971/4102973/52/","AllotmentAndGarden" +"V A L E N 0 T E S .","1917-06-08","http://newspapers.library.wales/view/3887019/3887021/5/","AllotmentAndGarden" +"Advertising","1918-04-13","http://newspapers.library.wales/view/3890336/3890343/49/","AllotmentAndGarden" +"Advertising","1918-03-30","http://newspapers.library.wales/view/3581003/3581006/25/","AllotmentAndGarden" +"—————. I","1917-02-02","http://newspapers.library.wales/view/4103018/4103022/88/","AllotmentAndGarden" +"TO-DAY'S ALLOTMENT HINT.","1918-05-03","http://newspapers.library.wales/view/4104995/4104996/39/","AllotmentAndGarden" +"TO-DAY'S ALLOTMENT 0-HINT.","1918-05-08","http://newspapers.library.wales/view/4105015/4105016/30/","AllotmentAndGarden" +":TO-BAY'S ALLOTMENT HINT.","1918-03-06","http://newspapers.library.wales/view/4104753/4104754/34/","AllotmentAndGarden" +"TO-DAY'S ALLOTMENT HINT. J","1918-03-07","http://newspapers.library.wales/view/4104758/4104759/34/","AllotmentAndGarden" +"TO-DAY'S ALLOTMENT HINT.","1918-07-17","http://newspapers.library.wales/view/4105314/4105315/32/","AllotmentAndGarden" +"TO-DAY'S ALLOTMENT HINT.","1918-05-22","http://newspapers.library.wales/view/4105070/4105071/40/","AllotmentAndGarden" +"TO-DAY'S ALLOTMENT HINT.","1918-05-23","http://newspapers.library.wales/view/4105075/4105076/32/","AllotmentAndGarden" +"INTERRUPTED NAP.","1917-08-14","http://newspapers.library.wales/view/4103868/4103872/76/","AllotmentAndGarden" +"|POTATO WART.","1917-09-05","http://newspapers.library.wales/view/4103963/4103966/52/","AllotmentAndGarden" +":TO-DAY'S ALLOTMENT HtNT. !","1918-08-06","http://newspapers.library.wales/view/4105394/4105395/21/","AllotmentAndGarden" +"ITO-DAYS ALLOTMENT HINT.","1918-04-03","http://newspapers.library.wales/view/4104865/4104866/23/","AllotmentAndGarden" +"TO-DAY'S ALLOTMENT HINT.","1918-08-27","http://newspapers.library.wales/view/4105488/4105489/21/","AllotmentAndGarden" +"TO-DAY'S ALLOTMENT HINT, j","1918-05-25","http://newspapers.library.wales/view/4105085/4105086/35/","AllotmentAndGarden" +"* CROPS TO GROW.","1917-02-02","http://newspapers.library.wales/view/3413618/3413623/49/","AllotmentAndGarden" +"Advertising","1917-06-15","http://newspapers.library.wales/view/3413789/3413791/19/","AllotmentAndGarden" +"MUMBLES. I","1916-09-30","http://newspapers.library.wales/view/4115323/4115325/52/","AllotmentAndGarden" +"POTATO WART.","1917-09-08","http://newspapers.library.wales/view/4115692/4115693/26/","AllotmentAndGarden" +"SHOCKING ACCIDENT TO BARRY WOMAN.","1916-07-14","http://newspapers.library.wales/view/4169008/4169013/32/","AllotmentAndGarden" +"Advertising","1918-02-01","http://newspapers.library.wales/view/4108889/4108893/11/","AllotmentAndGarden" +"I «• * i BLESSING ON THE -CROPS.","1918-05-11","http://newspapers.library.wales/view/4110679/4110681/35/","AllotmentAndGarden" +"RADISH FIVE FEET LONG I","1917-08-11","http://newspapers.library.wales/view/4110504/4110508/150/","AllotmentAndGarden" +"CWMDARE NOTES.!","1917-06-16","http://newspapers.library.wales/view/3580625/3580631/66/","AllotmentAndGarden" +"ABERDARE.","1917-07-21","http://newspapers.library.wales/view/3580679/3580687/88/","AllotmentAndGarden" +"The Allotment Question.","1917-03-03","http://newspapers.library.wales/view/3580490/3580492/5/","AllotmentAndGarden" +"HIRWAlk.","1917-03-10","http://newspapers.library.wales/view/3580499/3580502/12/","AllotmentAndGarden" +"Rhayader Parish Meeting.","1917-03-01","http://newspapers.library.wales/view/4094513/4094520/95/","AllotmentAndGarden" +"IWomen and Gardening.I","1917-03-15","http://newspapers.library.wales/view/4094531/4094538/77/","AllotmentAndGarden" +"I APPEAL TO POTATO-GROWERS.","1918-06-21","http://newspapers.library.wales/view/4124687/4124693/46/","AllotmentAndGarden" +"I Employers' Assistance.","1917-01-27","http://newspapers.library.wales/view/4001594/4001596/12/","AllotmentAndGarden" +"THE BOOK FOR THE SMALL GARDENER.","1917-03-10","http://newspapers.library.wales/view/4001636/4001639/15/","AllotmentAndGarden" +". A PENYGROES NUISANCE. I","1918-02-21","http://newspapers.library.wales/view/4013938/4013941/38/","AllotmentAndGarden" +"BARGOED FOOD PRODUCERS HARASSED.","1918-02-08","http://newspapers.library.wales/view/4031519/4031523/42/","AllotmentAndGarden" +"In the Kitchen Garden.","1914-09-19","http://newspapers.library.wales/view/4000577/4000583/68/","AllotmentAndGarden" +"TONDU AND ABERKENFIG. - - - - -","1917-05-04","http://newspapers.library.wales/view/3886994/3886996/6/","AllotmentAndGarden" +"Advertising","1918-04-05","http://newspapers.library.wales/view/4124588/4124596/87/","AllotmentAndGarden" +"CWMDARE NOTES.","1918-01-12","http://newspapers.library.wales/view/3580904/3580907/30/","AllotmentAndGarden" +"CWMDARE NOTES.","1917-06-16","http://newspapers.library.wales/view/3580634/3580640/62/","AllotmentAndGarden" +"PARSNIP Y. PANSY. I","1918-06-01","http://newspapers.library.wales/view/4105115/4105118/40/","AllotmentAndGarden" +"./ BUILTH WELLS URBAN COUNCIL. f","1917-03-01","http://newspapers.library.wales/view/3858478/3858484/55/","AllotmentAndGarden" +"I IN -LIGHTER --VEIN","1917-04-13","http://newspapers.library.wales/view/4122172/4122178/81/","AllotmentAndGarden" +"Cardiganshire Quarter Sessions.","1917-07-13","http://newspapers.library.wales/view/3413825/3413830/49/","AllotmentAndGarden" +"LAND WORK ON SUNDAYS* /AT BARRY.","1917-03-09","http://newspapers.library.wales/view/4130477/4130482/23/","AllotmentAndGarden" +"Advertising","1918-03-15","http://newspapers.library.wales/view/4108934/4108941/31/","AllotmentAndGarden" +"Advertising","1918-04-19","http://newspapers.library.wales/view/4108979/4108986/32/","AllotmentAndGarden" +"IN LIGHTER VEIN I","1917-01-26","http://newspapers.library.wales/view/4122073/4122076/35/","AllotmentAndGarden" +";IFOWLS ON -ALLOTMENTS-———.'——","1917-01-09","http://newspapers.library.wales/view/4102881/4102887/127/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT ! HOLDERS. .","1918-10-25","http://newspapers.library.wales/view/3414428/3414430/9/","AllotmentAndGarden" +"."e;CHURCHES TO BE .-SHUT"e;?","1917-02-24","http://newspapers.library.wales/view/4110368/4110372/89/","AllotmentAndGarden" +"I LLANDOVERY COUNCIL. I","1917-02-17","http://newspapers.library.wales/view/4115489/4115494/148/","AllotmentAndGarden" +"MKS (iKUNDrs JOTTINtiS I","1918-09-27","http://newspapers.library.wales/view/4129155/4129158/17/","AllotmentAndGarden" +"1 "e;ANY VARIETY."e;","1917-05-05","http://newspapers.library.wales/view/4110434/4110438/122/","AllotmentAndGarden" +"Do You Know","1917-02-21","http://newspapers.library.wales/view/4118967/4118970/37/","AllotmentAndGarden" +"I Food Production & 'Potato Spraying --Iat -Milford Haven.I","1917-07-18","http://newspapers.library.wales/view/4119072/4119073/3/","AllotmentAndGarden" +"THE CHARITY ENQUIRY AT PORTHCAWL.","1915-03-19","http://newspapers.library.wales/view/3886028/3886030/11/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS. ..","1918-03-01","http://newspapers.library.wales/view/3414122/3414124/6/","AllotmentAndGarden" +": PECIAL CLASSES. I","1918-08-23","http://newspapers.library.wales/view/4031659/4031663/36/","AllotmentAndGarden" +"YNYSYBWL FLOWER SHOW.","1918-08-31","http://newspapers.library.wales/view/3581201/3581203/5/","AllotmentAndGarden" +"Farmers Column. I","1918-09-13","http://newspapers.library.wales/view/3414374/3414376/16/","AllotmentAndGarden" +"IBANGOR GARDEN ALLOT- I MENTS.","1917-06-22","http://newspapers.library.wales/view/4243901/4243903/11/","AllotmentAndGarden" +"Fernhm Co!!!er!ea Workmen's Show. ? "e;_","1917-09-08","http://newspapers.library.wales/view/4615434/4615440/45/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1918-11-08","http://newspapers.library.wales/view/3414446/3414448/15/","AllotmentAndGarden" +"MAKE AN EFFORT NEXT YEAR.","1918-01-04","http://newspapers.library.wales/view/3414050/3414052/6/","AllotmentAndGarden" +"HINTS FOI; ALLOTMENT HOLDERS. :8","1918-11-01","http://newspapers.library.wales/view/3414437/3414439/10/","AllotmentAndGarden" +"Aberystwyth Allotments.","1917-06-29","http://newspapers.library.wales/view/3413807/3413812/62/","AllotmentAndGarden" +"ALLOTMENT NOTESI","1918-02-23","http://newspapers.library.wales/view/4104700/4104702/33/","AllotmentAndGarden" +"Ammanford Horticultural Show.I","1918-08-29","http://newspapers.library.wales/view/4014073/4014077/46/","AllotmentAndGarden" +"!-_-.-"e;-.--_--! H -USIXG PROBLEl AT , -KRRY.","1917-08-24","http://newspapers.library.wales/view/4130693/4130696/23/","AllotmentAndGarden" +"I HEOtYCYW.","1917-07-13","http://newspapers.library.wales/view/3887044/3887048/34/","AllotmentAndGarden" +"I -BRYNAMMAN. I","1918-05-02","http://newspapers.library.wales/view/4013988/4013991/29/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS. -0","1918-05-10","http://newspapers.library.wales/view/3414203/3414205/9/","AllotmentAndGarden" +"Hints For Allotment Holders.","1917-06-29","http://newspapers.library.wales/view/3413807/3413809/6/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS. ..,","1918-03-08","http://newspapers.library.wales/view/3414131/3414133/7/","AllotmentAndGarden" +"AUTUMN AND WINTER SALADS.","1918-09-06","http://newspapers.library.wales/view/3414365/3414367/9/","AllotmentAndGarden" +"FLOWER SHOW AT MOUNTAIN ASH.","1917-09-01","http://newspapers.library.wales/view/3580733/3580735/6/","AllotmentAndGarden" +"NEATH,I","1918-01-19","http://newspapers.library.wales/view/4115802/4115805/81/","AllotmentAndGarden" +"TREBOETH SHOW. I -","1918-08-12","http://newspapers.library.wales/view/4105423/4105426/51/","AllotmentAndGarden" +"Advertising","1918-03-30","http://newspapers.library.wales/view/4110654/4110658/110/","AllotmentAndGarden" +"I — i -MUMBLES. I - - .. -","1916-06-17","http://newspapers.library.wales/view/4115214/4115216/54/","AllotmentAndGarden" +"IYNYSYBWL FLOWER SHOW. I","1917-08-18","http://newspapers.library.wales/view/3580715/3580723/91/","AllotmentAndGarden" +"----HINTS FOR ALLOTMENT HOLDERS.","1917-09-14","http://newspapers.library.wales/view/3413906/3413908/6/","AllotmentAndGarden" +"THE NEW YEAR'S TASKS.","1918-01-18","http://newspapers.library.wales/view/3414068/3414070/6/","AllotmentAndGarden" +"! Builth Wells Council. i","1918-04-04","http://newspapers.library.wales/view/4095026/4095033/67/","AllotmentAndGarden" +"OUR READERS' VIE WS.","1915-11-19","http://newspapers.library.wales/view/3886343/3886347/28/","AllotmentAndGarden" +"I SWANSEA","1917-01-01","http://newspapers.library.wales/view/4102836/4102838/54/","AllotmentAndGarden" +"Advertising","1918-08-10","http://newspapers.library.wales/view/4105418/4105422/40/","AllotmentAndGarden" +"BIRONGROVE. I","1918-03-09","http://newspapers.library.wales/view/4115837/4115840/75/","AllotmentAndGarden" +"-:-_.--=-:-==-=-:-.-C.CC---I TO-DAY'S ALLOTMENT HINT.","1918-03-04","http://newspapers.library.wales/view/4104743/4104744/24/","AllotmentAndGarden" +"SKETTY ALLOTMENTS.","1918-01-09","http://newspapers.library.wales/view/4104505/4104508/73/","AllotmentAndGarden" +"Advertising","1917-07-26","http://newspapers.library.wales/view/4103788/4103791/67/","AllotmentAndGarden" +"Advertising","1917-06-01","http://newspapers.library.wales/view/4103547/4103550/51/","AllotmentAndGarden" +"FFORE ^JTFACH.","1917-12-15","http://newspapers.library.wales/view/4115777/4115779/66/","AllotmentAndGarden" +"I--ST. DAVIDS. I","1918-08-14","http://newspapers.library.wales/view/4119347/4119350/39/","AllotmentAndGarden" +"Advertising","1917-06-13","http://newspapers.library.wales/view/3784186/3784189/39/","AllotmentAndGarden" +"PROTECTION OF GARDENS","1917-05-26","http://newspapers.library.wales/view/3978949/3978954/48/","AllotmentAndGarden" +"GLASBURY-ON-WYE.J","1917-07-05","http://newspapers.library.wales/view/4094675/4094683/103/","AllotmentAndGarden" +"Abergavenny. Technical Instruction Committee.","1917-10-05","http://newspapers.library.wales/view/4122397/4122404/103/","AllotmentAndGarden" +"Advertising","1917-06-23","http://newspapers.library.wales/view/3889958/3889965/54/","AllotmentAndGarden" +"Tribunal and an Employer's Action.","1918-03-23","http://newspapers.library.wales/view/3580994/3581001/64/","AllotmentAndGarden" +"——— MEMS FROM THE MOUNT.","1918-06-01","http://newspapers.library.wales/view/3581084/3581089/42/","AllotmentAndGarden" +"LIST OF AWARDS.","1918-08-10","http://newspapers.library.wales/view/3581174/3581182/77/","AllotmentAndGarden" +"HARVEST j","1917-08-30","http://newspapers.library.wales/view/4103938/4103940/47/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1918-06-21","http://newspapers.library.wales/view/3414266/3414268/6/","AllotmentAndGarden" +"PRACTICAL GARDENING. I","1918-02-28","http://newspapers.library.wales/view/4094981/4094986/49/","AllotmentAndGarden" +". WAR-TIME GARDEN WORK & ALLOTMENT -INTERESTS.","1918-10-12","http://newspapers.library.wales/view/4014111/4014113/12/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1918-01-25","http://newspapers.library.wales/view/3414077/3414079/6/","AllotmentAndGarden" +"ITonyrefail Notes. I","1916-09-16","http://newspapers.library.wales/view/4001463/4001466/23/","AllotmentAndGarden" +"Aberystwyth Allotments.","1917-05-18","http://newspapers.library.wales/view/3413753/3413758/68/","AllotmentAndGarden" +"BANK HOLIDAY IN WEST WALESi","1917-08-07","http://newspapers.library.wales/view/4103838/4103840/40/","AllotmentAndGarden" +"flINTS FOR ALLOTMENT HOLDERS.","1917-02-08","http://newspapers.library.wales/view/4013642/4013645/26/","AllotmentAndGarden" +"ALLOTMENTS.I","1917-03-16","http://newspapers.library.wales/view/4103222/4103226/79/","AllotmentAndGarden" +"Advertising","1918-04-27","http://newspapers.library.wales/view/3979381/3979388/56/","AllotmentAndGarden" +"--,'I LATE: SUMMER SOWN VEGETABLES- I","1917-07-20","http://newspapers.library.wales/view/3413834/3413836/6/","AllotmentAndGarden" +"Advertising","1918-02-08","http://newspapers.library.wales/view/4108898/4108906/24/","AllotmentAndGarden" +"Advertising","1918-01-25","http://newspapers.library.wales/view/4108880/4108884/13/","AllotmentAndGarden" +"Late Summer Sown Vege- j tables.|","1917-08-08","http://newspapers.library.wales/view/4119087/4119091/48/","AllotmentAndGarden" +". Useful Hints to Amateur Gardeners.","1918-02-14","http://newspapers.library.wales/view/3858928/3858935/70/","AllotmentAndGarden" +"MEMS FROM THE MOUNT.","1917-06-23","http://newspapers.library.wales/view/3580643/3580648/57/","AllotmentAndGarden" +"IMPORTANCE OF ALLOTMENTS. I","1918-02-14","http://newspapers.library.wales/view/4094963/4094966/38/","AllotmentAndGarden" +"I -Llanwrtyd Wells Council.","1917-02-15","http://newspapers.library.wales/view/4094495/4094501/83/","AllotmentAndGarden" +"In the Kitchen Garden.","1915-02-20","http://newspapers.library.wales/view/4000775/4000781/39/","AllotmentAndGarden" +"H EOLYCYW. ,I","1917-06-08","http://newspapers.library.wales/view/3887019/3887022/10/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1918-05-24","http://newspapers.library.wales/view/3414230/3414232/6/","AllotmentAndGarden" +"BEES AND THE FOOD-SUPPLY. I","1917-03-29","http://newspapers.library.wales/view/4094549/4094552/42/","AllotmentAndGarden" +"'Builth's Council.","1917-03-01","http://newspapers.library.wales/view/4094513/4094518/59/","AllotmentAndGarden" +"LOWER RHYMNEY ALLOT-i IMENT ASSOCIATION. i","1918-08-23","http://newspapers.library.wales/view/4031659/4031663/34/","AllotmentAndGarden" +"In the Kitchen Garden.","1914-10-10","http://newspapers.library.wales/view/4000604/4000610/52/","AllotmentAndGarden" +"IHINTS FOR ALLOTMENT HOLDERS. .","1918-04-19","http://newspapers.library.wales/view/3414185/3414187/6/","AllotmentAndGarden" +"HINTS FOR ALLOTMENTI HOLDERS.I","1918-07-12","http://newspapers.library.wales/view/3414293/3414295/8/","AllotmentAndGarden" +"BUILTH WELLS.","1918-04-04","http://newspapers.library.wales/view/3858991/3858999/85/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS. .","1918-08-09","http://newspapers.library.wales/view/3414329/3414331/10/","AllotmentAndGarden" +"CNKNS AND SHALLOTS.","1917-11-09","http://newspapers.library.wales/view/3413978/3413980/6/","AllotmentAndGarden" +"I -EVERYONE PLEASED,,","1917-03-17","http://newspapers.library.wales/view/4110389/4110392/72/","AllotmentAndGarden" +"!LAND CULTIVATION I","1917-01-20","http://newspapers.library.wales/view/4115461/4115465/107/","AllotmentAndGarden" +"/ ;THE WEEK'S GARDENING.","1917-10-11","http://newspapers.library.wales/view/3858766/3858769/13/","AllotmentAndGarden" +"THE WEEKS GARDENING.","1918-10-24","http://newspapers.library.wales/view/3859318/3859320/5/","AllotmentAndGarden" +"HORTICULTURAL .SHOWI AT BANGOR.","1918-08-09","http://newspapers.library.wales/view/4245696/4245700/73/","AllotmentAndGarden" +"ISPLENDID SUCCESS OF BRIDGEND ,ALLOTMENTS' SCHEME. -","1917-03-09","http://newspapers.library.wales/view/3886946/3886951/38/","AllotmentAndGarden" +"Advertising","1918-04-20","http://newspapers.library.wales/view/3581030/3581034/36/","AllotmentAndGarden" +"TREBQETH SHOW.","1918-08-17","http://newspapers.library.wales/view/4115945/4115947/52/","AllotmentAndGarden" +"t NEATH,i","1918-01-26","http://newspapers.library.wales/view/4115807/4115810/77/","AllotmentAndGarden" +"ISWANSEA. I","1917-11-07","http://newspapers.library.wales/view/4104237/4104240/45/","AllotmentAndGarden" +"I POTATO POINTS.","1917-02-03","http://newspapers.library.wales/view/4110347/4110349/16/","AllotmentAndGarden" +"BARRY COUNCILLORS IN MONTHLY MEETING","1915-06-18","http://newspapers.library.wales/view/4130135/4130140/22/","AllotmentAndGarden" +"Llandilo Police Court. !","1918-09-20","http://newspapers.library.wales/view/3716455/3716458/31/","AllotmentAndGarden" +"- .- - - - - . - -__-Builth Wells Council.","1917-12-06","http://newspapers.library.wales/view/4094873/4094876/23/","AllotmentAndGarden" +"IHEOLYCYW.I","1917-05-04","http://newspapers.library.wales/view/3886994/3886996/11/","AllotmentAndGarden" +"GARW G-LE AN I N G S I","1917-05-18","http://newspapers.library.wales/view/3887004/3887008/34/","AllotmentAndGarden" +"WAR-TIME VEGETABLE & FRUIT SHOW i AT TONDU.","1917-09-28","http://newspapers.library.wales/view/3887094/3887096/11/","AllotmentAndGarden" +"THE STRAWBERRY. I","1915-02-13","http://newspapers.library.wales/view/4000766/4000772/38/","AllotmentAndGarden" +"ALLOTMENT NOTES","1917-11-24","http://newspapers.library.wales/view/4104314/4104317/49/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS. !..","1918-03-22","http://newspapers.library.wales/view/3414149/3414151/6/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS. .","1918-04-12","http://newspapers.library.wales/view/3414176/3414178/6/","AllotmentAndGarden" +"VEGETABLE MARROWS. j t1 ..I","1918-05-31","http://newspapers.library.wales/view/3414239/3414241/9/","AllotmentAndGarden" +"INTENSIVE CROPPING.","1918-06-07","http://newspapers.library.wales/view/3414248/3414250/6/","AllotmentAndGarden" +"S FOR ALLOTMENT HOLDERS.","1918-10-04","http://newspapers.library.wales/view/3414401/3414403/9/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1918-06-14","http://newspapers.library.wales/view/3414257/3414259/6/","AllotmentAndGarden" +"I j THE WREK'S GARDENING,","1917-10-25","http://newspapers.library.wales/view/3858784/3858791/54/","AllotmentAndGarden" +"THE WEEK'S GARDENING.","1917-03-29","http://newspapers.library.wales/view/3858514/3858520/44/","AllotmentAndGarden" +"THE WEEK'S GARDENING. i--","1918-03-21","http://newspapers.library.wales/view/3858973/3858975/6/","AllotmentAndGarden" +"In the Kitchen Garden. I","1915-01-09","http://newspapers.library.wales/view/4000721/4000727/46/","AllotmentAndGarden" +"YSTALYFERA GARDENING ASSOCIATION.","1917-04-21","http://newspapers.library.wales/view/3978910/3978913/22/","AllotmentAndGarden" +"ABERAMAN FLOWER SHOW.","1918-08-17","http://newspapers.library.wales/view/3581183/3581185/6/","AllotmentAndGarden" +"GARDENING NOTES FOR THE WORKER.","1916-12-02","http://newspapers.library.wales/view/3978732/3978740/82/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1917-03-30","http://newspapers.library.wales/view/3413690/3413692/8/","AllotmentAndGarden" +"HINTS FOR ALLOTMENTI HOLDERS.I","1918-05-03","http://newspapers.library.wales/view/3414212/3414214/6/","AllotmentAndGarden" +"iliNTS FOR ALLOTMENT HOLDERS.","1918-05-17","http://newspapers.library.wales/view/3414221/3414223/7/","AllotmentAndGarden" +"FFORESTFACH SHOW. I","1917-08-27","http://newspapers.library.wales/view/4103923/4103926/57/","AllotmentAndGarden" +"SUCCESSFUL SHOW AT SEVEN SISTERS","1917-09-29","http://newspapers.library.wales/view/3979111/3979118/47/","AllotmentAndGarden" +"I Cottage Gardening: and I Allotments. ^ I","1915-11-27","http://newspapers.library.wales/view/4614803/4614811/64/","AllotmentAndGarden" +"IPRIZES FOR PLOTS","1918-08-17","http://newspapers.library.wales/view/4115945/4115946/4/","AllotmentAndGarden" +"I -.PONTARDAWE.","1918-08-24","http://newspapers.library.wales/view/4115950/4115954/105/","AllotmentAndGarden" +"PRIZES FOR PLOTS. ! - -j","1918-03-15","http://newspapers.library.wales/view/4105438/4105440/35/","AllotmentAndGarden" +"IALLOTMENT NOTES","1918-01-05","http://newspapers.library.wales/view/4104490/4104493/60/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1917-05-25","http://newspapers.library.wales/view/3413762/3413764/6/","AllotmentAndGarden" +".. HINTS FOR ALLOTME HOLDERS.","1918-08-30","http://newspapers.library.wales/view/3414356/3414358/10/","AllotmentAndGarden" +"-------- -¡HINTS FOR ALLOTMENT HOLDERS.","1917-05-18","http://newspapers.library.wales/view/3413753/3413755/6/","AllotmentAndGarden" +"I PROUD ALOTTEES. j","1918-08-31","http://newspapers.library.wales/view/4110754/4110756/41/","AllotmentAndGarden" +"ALLOTMENTS AT BUILTH.","1918-04-04","http://newspapers.library.wales/view/3858991/3858994/17/","AllotmentAndGarden" +"I PONTARDAWE COUNCIL I","1918-03-16","http://newspapers.library.wales/view/3979327/3979333/45/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.,","1917-04-05","http://newspapers.library.wales/view/4013698/4013701/43/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1917-05-10","http://newspapers.library.wales/view/4013731/4013735/58/","AllotmentAndGarden" +"CorrespondenceI","1918-07-27","http://newspapers.library.wales/view/4615675/4615678/28/","AllotmentAndGarden" +"Advertising","1917-02-21","http://newspapers.library.wales/view/4026865/4026868/21/","AllotmentAndGarden" +"Advertising","1917-12-08","http://newspapers.library.wales/view/4104378/4104382/85/","AllotmentAndGarden" +"Advertising","1918-03-16","http://newspapers.library.wales/view/4105443/4105446/50/","AllotmentAndGarden" +"ALLOTMENTS WANTED","1916-02-19","http://newspapers.library.wales/view/4115077/4115083/138/","AllotmentAndGarden" +"ALLOTMENTS WANTED","1916-02-16","http://newspapers.library.wales/view/4101022/4101028/148/","AllotmentAndGarden" +"MUMBLES WATER.","1916-12-27","http://newspapers.library.wales/view/4102814/4102816/54/","AllotmentAndGarden" +"ISWANSEA.","1917-09-19","http://newspapers.library.wales/view/4104025/4104027/45/","AllotmentAndGarden" +"Advertising","1918-01-14","http://newspapers.library.wales/view/4104525/4104528/62/","AllotmentAndGarden" +"ILLANDOVERY COUNCIL.","1917-10-12","http://newspapers.library.wales/view/4103072/4103074/40/","AllotmentAndGarden" +"CORRESPONDENCE.i","1917-09-10","http://newspapers.library.wales/view/4103983/4103985/32/","AllotmentAndGarden" +"-I SCHOOLBOY GAR-D!ENERS","1917-03-17","http://newspapers.library.wales/view/4110389/4110395/135/","AllotmentAndGarden" +"FOOD SUPPLIES AND POTATC .GROWING. - V","1917-04-06","http://newspapers.library.wales/view/4130513/4130518/25/","AllotmentAndGarden" +"MONDAY. ! !","1918-07-05","http://newspapers.library.wales/view/4129071/4129075/36/","AllotmentAndGarden" +"Advertising","1918-07-05","http://newspapers.library.wales/view/4129071/4129075/37/","AllotmentAndGarden" +"BARRY WAR FOOD PRODUC--TION SHOW.","1917-09-14","http://newspapers.library.wales/view/4130720/4130725/22/","AllotmentAndGarden" +"1 POTATO DISivASK AND ITS | .1 , i, I RKMK!)iKS.","1917-08-10","http://newspapers.library.wales/view/4130675/4130683/52/","AllotmentAndGarden" +"Advertising","1918-07-05","http://newspapers.library.wales/view/3679111/3679115/45/","AllotmentAndGarden" +"SPRAYING OF ALLOTMENTS","1917-07-06","http://newspapers.library.wales/view/3690475/3690476/7/","AllotmentAndGarden" +"I CORRESPONDENCE.","1915-07-10","http://newspapers.library.wales/view/4114716/4114728/239/","AllotmentAndGarden" +"NEATH.1","1917-11-10","http://newspapers.library.wales/view/4115755/4115758/81/","AllotmentAndGarden" +"Borough Tribunal.","1918-08-23","http://newspapers.library.wales/view/3716435/3716439/47/","AllotmentAndGarden" +".---- ---------_--------Aberdare Education Committee.","1917-02-10","http://newspapers.library.wales/view/3580463/3580468/35/","AllotmentAndGarden" +"Advertising","1917-04-14","http://newspapers.library.wales/view/3580544/3580547/31/","AllotmentAndGarden" +"HIRWAIN.","1917-04-21","http://newspapers.library.wales/view/3580553/3580561/117/","AllotmentAndGarden" +"GLASBURY-ON-WYE. j","1917-10-11","http://newspapers.library.wales/view/4094801/4094809/95/","AllotmentAndGarden" +"rALLOTMENT HOLDERS'I WANTS.","1917-02-16","http://newspapers.library.wales/view/4031264/4031268/27/","AllotmentAndGarden" +"I ,THE LADIES ALLOTMENT.","1917-05-03","http://newspapers.library.wales/view/4012174/4012176/8/","AllotmentAndGarden" +"I,-.NEATH POLICE COURT. !","1918-07-27","http://newspapers.library.wales/view/3979494/3979498/40/","AllotmentAndGarden" +"TR cCYNON AND LLWYDCOED NOTES.","1917-11-03","http://newspapers.library.wales/view/3580814/3580820/62/","AllotmentAndGarden" +"IALLOTMENT SHOWS 10.;","1918-08-26","http://newspapers.library.wales/view/4105483/4105486/40/","AllotmentAndGarden" +"Advertising","1918-07-15","http://newspapers.library.wales/view/4105304/4105308/64/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1918-03-15","http://newspapers.library.wales/view/3414140/3414142/6/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1917-07-20","http://newspapers.library.wales/view/3413834/3413836/8/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS. do","1918-09-13","http://newspapers.library.wales/view/3414374/3414376/9/","AllotmentAndGarden" +"I IIINTS FOR ALLOTMENT HOLDERS.","1917-07-13","http://newspapers.library.wales/view/3413825/3413827/6/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1918-09-20","http://newspapers.library.wales/view/3414383/3414385/9/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT","1918-07-05","http://newspapers.library.wales/view/3414284/3414290/39/","AllotmentAndGarden" +"J THE WEEK'S GARDENING 1J.Jv:_d.1."e;-')1"e;).1.<,1.H,'I'..x.","1917-09-13","http://newspapers.library.wales/view/3858730/3858732/8/","AllotmentAndGarden" +"THE WEEK'S GARDENING. I","1917-04-12","http://newspapers.library.wales/view/3858532/3858534/6/","AllotmentAndGarden" +":::..::=::::-..:.:-:--::"e;:.:-:::.=-=:::.=-=::::-.---==:-::-ITHE WERK'S GARDENING,","1917-06-07","http://newspapers.library.wales/view/3858604/3858606/7/","AllotmentAndGarden" +"! IN LIGHTER VEINI","1917-02-02","http://newspapers.library.wales/view/4122082/4122088/91/","AllotmentAndGarden" +"Cottagers' section.","1917-08-11","http://newspapers.library.wales/view/3580706/3580712/65/","AllotmentAndGarden" +"JV8ERCYN0N FLOWER SHOW.","1918-08-24","http://newspapers.library.wales/view/3581192/3581194/2/","AllotmentAndGarden" +"ITOWN TALK. I ..","1918-07-04","http://newspapers.library.wales/view/4105255/4105257/47/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS.","1918-07-19","http://newspapers.library.wales/view/3414302/3414304/9/","AllotmentAndGarden" +"THE WEEKS GARDENING-","1917-03-22","http://newspapers.library.wales/view/3858505/3858511/60/","AllotmentAndGarden" +"-_._----_---------I rHE WEEK'S GARDENING.I","1917-04-19","http://newspapers.library.wales/view/3858541/3858543/5/","AllotmentAndGarden" +",-THE WEEK'S GARDENING.","1918-05-02","http://newspapers.library.wales/view/3859033/3859035/5/","AllotmentAndGarden" +"THE WEEK'S GARDENING.I","1918-06-06","http://newspapers.library.wales/view/3859093/3859100/64/","AllotmentAndGarden" +"THE WEEK'S GARDENING.","1917-11-29","http://newspapers.library.wales/view/3858829/3858836/81/","AllotmentAndGarden" +"ITHE WEEK'S GARDENING.","1918-07-11","http://newspapers.library.wales/view/3859153/3859160/55/","AllotmentAndGarden" +"THE WEEK S GARDENING. I","1918-03-29","http://newspapers.library.wales/view/4245601/4245604/38/","AllotmentAndGarden" +"Advertising","1918-04-27","http://newspapers.library.wales/view/4104970/4104974/84/","AllotmentAndGarden" +". IGLYDAGH CARNIVAL 1","1918-08-19","http://newspapers.library.wales/view/4105453/4105457/76/","AllotmentAndGarden" +"BUILTH WELLS.","1917-03-15","http://newspapers.library.wales/view/3858496/3858504/76/","AllotmentAndGarden" +"SUCCESSFUL HORTICULTURAL I SHOW AT SEVEN SISTERS.","1918-09-14","http://newspapers.library.wales/view/3979557/3979565/56/","AllotmentAndGarden" +"FOOD TOPICS.","1918-07-06","http://newspapers.library.wales/view/3859150/3859152/15/","AllotmentAndGarden" +"HIRWAIN.","1917-04-07","http://newspapers.library.wales/view/3580535/3580538/21/","AllotmentAndGarden" +"RHYMNEY URBAN DISTRICT j COUNCIL. I I","1917-06-22","http://newspapers.library.wales/view/4031354/4031358/39/","AllotmentAndGarden" +"[No title]","1918-06-06","http://newspapers.library.wales/view/4014013/4014015/25/","AllotmentAndGarden" +"Llandilo Police Court. I -I","1918-09-19","http://newspapers.library.wales/view/4014088/4014092/51/","AllotmentAndGarden" +"ALLOTMENT GROUNDS FOR j BARQOEDt","1915-07-23","http://newspapers.library.wales/view/4030859/4030863/57/","AllotmentAndGarden" +"Abercynon Flower Show.","1917-08-25","http://newspapers.library.wales/view/3580724/3580729/40/","AllotmentAndGarden" +"ABERCWMBOI HORTICULTURAL HOW.","1918-08-24","http://newspapers.library.wales/view/3581192/3581196/27/","AllotmentAndGarden" +"WAR ECONOMY AT YSTALY FERA.","1915-07-31","http://newspapers.library.wales/view/3978102/3978107/59/","AllotmentAndGarden" +"Advertising","1917-08-10","http://newspapers.library.wales/view/4103853/4103856/84/","AllotmentAndGarden" +"WHR-TIME GARDEN WORK & ALLOTMENT INTERESTS.","1918-11-02","http://newspapers.library.wales/view/3612776/3612778/11/","AllotmentAndGarden" +"Advertising","1918-11-08","http://newspapers.library.wales/view/4109240/4109247/26/","AllotmentAndGarden" +"Advertising","1918-11-01","http://newspapers.library.wales/view/4109231/4109238/31/","AllotmentAndGarden" +"WAR-TIME GARDEN WORK & ALLOTMENT INTERESTS.","1918-11-02","http://newspapers.library.wales/view/4014135/4014137/11/","AllotmentAndGarden" +"WRR-TIME GARDEN WORKI & ALLOTMENT INTERESTS.II","1918-11-16","http://newspapers.library.wales/view/4014151/4014153/10/","AllotmentAndGarden" +"- ._- -_-._- ,'"e; The Brynamman Agricultural and Allotment Society. -","1917-12-27","http://newspapers.library.wales/view/4013898/4013900/19/","AllotmentAndGarden" +"EVERY HOME ON ITS ALLOTMENT. - I I I .","1917-09-11","http://newspapers.library.wales/view/4103988/4103990/27/","AllotmentAndGarden" +"Advertising","1918-04-13","http://newspapers.library.wales/view/3581021/3581025/32/","AllotmentAndGarden" +"Advertising","1918-04-27","http://newspapers.library.wales/view/3581039/3581043/43/","AllotmentAndGarden" +"Advertising","1918-03-30","http://newspapers.library.wales/view/3581003/3581007/26/","AllotmentAndGarden" +"HINTS FOR ALLOTMENT HOLDERS. .","1918-03-29","http://newspapers.library.wales/view/3414158/3414160/6/","AllotmentAndGarden" +"Aberystwyth Council.","1917-08-17","http://newspapers.library.wales/view/3413870/3413873/31/","AllotmentAndGarden" +"LAMPETER","1917-08-24","http://newspapers.library.wales/view/3690510/3690514/61/","AllotmentAndGarden" +".i IN THE POULTRY YARD. I - .I","1918-10-04","http://newspapers.library.wales/view/4124834/4124837/14/","AllotmentAndGarden" +"[No title]","1914-09-03","http://newspapers.library.wales/view/4093390/4093394/95/","AllotmentAndGarden" +"In the Kitchen Garden.","1915-05-15","http://newspapers.library.wales/view/4000883/4000889/54/","AllotmentAndGarden" +"ALLOTMENT SHOWS I","1918-08-31","http://newspapers.library.wales/view/4115955/4115958/81/","AllotmentAndGarden" +"Aberystwyth Allotments.","1917-04-27","http://newspapers.library.wales/view/3413726/3413733/95/","AllotmentAndGarden" +"ALLOTMENT NOTES","1917-01-20","http://newspapers.library.wales/view/4102947/4102949/48/","AllotmentAndGarden" +"OUR SARBEM OMLE,1, I","1917-04-07","http://newspapers.library.wales/view/4110410/4110412/51/","AllotmentAndGarden" +"HINTS FOR AUOTMENT HOLDERS. '"e; -"e;"e;---_'''--'''''''--T-_'-'---..----.-'''''------..---.- -------.---------------| Till' WEEK'S…","1917-06-21","http://newspapers.library.wales/view/3858622/3858624/6/","AllotmentAndGarden" +"-...-----------_---------.-_.._. i TH WEEK'S' GAKDEN G. I-","1917-08-16","http://newspapers.library.wales/view/3858694/3858696/5/","AllotmentAndGarden" +"I TH K W bfrK/S (tA li u r, :S i N it.","1918-05-16","http://newspapers.library.wales/view/3859057/3859059/7/","AllotmentAndGarden" +"----___---------------__---_--__-----------:-ITHE WEEKS GARDENING.I","1918-03-28","http://newspapers.library.wales/view/3858982/3858989/61/","AllotmentAndGarden" +"THE WEEKS GARDENING.","1918-01-31","http://newspapers.library.wales/view/3858910/3858917/62/","AllotmentAndGarden" +"-..---BRECON TOWN COUNCIL.j","1917-01-11","http://newspapers.library.wales/view/3858415/3858423/77/","AllotmentAndGarden" +"","1915-02-19","http://newspapers.library.wales/view/4098594/4098595/8/","German+Submarine" +"German Submarine Sunk. ---","1915-06-12","http://newspapers.library.wales/view/3611607/3611613/90/","German+Submarine" +"GERMAN SUBMARINE SUNK.","1914-10-31","http://newspapers.library.wales/view/3611320/3611324/38/","German+Submarine" +"[No title]","1915-08-26","http://newspapers.library.wales/view/3755536/3755543/92/","German+Submarine" +"SUBMARINES' FUTILE CHASE. -1","1915-03-20","http://newspapers.library.wales/view/4092350/4092358/125/","German+Submarine" +"SUPPLYING PETROL I!","1915-02-06","http://newspapers.library.wales/view/4098507/4098508/20/","German+Submarine" +"DUTCH STEAMER STOPPED.I","1915-02-13","http://newspapers.library.wales/view/4098557/4098562/55/","German+Submarine" +"U BOAT IN DISGUISE.","1916-12-06","http://newspapers.library.wales/view/4102695/4102700/92/","German+Submarine" +"U-BOAT'S RUMOURED FATE.I","1916-08-15","http://newspapers.library.wales/view/4102030/4102034/68/","German+Submarine" +"- DANISH SCHOONER SUNK I","1916-04-29","http://newspapers.library.wales/view/4101458/4101459/22/","German+Submarine" +"GREEK STEAMER SUNK.","1916-12-15","http://newspapers.library.wales/view/4102753/4102754/28/","German+Submarine" +".SUNK BY SUBMARINE.-1","1917-01-20","http://newspapers.library.wales/view/4102947/4102948/41/","German+Submarine" +"I__DEFENCE GUNBOAT SUNK","1915-12-03","http://newspapers.library.wales/view/4100529/4100530/10/","German+Submarine" +"[No title]","1915-05-22","http://newspapers.library.wales/view/4114625/4114629/56/","German+Submarine" +"TORPEDOED DUTCH STEAMER.","1915-04-17","http://newspapers.library.wales/view/3611535/3611540/42/","German+Submarine" +"MINE-SWEEPER TORPE?OED. j MINE-SWEEPER TORPOOOED. i -I","1918-05-17","http://newspapers.library.wales/view/4124642/4124648/75/","German+Submarine" +"PANSY DAY IN BRIDGEND.I","1915-05-28","http://newspapers.library.wales/view/3886118/3886123/55/","German+Submarine" +"[No title]","1916-10-13","http://newspapers.library.wales/view/4242231/4242233/11/","German+Submarine" +"j MOELFRE. I","1918-06-28","http://newspapers.library.wales/view/4245666/4245670/58/","German+Submarine" +"BOARDING STEAMER SUNK.I","1918-04-05","http://newspapers.library.wales/view/4124588/4124591/32/","German+Submarine" +"PIRATE TORPEDOES A PIRATE.I","1915-09-20","http://newspapers.library.wales/view/4100039/4100040/25/","German+Submarine" +"I TRYING TO EVADE RESPONSIBILITY.","1915-05-13","http://newspapers.library.wales/view/4099190/4099191/20/","German+Submarine" +"GERMAN SUBMARINE BLOWN UP. I","1915-07-02","http://newspapers.library.wales/view/4121335/4121338/33/","German+Submarine" +"GERIAI SUBMARINE SUNK. .0. -","1915-06-12","http://newspapers.library.wales/view/4092440/4092445/67/","German+Submarine" +"THORDIS GETS 9660. i","1915-04-03","http://newspapers.library.wales/view/4092359/4092364/86/","German+Submarine" +"PIRATICAL OUTRAGE.I","1916-09-11","http://newspapers.library.wales/view/4102183/4102184/29/","German+Submarine" +"ffllMSBY TRAWLERS SHELLED.I","1915-07-12","http://newspapers.library.wales/view/4099605/4099606/6/","German+Submarine" +"GERMAN SUBMARINE SUNK.I","1915-04-01","http://newspapers.library.wales/view/4098897/4098902/63/","German+Submarine" +"10 -i-,I ! DAMAGED GERMAN SUBMARINE. j","1914-11-28","http://newspapers.library.wales/view/4114296/4114303/114/","German+Submarine" +"GERMAN SUBMARINE SUNK,","1915-07-03","http://newspapers.library.wales/view/3611634/3611636/9/","German+Submarine" +"GERMAN SUBMARINE SUNK.I","1915-06-30","http://newspapers.library.wales/view/4118537/4118541/43/","German+Submarine" +"[No title]","1917-05-24","http://newspapers.library.wales/view/4020636/4020643/41/","German+Submarine" +"TWO MORE "e;VICTORIES."e;","1915-04-10","http://newspapers.library.wales/view/4092368/4092371/36/","German+Submarine" +"SUBMARINE SUNK ;","1915-09-25","http://newspapers.library.wales/view/4092575/4092581/100/","German+Submarine" +"ANOTHER TRAWLER SUBMARINED.i","1915-06-12","http://newspapers.library.wales/view/4092440/4092448/133/","German+Submarine" +"SUBMARINE'S TENDERNESS TO THE IRISH!","1915-05-22","http://newspapers.library.wales/view/4092413/4092416/58/","German+Submarine" +"- - -.-.- J MINES18 BAY Of B?AV. j i","1916-01-31","http://newspapers.library.wales/view/4100916/4100917/19/","German+Submarine" +"I THE CAPTOR CAUGHT.I","1917-05-05","http://newspapers.library.wales/view/4103432/4103433/13/","German+Submarine" +"IPIRATES SINK A NEUTRAL. I","1916-05-13","http://newspapers.library.wales/view/4101522/4101523/28/","German+Submarine" +"PIRATES APOLOGISE. I","1916-09-08","http://newspapers.library.wales/view/4102169/4102172/76/","German+Submarine" +"GREEK STEAMER SUNK. I","1916-09-11","http://newspapers.library.wales/view/4102183/4102184/15/","German+Submarine" +"SBMARi!E-SUNK ? I ","1915-06-01","http://newspapers.library.wales/view/4099324/4099325/41/","German+Submarine" +"[No title]","1915-06-01","http://newspapers.library.wales/view/4099324/4099329/89/","German+Submarine" +"GERMANY OFFERS COMPENSATION.I","1915-06-03","http://newspapers.library.wales/view/4099340/4099343/43/","German+Submarine" +"[No title]","1914-10-20","http://newspapers.library.wales/view/4097674/4097680/84/","German+Submarine" +"I . DESTROYER LOST.","1918-08-13","http://newspapers.library.wales/view/4105428/4105429/6/","German+Submarine" +"ANOTHER LINER TORPEDOED.","1916-03-28","http://newspapers.library.wales/view/4101273/4101278/88/","German+Submarine" +"[No title]","1917-11-23","http://newspapers.library.wales/view/4104309/4104310/17/","German+Submarine" +"IU-BOAT'S FATE.","1917-11-06","http://newspapers.library.wales/view/4104232/4104233/21/","German+Submarine" +"LOSS OF U46 ADMITTED. 1","1916-12-23","http://newspapers.library.wales/view/4102802/4102803/20/","German+Submarine" +", - - - ,BOARDING STEAWCT tost;","1918-06-14","http://newspapers.library.wales/view/4105170/4105171/33/","German+Submarine" +"PIRATE DRAFT WRtCKEfl ]","1915-08-02","http://newspapers.library.wales/view/4099745/4099750/53/","German+Submarine" +"ENEMY SUBMARINE WRECKEDI","1915-08-03","http://newspapers.library.wales/view/4099752/4099753/24/","German+Submarine" +"MORE BREMEN RUMOURS.[","1916-08-12","http://newspapers.library.wales/view/4102016/4102017/22/","German+Submarine" +".SHOTS AT A TRAWLER.-I","1916-11-16","http://newspapers.library.wales/view/4102574/4102575/23/","German+Submarine" +"I-: - DAS U-BOAT. I","1916-08-16","http://newspapers.library.wales/view/4102037/4102042/116/","German+Submarine" +";A GERMAN DISAVOWAL.I","1916-03-24","http://newspapers.library.wales/view/4101252/4101256/69/","German+Submarine" +") MORE STEAMTRS SUNK.I","1916-11-17","http://newspapers.library.wales/view/4102581/4102582/38/","German+Submarine" +"* SUNKEN U BOAT. I ' ■- — |","1917-02-03","http://newspapers.library.wales/view/4103025/4103028/43/","German+Submarine" +"PRIMES' BRUTALITY.I","1916-07-11","http://newspapers.library.wales/view/4101828/4101829/5/","German+Submarine" +"-,-- - -_- - _-_ PIRATE SEEN OFF HASTINGS.","1915-03-23","http://newspapers.library.wales/view/4098825/4098826/28/","German+Submarine" +"CARGO OF THE CARTHACE","1915-07-07","http://newspapers.library.wales/view/4099573/4099574/4/","German+Submarine" +"DESTROYER LOST,","1917-09-24","http://newspapers.library.wales/view/4104045/4104047/51/","German+Submarine" +"TORPEDO THAT MISSED. J","1916-08-30","http://newspapers.library.wales/view/4102117/4102118/9/","German+Submarine" +"U-BOAT MINELAYER.I -I","1917-09-11","http://newspapers.library.wales/view/4103988/4103989/4/","German+Submarine" +"PIRATE'S DASH FOR SAFETY. I","1915-08-23","http://newspapers.library.wales/view/4099871/4099872/27/","German+Submarine" +"; PART CARGO OVERBOAD. I","1916-08-23","http://newspapers.library.wales/view/4102079/4102082/57/","German+Submarine" +"I SHELLED WITHOUT WARNING","1915-08-30","http://newspapers.library.wales/view/4099913/4099914/35/","German+Submarine" +"[No title]","1915-08-31","http://newspapers.library.wales/view/4099920/4099924/75/","German+Submarine" +"iU-BOAT SUNK","1916-04-28","http://newspapers.library.wales/view/4101451/4101452/10/","German+Submarine" +"U-BOAT ASHORE.","1917-07-27","http://newspapers.library.wales/view/4103793/4103794/15/","German+Submarine" +"- - - -.......-SWEDISH STEAMER TORPEDOED.:","1915-06-16","http://newspapers.library.wales/view/4099427/4099428/26/","German+Submarine" +"GERMAN NAVY OUT.","1917-05-26","http://newspapers.library.wales/view/4103522/4103523/30/","German+Submarine" +"THE GRIP WHIGH FAILED TO HOLD. I I","1915-03-11","http://newspapers.library.wales/view/4098737/4098745/153/","German+Submarine" +"A DISGUISED SUBMARINE","1915-06-22","http://newspapers.library.wales/view/4099464/4099471/146/","German+Submarine" +"I U-BOAT OFF URUGUAY. I","1917-01-25","http://newspapers.library.wales/view/4102971/4102972/39/","German+Submarine" +": U28mSMJTCh'SIEAMER. ] i i","1915-03-26","http://newspapers.library.wales/view/4098850/4098851/25/","German+Submarine" +"- - - -_._-NATIONAL RELIEF FUND. I","1915-03-26","http://newspapers.library.wales/view/4098850/4098852/49/","German+Submarine" +"THE DEUTSCHLAND. I","1916-07-18","http://newspapers.library.wales/view/4101870/4101873/57/","German+Submarine" +"GERMAN U BOAT SUNK I - I","1915-12-03","http://newspapers.library.wales/view/4100529/4100530/31/","German+Submarine" +"[No title]","1917-01-26","http://newspapers.library.wales/view/4102978/4102982/95/","German+Submarine" +":PIRATE'S MESSACE ro SIR L GREY ! I-!","1915-06-19","http://newspapers.library.wales/view/4099450/4099451/22/","German+Submarine" +"j MONTH'S REFIT. I I","1917-06-14","http://newspapers.library.wales/view/4103602/4103603/14/","German+Submarine" +"Portmadoc Captain's Son.","1918-05-24","http://newspapers.library.wales/view/3414230/3414235/51/","German+Submarine" +"TOOK POSSESSION OF VESSEL. I","1915-05-12","http://newspapers.library.wales/view/4099183/4099184/15/","German+Submarine" +"WAR ON THE TRAWLERS.I","1915-05-08","http://newspapers.library.wales/view/4099158/4099161/13/","German+Submarine" +"! PORT TALBOT CAPTAIN KILLED BY PtMIES 1 ,PORT CAPTAIN KILLED BY PIPATES","1915-05-08","http://newspapers.library.wales/view/4099158/4099166/96/","German+Submarine" +"TEN MINUTES TO QlHT.","1916-08-16","http://newspapers.library.wales/view/4102037/4102038/22/","German+Submarine" +"IENEMY ELUDED. | -1","1916-12-08","http://newspapers.library.wales/view/4102709/4102710/34/","German+Submarine" +"- - -I FISHIN2 -BOAT CREW LANDED","1916-04-27","http://newspapers.library.wales/view/4101446/4101447/24/","German+Submarine" +"[No title]","1916-02-18","http://newspapers.library.wales/view/3413151/3413156/54/","German+Submarine" +"DUTCH MOTOR VESSEL STOPPED. i .. - - . -","1916-02-05","http://newspapers.library.wales/view/4092746/4092754/161/","German+Submarine" +"BARQUE FIRED BY PIRATES.","1915-07-24","http://newspapers.library.wales/view/4114742/4114749/128/","German+Submarine" +"Late Wal"e; NevvG. rlit>...6","1915-03-27","http://newspapers.library.wales/view/3611508/3611513/49/","German+Submarine" +"D.S.M. NEPHEW OF BARRY SENIOR PIER MASTER. I iI","1917-10-26","http://newspapers.library.wales/view/4130774/4130781/52/","German+Submarine" +"[No title]","1916-11-24","http://newspapers.library.wales/view/4169179/4169184/26/","German+Submarine" +"NAVAL. 1 -I","1916-04-08","http://newspapers.library.wales/view/4092823/4092828/86/","German+Submarine" +"PATROL VESSEL SUNK.","1916-07-21","http://newspapers.library.wales/view/4121830/4121836/98/","German+Submarine" +"THE LOST LUSITANIA.","1915-05-21","http://newspapers.library.wales/view/4121281/4121288/94/","German+Submarine" +"[No title]","1915-06-04","http://newspapers.library.wales/view/4121299/4121302/20/","German+Submarine" +"I -AUXILIARY -CRUISER -SUNK.-","1915-08-20","http://newspapers.library.wales/view/4121398/4121404/102/","German+Submarine" +"I I BOARDING STEAMER SUNK, v","1918-09-27","http://newspapers.library.wales/view/4124825/4124832/57/","German+Submarine" +"[No title]","1915-12-10","http://newspapers.library.wales/view/4121542/4121544/12/","German+Submarine" +"TALSARNAU.I","1917-09-28","http://newspapers.library.wales/view/4244011/4244017/67/","German+Submarine" +"GERMANS AND LOST U BOAT. I","1915-12-17","http://newspapers.library.wales/view/4121551/4121557/79/","German+Submarine" +"[No title]","1916-01-14","http://newspapers.library.wales/view/4121587/4121593/98/","German+Submarine" +"[No title]","1917-03-23","http://newspapers.library.wales/view/4241502/4241507/30/","German+Submarine" +"[No title]","1916-08-04","http://newspapers.library.wales/view/4242141/4242143/4/","German+Submarine" +"[No title]","1917-12-28","http://newspapers.library.wales/view/4241862/4241865/16/","German+Submarine" +"DESTROYER TORPEDOED. I","1917-09-28","http://newspapers.library.wales/view/4122388/4122394/92/","German+Submarine" +"I U BOAT SUNK. —?—","1916-05-05","http://newspapers.library.wales/view/4121731/4121733/6/","German+Submarine" +"i : ROUSING NOhWAY-I-.;--","1915-08-21","http://newspapers.library.wales/view/4092530/4092538/154/","German+Submarine" +"SUBMARINE WITH MANY i 'NUMBERS.","1915-08-21","http://newspapers.library.wales/view/4092530/4092532/26/","German+Submarine" +"I PROVISIONS SEIZED. J","1915-06-01","http://newspapers.library.wales/view/4099324/4099325/39/","German+Submarine" +"-.-GERMAN SUBMARINE ASHORE. j","1915-08-24","http://newspapers.library.wales/view/4099878/4099879/6/","German+Submarine" +"[No title]","1917-10-02","http://newspapers.library.wales/view/4104080/4104083/77/","German+Submarine" +"U--s U BOAT'S ACTIVITY.","1916-11-04","http://newspapers.library.wales/view/4102504/4102508/85/","German+Submarine" +"IPIRATES AT WORK I","1915-07-27","http://newspapers.library.wales/view/4099704/4099705/20/","German+Submarine" +"] HESPERIAN TORPEDOED","1915-11-01","http://newspapers.library.wales/view/4100313/4100314/38/","German+Submarine" +"IBRff ISH WARSFII.) -COLLIDES WITHI MERCHANTIIE AUXILIARY","1915-11-06","http://newspapers.library.wales/view/4114923/4114928/89/","German+Submarine" +"NORWAY'S PROTEST.I","1915-08-21","http://newspapers.library.wales/view/4114794/4114801/122/","German+Submarine" +"U.S. STEAMER SHELLED.I","1917-03-17","http://newspapers.library.wales/view/4115517/4115518/9/","German+Submarine" +"I NAVAL HONOURS.","1915-04-15","http://newspapers.library.wales/view/3857596/3857603/95/","German+Submarine" +"ITRAWLER SHELLED BY GERMAN I ISUBMARINE.","1915-04-28","http://newspapers.library.wales/view/4118492/4118495/25/","German+Submarine" +"IENEMY SUBMARINE SUNK. j","1915-05-21","http://newspapers.library.wales/view/4121281/4121283/14/","German+Submarine" +"IVICTIMS OF SUBMARINES. I","1916-05-05","http://newspapers.library.wales/view/4121731/4121734/32/","German+Submarine" +"GERMAN HOWL.","1915-03-06","http://newspapers.library.wales/view/4092332/4092337/68/","German+Submarine" +":RAMMED AND SUNK. ———","1915-03-13","http://newspapers.library.wales/view/4092341/4092346/67/","German+Submarine" +"FINNISH STEAMER ISUBMARINED.","1915-05-01","http://newspapers.library.wales/view/4092395/4092402/125/","German+Submarine" +"STRUCK .HER STERN. I","1915-06-05","http://newspapers.library.wales/view/4092431/4092438/128/","German+Submarine" +"I ITALIAN STEAMER","1915-04-10","http://newspapers.library.wales/view/4092368/4092374/111/","German+Submarine" +"- I TRAWLER SUtK BY GUNFIRE.","1915-05-03","http://newspapers.library.wales/view/4099115/4099116/7/","German+Submarine" +"i IAWARD TO BRAVE CAPTAIN.","1915-01-28","http://newspapers.library.wales/view/4098344/4098351/97/","German+Submarine" +"[No title]","1914-09-26","http://newspapers.library.wales/view/4097218/4097221/17/","German+Submarine" +"COLLIER FIGHTS SUBMARINE1 I «.","1916-05-02","http://newspapers.library.wales/view/4101470/4101471/10/","German+Submarine" +"THE SUSSEX.|","1916-05-11","http://newspapers.library.wales/view/4101510/4101511/8/","German+Submarine" +"SAILING SHIP SUNK","1915-05-22","http://newspapers.library.wales/view/4099262/4099267/53/","German+Submarine" +"GERMAN PIRATE'S FATE. ! !","1915-02-27","http://newspapers.library.wales/view/4098651/4098652/10/","German+Submarine" +"OUTRAGE ON SPAIN.I","1918-09-14","http://newspapers.library.wales/view/4105568/4105569/21/","German+Submarine" +"I BOLSHEVIK NEWS. I","1918-07-01","http://newspapers.library.wales/view/4105240/4105241/22/","German+Submarine" +"TIMBER LADEN SHIPS FIRED1","1916-08-17","http://newspapers.library.wales/view/4102044/4102045/23/","German+Submarine" +"TRAWLER TORPEDOED.______j","1915-04-23","http://newspapers.library.wales/view/4099047/4099052/87/","German+Submarine" +"FINNISH STEAMER TORPEDOED !","1915-04-24","http://newspapers.library.wales/view/4099056/4099057/19/","German+Submarine" +"TO-DAYS WAR RESUME I -","1917-06-16","http://newspapers.library.wales/view/4103612/4103613/29/","German+Submarine" +"CORN FOR COPENHAGEN.I","1917-06-18","http://newspapers.library.wales/view/4103617/4103618/10/","German+Submarine" +"I U BOAT INTERNED I","1915-11-08","http://newspapers.library.wales/view/4100357/4100358/28/","German+Submarine" +"SURPRISE FOR U BOATS.","1916-12-01","http://newspapers.library.wales/view/4102667/4102673/136/","German+Submarine" +"ILUSITANIA "e;HERO."e;","1916-08-28","http://newspapers.library.wales/view/4102105/4102106/28/","German+Submarine" +"- - - - - - -_ =-MINES AND SUBMARINES.","1916-11-25","http://newspapers.library.wales/view/4102632/4102633/9/","German+Submarine" +"MACHICO NOT SUNK.","1916-11-22","http://newspapers.library.wales/view/4102611/4102614/73/","German+Submarine" +"16 LIVES LOST.I","1918-06-18","http://newspapers.library.wales/view/4105185/4105186/23/","German+Submarine" +"IMORE NEUTRALS SUNK.","1916-11-06","http://newspapers.library.wales/view/4102511/4102512/36/","German+Submarine" +"SPANISH SEAMEN WOUNDED","1917-08-07","http://newspapers.library.wales/view/4103838/4103839/9/","German+Submarine" +"NEARLY TIME, TOO I -","1915-06-16","http://newspapers.library.wales/view/4099427/4099428/27/","German+Submarine" +"TORPEDOED BRITISH SHIP. I","1915-03-11","http://newspapers.library.wales/view/4098737/4098738/11/","German+Submarine" +"I -ANOTHER STEAMER SUN.,","1915-03-29","http://newspapers.library.wales/view/4098870/4098875/88/","German+Submarine" +"! MORE STEAMERS SUNK I","1915-11-18","http://newspapers.library.wales/view/4100428/4100429/32/","German+Submarine" +"PRIZE FOR THORDIS. I","1915-03-30","http://newspapers.library.wales/view/4098879/4098880/7/","German+Submarine" +"HOLLAND'S BROAD -HINT. I","1916-07-20","http://newspapers.library.wales/view/4101884/4101885/21/","German+Submarine" +"IS FULL SWIMI","1916-03-15","http://newspapers.library.wales/view/4101196/4101199/54/","German+Submarine" +"MORE SHIPS SJNK. I","1916-08-08","http://newspapers.library.wales/view/4101992/4101993/20/","German+Submarine" +"SINKING OF KATWYK. I","1915-04-17","http://newspapers.library.wales/view/4099008/4099009/18/","German+Submarine" +"PIRATE BLOWN UP ?I","1915-06-28","http://newspapers.library.wales/view/4099505/4099506/28/","German+Submarine" +".SALVING THE CMFUGHTI","1915-05-12","http://newspapers.library.wales/view/4099183/4099188/90/","German+Submarine" +"[No title]","1915-05-15","http://newspapers.library.wales/view/4099210/4099215/85/","German+Submarine" +"SINKING OF DUTCH SHIPS. I","1917-08-16","http://newspapers.library.wales/view/4103878/4103879/25/","German+Submarine" +"CHANNEL TRADER SUNK. !","1916-08-11","http://newspapers.library.wales/view/4102009/4102010/8/","German+Submarine" +"SUBMARINE WARFARE.","1916-11-18","http://newspapers.library.wales/view/4115384/4115385/27/","German+Submarine" +"GEF IAN PIRATE THROWS SHELLS ON WHITEHAVEN.","1915-08-21","http://newspapers.library.wales/view/4114794/4114798/69/","German+Submarine" +"COPENHAGEN, Wednesday.","1917-09-22","http://newspapers.library.wales/view/4115706/4115707/10/","German+Submarine" +"U-BOAT ^CANAR D. I U-BOAT CANARD.","1917-04-07","http://newspapers.library.wales/view/4115538/4115539/19/","German+Submarine" +"MORE STEAMERS SIM 1","1915-11-20","http://newspapers.library.wales/view/4114945/4114950/112/","German+Submarine" +"!Notorious Traitor Captured","1916-04-29","http://newspapers.library.wales/view/3611990/3611995/52/","German+Submarine" +"VICTIM OF SUBMARINE.","1915-07-03","http://newspapers.library.wales/view/3611634/3611636/34/","German+Submarine" +"MIDSHIPMAN KIDSTON.","1914-10-22","http://newspapers.library.wales/view/3857395/3857399/67/","German+Submarine" +"-'_-----_.-_-__-----__7-LUSITAMA TORPEDOED.","1915-05-13","http://newspapers.library.wales/view/3857632/3857639/98/","German+Submarine" +"BREAD ANI) U-BOATS.I","1918-06-01","http://newspapers.library.wales/view/3979422/3979429/86/","German+Submarine" +"CHANNEL LIGHTS TO BE PUT OUT.","1914-12-09","http://newspapers.library.wales/view/4118392/4118396/41/","German+Submarine" +"U BOATS IN NORTH SEA. I","1915-05-19","http://newspapers.library.wales/view/4118507/4118511/48/","German+Submarine" +"ARMED U.S.A. LINER ARRIVES","1917-03-31","http://newspapers.library.wales/view/3978883/3978884/18/","German+Submarine" +"I U BOAT OFF EAST COAST.-I","1916-07-21","http://newspapers.library.wales/view/4121830/4121833/34/","German+Submarine" +"GERMAN CLAIM DENIED. I","1916-11-10","http://newspapers.library.wales/view/4121974/4121980/91/","German+Submarine" +"ICORK STEAMER JORPEDOED.-I","1918-06-14","http://newspapers.library.wales/view/4124678/4124685/102/","German+Submarine" +"[No title]","1915-06-25","http://newspapers.library.wales/view/3886154/3886160/81/","German+Submarine" +"SINKING OF A CONNAH'S QUAY VESSEL.","1915-05-13","http://newspapers.library.wales/view/3755401/3755405/32/","German+Submarine" +"I CARNARVON CAPTAIN TAKENI PRISONER.","1917-04-13","http://newspapers.library.wales/view/4243827/4243834/127/","German+Submarine" +"[No title]","1916-05-12","http://newspapers.library.wales/view/4121740/4121747/97/","German+Submarine" +"On Board the "e;Birmingham."e;","1914-08-22","http://newspapers.library.wales/view/3579302/3579305/39/","German+Submarine" +"I SINKING OF U29.i ——<α-","1915-06-25","http://newspapers.library.wales/view/4121326/4121332/67/","German+Submarine" +"- - - -"e; RAG"e; OF 50 SHIPS.","1916-06-22","http://newspapers.library.wales/view/4101718/4101719/16/","German+Submarine" +"——4'—— GERMAN SUBMARINE SMASHED IN TWO I","1915-12-03","http://newspapers.library.wales/view/4121533/4121539/74/","German+Submarine" +"BRAVO, THORDIS I ———-0———„","1915-03-19","http://newspapers.library.wales/view/4098798/4098801/65/","German+Submarine" +"SUNKEN TRAWLERS.","1917-07-31","http://newspapers.library.wales/view/4103808/4103811/81/","German+Submarine" +".LAURENTIC SUNK. J","1917-02-03","http://newspapers.library.wales/view/4110347/4110350/74/","German+Submarine" +"CREW OF S.S. WESTMINSTER SHELLED IN BOATS.","1917-01-05","http://newspapers.library.wales/view/4122046/4122049/38/","German+Submarine" +"ADMIRALTY AWARDS SKILfUL CAPTAIN.","1915-07-02","http://newspapers.library.wales/view/4121335/4121337/7/","German+Submarine" +"-if, - MOSTYN MAN ON THE ARABIC.","1915-09-02","http://newspapers.library.wales/view/3755545/3755548/27/","German+Submarine" +"IN THE IRISH SEA.I","1915-08-21","http://newspapers.library.wales/view/4092530/4092535/73/","German+Submarine" +"TORPEDOED.®i ———.———","1915-02-13","http://newspapers.library.wales/view/4092305/4092311/93/","German+Submarine" +"SINKING OF PIRATE 11 CRAFT.I","1915-06-26","http://newspapers.library.wales/view/4092458/4092466/141/","German+Submarine" +"—1 i STTBM A RINE GONE."e; |","1915-07-03","http://newspapers.library.wales/view/4092467/4092470/39/","German+Submarine" +"FIRST DANISH VICTIM.","1915-05-07","http://newspapers.library.wales/view/4099149/4099150/5/","German+Submarine" +"U BOAT'S -EXPOiTS. I","1917-01-09","http://newspapers.library.wales/view/4102881/4102882/13/","German+Submarine" +"THE PIRATES DEFIED. I","1916-06-15","http://newspapers.library.wales/view/4101682/4101683/36/","German+Submarine" +"RESPECTED DUTCH FLAG. ;","1915-03-03","http://newspapers.library.wales/view/4098678/4098679/20/","German+Submarine" +"j:250,000 WORTH OF PEARLS. I","1917-01-13","http://newspapers.library.wales/view/4102907/4102908/13/","German+Submarine" +"I ==:-== I PIRATES SINK AMBULANCE SHIP","1915-10-21","http://newspapers.library.wales/view/4100238/4100243/93/","German+Submarine" +"U-BOAT LOSSES.","1917-05-15","http://newspapers.library.wales/view/4103472/4103473/9/","German+Submarine" +"A FLOATING WRECK.","1915-02-06","http://newspapers.library.wales/view/4098507/4098508/7/","German+Submarine" +"SUBMARINE BLOWN UP. I","1915-02-11","http://newspapers.library.wales/view/4098539/4098540/15/","German+Submarine" +"[No title]","1916-01-07","http://newspapers.library.wales/view/4100762/4100767/110/","German+Submarine" +"ICYMRIC'S WIRELESS MAN. I","1916-05-19","http://newspapers.library.wales/view/4101547/4101548/11/","German+Submarine" +"SET ON FIRE.I","1916-05-27","http://newspapers.library.wales/view/4101586/4101587/21/","German+Submarine" +"BIRTH OF A MYTH. I -I","1915-02-23","http://newspapers.library.wales/view/4098619/4098620/18/","German+Submarine" +"! LESSON TO U-80AT. I","1918-07-12","http://newspapers.library.wales/view/4105292/4105293/40/","German+Submarine" +"U.S. SUBMARINE LOST.","1917-12-19","http://newspapers.library.wales/view/4104423/4104424/10/","German+Submarine" +".100 LIVES LOST.1 —■ -lg> —","1917-12-24","http://newspapers.library.wales/view/4104443/4104444/11/","German+Submarine" +"I TRUSTED THE HUN.","1917-10-11","http://newspapers.library.wales/view/4104120/4104121/31/","German+Submarine" +"A MEAT TRAP.","1918-02-01","http://newspapers.library.wales/view/4104605/4104609/83/","German+Submarine" +"GERMAN CHARGES DENIED","1915-12-11","http://newspapers.library.wales/view/4100586/4100591/69/","German+Submarine" +",----I ANOTHER TRAWLER TORPEDOED. I -I","1915-04-20","http://newspapers.library.wales/view/4099022/4099023/19/","German+Submarine" +"CLOAK TO COWARDICE. -_*___","1916-11-16","http://newspapers.library.wales/view/4102574/4102575/5/","German+Submarine" +"SHELLED BY SUBMARINE","1915-04-22","http://newspapers.library.wales/view/4099038/4099043/81/","German+Submarine" +"..."e;.......I NORWEGIAN GOVERNMENT ANGRY, j","1916-03-23","http://newspapers.library.wales/view/4101245/4101251/141/","German+Submarine" +"A PORTUGUESE REPORT. I","1916-11-20","http://newspapers.library.wales/view/4102597/4102598/36/","German+Submarine" +"THE NEWEST SUBMARINE","1916-03-28","http://newspapers.library.wales/view/4101273/4101274/21/","German+Submarine" +"I GERMAN LIES REPEATED. I","1918-01-18","http://newspapers.library.wales/view/4104545/4104546/10/","German+Submarine" +"OUTRAGE ON SPAIN. I1","1918-07-17","http://newspapers.library.wales/view/4105314/4105315/9/","German+Submarine" +"THEWAR -o","1915-08-17","http://newspapers.library.wales/view/4099836/4099837/35/","German+Submarine" +"IU-BOAT INHUMANITY. I","1917-09-17","http://newspapers.library.wales/view/4104015/4104016/27/","German+Submarine" +"L U SIT A N8 AS SKIP PER.!","1918-01-11","http://newspapers.library.wales/view/4104515/4104516/16/","German+Submarine" +"------ISTRONGLY WORDED. i","1917-04-14","http://newspapers.library.wales/view/4103342/4103343/8/","German+Submarine" +"FAMOUS FEAT RECALLED. !","1918-01-12","http://newspapers.library.wales/view/4104520/4104521/25/","German+Submarine" +"TWO U-BOATS CONE i","1917-09-19","http://newspapers.library.wales/view/4104025/4104026/15/","German+Submarine" +"TO-DAY'S WAR RESUME","1917-09-19","http://newspapers.library.wales/view/4104025/4104026/33/","German+Submarine" +" GERMAN ADMISSIONS. I","1916-04-13","http://newspapers.library.wales/view/4101371/4101375/82/","German+Submarine" +"SET ON fE.I","1916-07-27","http://newspapers.library.wales/view/4101926/4101927/8/","German+Submarine" +"I CERMAN PIRATE FO LED","1915-11-26","http://newspapers.library.wales/view/4100483/4100484/22/","German+Submarine" +"FAILED TO SINK PIRATE.I","1915-04-08","http://newspapers.library.wales/view/4098936/4098937/9/","German+Submarine" +"THE LOSS OF THE FALABA. I","1915-04-08","http://newspapers.library.wales/view/4098936/4098939/54/","German+Submarine" +"[No title]","1915-04-10","http://newspapers.library.wales/view/4098954/4098959/78/","German+Submarine" +"SHIPPING AND THE WAR. I","1917-03-02","http://newspapers.library.wales/view/4103162/4103163/33/","German+Submarine" +"-...- _ - _ -_u - THE PIRATES' COMPLAINT.","1915-03-13","http://newspapers.library.wales/view/4098755/4098756/9/","German+Submarine" +"HULL LINER TORPEDOEDI - - -)","1915-07-09","http://newspapers.library.wales/view/4099589/4099590/5/","German+Submarine" +"I I? rI i"e; iHr *irE TABLES TURNED. .","1915-03-29","http://newspapers.library.wales/view/4098870/4098876/103/","German+Submarine" +".GERMAN EXCUSE TO HOLLAND,!","1915-03-31","http://newspapers.library.wales/view/4098888/4098891/55/","German+Submarine" +"I VAIN EFFORT TO WARI RELIEF SHIP I","1915-04-15","http://newspapers.library.wales/view/4098990/4098991/12/","German+Submarine" +"I SET Ojf FIREI -————-——-","1915-06-25","http://newspapers.library.wales/view/4099487/4099492/68/","German+Submarine" +"FIGHTING THE U-BOAT.","1917-01-27","http://newspapers.library.wales/view/4102985/4102986/20/","German+Submarine" +"-c:-C-c-=.=I INDIGNANT SWEDES. ! j","1915-03-16","http://newspapers.library.wales/view/4098773/4098774/21/","German+Submarine" +"! TO-DAYS WAR RESUME I","1917-06-12","http://newspapers.library.wales/view/4103592/4103593/34/","German+Submarine" +"LOST ENEMY SUBMARINE. I","1917-01-31","http://newspapers.library.wales/view/4103006/4103008/49/","German+Submarine" +"I A MYTHICAL LOAN. I","1915-07-15","http://newspapers.library.wales/view/4099628/4099629/11/","German+Submarine" +"HAS NOT RETURNED","1915-06-16","http://newspapers.library.wales/view/4099427/4099428/4/","German+Submarine" +"U-BOAT'S WARM TIME. I","1917-06-14","http://newspapers.library.wales/view/4103602/4103603/23/","German+Submarine" +"SATISFIED WITH RESULTS.! ____","1917-02-27","http://newspapers.library.wales/view/4103147/4103148/19/","German+Submarine" +"I U-BOAT'S POOR SHOTS.","1916-08-22","http://newspapers.library.wales/view/4102072/4102073/19/","German+Submarine" +"DEUTSCHLAND AT SEA. : -<-I","1916-11-22","http://newspapers.library.wales/view/4102611/4102612/17/","German+Submarine" +"A Tara Survivor. I","1916-04-28","http://newspapers.library.wales/view/3413241/3413247/88/","German+Submarine" +"1 DIPLOMATIC DISASTER.","1916-05-10","http://newspapers.library.wales/view/4101505/4101506/11/","German+Submarine" +"MORE SHIPS SUNK. I","1916-08-14","http://newspapers.library.wales/view/4102023/4102024/13/","German+Submarine" +"ITHE ZEEBHUQCE AIR RAIDI","1916-03-22","http://newspapers.library.wales/view/4101238/4101239/5/","German+Submarine" +"- - - -CLAIM TO SINKING OF U BOAT.","1915-08-05","http://newspapers.library.wales/view/4099766/4099767/21/","German+Submarine" +"Borth Captain Honoured.i","1918-11-15","http://newspapers.library.wales/view/3414458/3414466/112/","German+Submarine" +"Barmouth's Zeeforugge Volunteer.","1918-05-31","http://newspapers.library.wales/view/3414239/3414244/53/","German+Submarine" +"-; SANK -A SUBMARINE, __I","1916-01-01","http://newspapers.library.wales/view/4092701/4092707/111/","German+Submarine" +"[No title]","1915-05-29","http://newspapers.library.wales/view/4114638/4114644/93/","German+Submarine" +"SHELLED BY ?UBMAR:NE.I","1915-04-24","http://newspapers.library.wales/view/4114573/4114580/107/","German+Submarine" +"A MYTHICAL LOAN.I","1915-07-17","http://newspapers.library.wales/view/4114729/4114736/130/","German+Submarine" +"GERMAN SUBMARINE ENTANGLED IN FISHING NET.","1914-11-07","http://newspapers.library.wales/view/3611327/3611329/6/","German+Submarine" +"/ LIT SIT AN [A. COMMANDER AT BARRY.","1915-12-31","http://newspapers.library.wales/view/4130387/4130393/35/","German+Submarine" +"BARRV OHIE ENGINEERj MISSING.. j —I","1916-04-14","http://newspapers.library.wales/view/4168891/4168898/51/","German+Submarine" +"i NINE THOUSAND TONS OF WHEAT CONK.","1917-06-22","http://newspapers.library.wales/view/4130612/4130614/14/","German+Submarine" +"I -,FIRST BELCIAN SKIPPER.I","1918-05-04","http://newspapers.library.wales/view/4110674/4110677/93/","German+Submarine" +"D.S.O. FOR SWANSEA SKIPPER.","1918-01-26","http://newspapers.library.wales/view/4110619/4110621/51/","German+Submarine" +"THE GLENART CASTLEj","1918-03-09","http://newspapers.library.wales/view/4110639/4110641/76/","German+Submarine" +"I "e; HOSTILE ■TRANSPORT."e;!","1916-11-18","http://newspapers.library.wales/view/4093033/4093038/59/","German+Submarine" +"! THE DEUTSCHLAND.","1916-08-26","http://newspapers.library.wales/view/4092949/4092954/69/","German+Submarine" +"i SPANISH BOAT SUB-MARINED.","1916-04-08","http://newspapers.library.wales/view/4092823/4092829/103/","German+Submarine" +"IPIRATES STILL BUSY. I","1915-08-07","http://newspapers.library.wales/view/4114768/4114775/82/","German+Submarine" +"SUBMARINE CHASED.","1915-03-11","http://newspapers.library.wales/view/3857551/3857553/18/","German+Submarine" +"BRE5LAU TORPEDOED.","1915-07-29","http://newspapers.library.wales/view/3857731/3857738/56/","German+Submarine" +"GEItMA., SUBMARINE SUNK.","1915-07-01","http://newspapers.library.wales/view/3857695/3857702/88/","German+Submarine" +"I -LETTER$TON. I","1917-07-04","http://newspapers.library.wales/view/4119062/4119063/6/","German+Submarine" +"[No title]","1915-03-05","http://newspapers.library.wales/view/3585205/3585206/9/","German+Submarine" +"AUXILIARY CRUISER SUNK.j","1917-02-02","http://newspapers.library.wales/view/4122082/4122085/34/","German+Submarine" +"IDANISH STEAMER TORPEDOED.I","1915-05-21","http://newspapers.library.wales/view/4121281/4121288/89/","German+Submarine" +"TORPEDO THAT MISSED.","1915-05-28","http://newspapers.library.wales/view/4121290/4121292/9/","German+Submarine" +"I .ARMED LINER TORPEDOED.I","1918-08-02","http://newspapers.library.wales/view/4124741/4124748/81/","German+Submarine" +"[No title]","1915-09-17","http://newspapers.library.wales/view/4121434/4121436/15/","German+Submarine" +"ITHE "e;BLOCKADE."e;","1915-07-02","http://newspapers.library.wales/view/4121335/4121337/23/","German+Submarine" +"PIRATES' WEEK'S WORK. I","1915-07-02","http://newspapers.library.wales/view/4121335/4121338/35/","German+Submarine" +"[No title]","1914-10-30","http://newspapers.library.wales/view/4121020/4121022/14/","German+Submarine" +"IHEROES OF PEACE AND WAn.","1914-11-13","http://newspapers.library.wales/view/4121038/4121045/74/","German+Submarine" +"FISHERMAN HERO REWARDED. I","1915-12-31","http://newspapers.library.wales/view/4121569/4121572/26/","German+Submarine" +"FRENCH LINER'S ESCAPE. -","1916-03-24","http://newspapers.library.wales/view/4121677/4121683/105/","German+Submarine" +"A SUBMARINE STORY. j","1918-07-19","http://newspapers.library.wales/view/4124723/4124725/11/","German+Submarine" +"American Armed Liner","1917-05-03","http://newspapers.library.wales/view/4013726/4013727/7/","German+Submarine" +"[No title]","1917-02-23","http://newspapers.library.wales/view/4241466/4241470/34/","German+Submarine" +"[No title]","1916-07-14","http://newspapers.library.wales/view/4242114/4242120/44/","German+Submarine" +"STEAMER DELUDES SUBMARINE. I","1915-01-29","http://newspapers.library.wales/view/4121137/4121140/33/","German+Submarine" +"Lusitania Crime.","1915-05-15","http://newspapers.library.wales/view/3579644/3579649/69/","German+Submarine" +"ANOTHER GONE?I","1915-03-13","http://newspapers.library.wales/view/4092341/4092348/101/","German+Submarine" +"CERTIFIED CONTRA BAND.","1915-07-10","http://newspapers.library.wales/view/4092476/4092482/89/","German+Submarine" +"U-BOAT MURDERS. -I","1917-01-05","http://newspapers.library.wales/view/4102860/4102864/90/","German+Submarine" +"-SKEWEN VICTIM -OF PIRATES I","1915-06-09","http://newspapers.library.wales/view/4099379/4099385/111/","German+Submarine" +"JU-BOAT 'ESCAPES)","1917-10-08","http://newspapers.library.wales/view/4104105/4104106/19/","German+Submarine" +"U-BOAT -BASES,'I","1917-10-09","http://newspapers.library.wales/view/4104110/4104111/27/","German+Submarine" +"I U BOATS AT -WORK.-I","1916-11-20","http://newspapers.library.wales/view/4102597/4102598/8/","German+Submarine" +"ENEMY NAVAL lOSSES I","1917-10-01","http://newspapers.library.wales/view/4104075/4104076/9/","German+Submarine" +"- - - .- - - NORWAY'S PROTESTI t","1915-08-19","http://newspapers.library.wales/view/4099850/4099851/31/","German+Submarine" +"I SELF-CONDEMNEDi","1916-04-15","http://newspapers.library.wales/view/4101385/4101386/22/","German+Submarine" +"U-BOAT TRAPPED. I .-","1918-02-15","http://newspapers.library.wales/view/4104665/4104666/32/","German+Submarine" +"WAR ON FISHERMEN.","1916-08-01","http://newspapers.library.wales/view/4101954/4101955/20/","German+Submarine" +"MORE TRAWLERS 8UNKI","1916-08-04","http://newspapers.library.wales/view/4101973/4101974/24/","German+Submarine" +"7:- -:- - - ' I VICTIMS OF GERMAN PIRATES I","1915-07-13","http://newspapers.library.wales/view/4099614/4099619/106/","German+Submarine" +"*.■ .. ! THE DEUTSCHLAND.","1916-07-25","http://newspapers.library.wales/view/4101912/4101918/113/","German+Submarine" +"ITHEWAR","1915-07-05","http://newspapers.library.wales/view/4099557/4099558/27/","German+Submarine" +"TH E WAR I' ; *—f;","1915-09-06","http://newspapers.library.wales/view/4099955/4099956/33/","German+Submarine" +"SKEWEN VICTIM OF PIRATES. ¡","1915-06-12","http://newspapers.library.wales/view/4114664/4114676/244/","German+Submarine" +"i "e;U"e; BOATS BUSY ! !-..--.-i","1916-11-25","http://newspapers.library.wales/view/4093040/4093042/16/","German+Submarine" +"I HOW THE GERMAN SUBMARINE-i .WAS UN.","1914-08-15","http://newspapers.library.wales/view/4114149/4114154/67/","German+Submarine" +"IVictim of German Submarine.","1916-06-21","http://newspapers.library.wales/view/4118792/4118794/18/","German+Submarine" +"IU BOAT'S LATEST. I","1915-08-20","http://newspapers.library.wales/view/4121398/4121401/44/","German+Submarine" +"SUBMARINE DEFIED. I","1915-12-10","http://newspapers.library.wales/view/4121542/4121548/73/","German+Submarine" +"NORWEGIAN SKIPPER'S STORY.","1916-11-10","http://newspapers.library.wales/view/4121974/4121980/71/","German+Submarine" +"I MORE U-BOAT MTIRDERS.","1917-09-21","http://newspapers.library.wales/view/4122379/4122382/48/","German+Submarine" +",TRAWLERS' FIGHT WITH SUBMARINES","1917-05-11","http://newspapers.library.wales/view/4122208/4122210/38/","German+Submarine" +"I NORWEGIAN VESSEL RESCUED AND U BOAT MEN CAPTURED.","1916-12-01","http://newspapers.library.wales/view/4122001/4122007/93/","German+Submarine" +"LUSITANIA VERDICT. I","1915-05-21","http://newspapers.library.wales/view/4121281/4121284/27/","German+Submarine" +"On Board the 'Graphic'","1915-02-06","http://newspapers.library.wales/view/4122946/4122947/14/","German+Submarine" +"'"e;ON THE SEA. •N.","1914-09-16","http://newspapers.library.wales/view/4097153/4097157/40/","German+Submarine" +"!lWO RAiBERS EC-IAMD STAY UNBER.","1915-03-13","http://newspapers.library.wales/view/4092341/4092343/13/","German+Submarine" +"I TRAWLERS BLOWN UP.","1915-06-12","http://newspapers.library.wales/view/4114664/4114671/108/","German+Submarine" +"GERMAN BRUTALITY AT SEA.","1917-03-24","http://newspapers.library.wales/view/3978874/3978882/92/","German+Submarine" +"FISHER-FOLK MURDERED. I","1915-04-23","http://newspapers.library.wales/view/4121245/4121247/17/","German+Submarine" +"IFALABA JUDGMENT.","1915-07-16","http://newspapers.library.wales/view/4121353/4121356/42/","German+Submarine" +"Pathfinder Avenged. I —0.","1914-09-17","http://newspapers.library.wales/view/4012892/4012893/5/","German+Submarine" +"IESCAPED STEAMER AT SWANSEA I","1915-05-08","http://newspapers.library.wales/view/3977994/3978002/102/","German+Submarine" +"[No title]","1917-02-01","http://newspapers.library.wales/view/4013635/4013640/62/","German+Submarine" +""e; PAINFUL DUTY."e; I","1915-04-10","http://newspapers.library.wales/view/4092368/4092375/122/","German+Submarine" +"TORPEDOED IN HIS BATH.","1914-11-07","http://newspapers.library.wales/view/3977760/3977766/110/","German+Submarine" +"i "e;PROMPt AOTiCr 1 ] -","1915-07-24","http://newspapers.library.wales/view/4092494/4092500/83/","German+Submarine" +"I 1 SENSATIONAL U.SI -STATEMENT.i","1915-10-09","http://newspapers.library.wales/view/4092593/4092596/48/","German+Submarine" +"! PAST THE ROCK.1 I-"e;'-","1915-11-13","http://newspapers.library.wales/view/4092638/4092645/148/","German+Submarine" +"THREE NEUTRALS AT ONE BLOW.'","1915-02-27","http://newspapers.library.wales/view/4092323/4092329/120/","German+Submarine" +"I . I .UJ4. ! I--","1915-06-19","http://newspapers.library.wales/view/4092449/4092454/65/","German+Submarine" +"FRANK SUBMARINE I SKIPPER.I","1915-06-19","http://newspapers.library.wales/view/4092449/4092456/114/","German+Submarine" +"[No title]","1915-06-26","http://newspapers.library.wales/view/4092458/4092465/123/","German+Submarine" +"ME8 THE SMA?E. j DODGED THE SUBMAR!NE. j -I","1915-01-25","http://newspapers.library.wales/view/4098319/4098324/75/","German+Submarine" +"I Answer to a General Question.","1914-09-23","http://newspapers.library.wales/view/4097197/4097203/60/","German+Submarine" +"! THEWAR i i-","1916-02-01","http://newspapers.library.wales/view/4100923/4100924/24/","German+Submarine" +"1 PfRAmTFAlE? f I ! --!","1915-03-05","http://newspapers.library.wales/view/4098696/4098697/18/","German+Submarine" +"SPAIN AND U-BOATS.I","1917-05-14","http://newspapers.library.wales/view/4103467/4103468/10/","German+Submarine" +"SPANISH PETROL FOR PIRATES","1915-09-10","http://newspapers.library.wales/view/4099983/4099984/36/","German+Submarine" +"11 000 OFFERED ———-0———","1915-05-24","http://newspapers.library.wales/view/4099271/4099272/13/","German+Submarine" +"[No title]","1915-05-27","http://newspapers.library.wales/view/4099292/4099298/105/","German+Submarine" +"TO-DAY'S WlAh RESUME","1916-05-24","http://newspapers.library.wales/view/4101569/4101570/34/","German+Submarine" +"SUBMARINE VICTIM i","1915-06-01","http://newspapers.library.wales/view/4099324/4099329/95/","German+Submarine" +"-LIFE ON A U BOAT. I","1916-06-07","http://newspapers.library.wales/view/4101641/4101642/6/","German+Submarine" +"CAPTAkN BLAIKIE'S CASE. _)","1916-12-22","http://newspapers.library.wales/view/4102795/4102796/20/","German+Submarine" +"TO-DAYS WAR RESUME","1918-03-14","http://newspapers.library.wales/view/4104788/4104789/28/","German+Submarine" +"IU-BOAT LOSSES.I","1918-02-21","http://newspapers.library.wales/view/4104690/4104691/21/","German+Submarine" +"DAYLIGHT ATTACK.I","1918-06-08","http://newspapers.library.wales/view/4105145/4105146/14/","German+Submarine" +"THE ASKEWS. I","1917-10-18","http://newspapers.library.wales/view/4104150/4104151/24/","German+Submarine" +"BRITISH VESSELS SUNK","1915-08-02","http://newspapers.library.wales/view/4099745/4099750/70/","German+Submarine" +"WAR AND NEUTRALS.t","1917-03-19","http://newspapers.library.wales/view/4103232/4103233/10/","German+Submarine" +"NOT AFRAID OF PIRATES, ;","1916-08-16","http://newspapers.library.wales/view/4102037/4102041/96/","German+Submarine" +"t BOUND FROM SWANSEA.i","1916-11-17","http://newspapers.library.wales/view/4102581/4102582/36/","German+Submarine" +"DEFIED THE U-BOAT. I","1917-02-01","http://newspapers.library.wales/view/4103013/4103014/26/","German+Submarine" +"THE WAR","1916-02-16","http://newspapers.library.wales/view/4101022/4101023/30/","German+Submarine" +"I. I U BOATS IN -m STRAITS","1915-11-08","http://newspapers.library.wales/view/4100357/4100358/16/","German+Submarine" +"GUNARDER SUNK. I","1916-10-20","http://newspapers.library.wales/view/4102413/4102414/4/","German+Submarine" +"TO-DAY'S WAR RESUiij","1917-02-06","http://newspapers.library.wales/view/4103039/4103040/20/","German+Submarine" +"TRAWLERS BLOWN UP. I","1916-07-14","http://newspapers.library.wales/view/4101849/4101850/5/","German+Submarine" +"U-BOAT'S TORPEDO SANK ¡SUSSEX","1916-04-07","http://newspapers.library.wales/view/4101336/4101337/21/","German+Submarine" +"MAN IN THE TOWER.","1918-05-09","http://newspapers.library.wales/view/4105020/4105021/12/","German+Submarine" +"THEWAR I.--I","1915-08-27","http://newspapers.library.wales/view/4099899/4099900/32/","German+Submarine" +"CONCEALING THE TRUTH.","1915-08-28","http://newspapers.library.wales/view/4099906/4099907/16/","German+Submarine" +"OPEN BOATS SHELLED.I I","1917-09-14","http://newspapers.library.wales/view/4104003/4104004/21/","German+Submarine" +"SEVENTY PIA TES SUNK. r ----I","1915-10-04","http://newspapers.library.wales/view/4100127/4100128/17/","German+Submarine" +"TO-DAYS WAR RESUME","1918-01-28","http://newspapers.library.wales/view/4104585/4104586/25/","German+Submarine" +"ALLEGED SUBMARINE BOAT","1915-04-08","http://newspapers.library.wales/view/4098936/4098942/130/","German+Submarine" +"THEWAR","1916-03-07","http://newspapers.library.wales/view/4101147/4101148/24/","German+Submarine" +"ITO-DAY'S WAR RESUME","1916-10-09","http://newspapers.library.wales/view/4102343/4102344/22/","German+Submarine" +"LATEST PIRACY VICTIMS. )","1915-07-10","http://newspapers.library.wales/view/4099598/4099599/17/","German+Submarine" +"! U-BOAT CHASERS. j","1917-07-12","http://newspapers.library.wales/view/4103728/4103732/75/","German+Submarine" +"TO-DAYS WAR RESUME","1916-07-21","http://newspapers.library.wales/view/4101891/4101892/15/","German+Submarine" +"BOXED THE COMPASS TWICE.","1915-04-15","http://newspapers.library.wales/view/4098990/4098991/6/","German+Submarine" +"GERMAN DESTROYERS OUT. J","1915-07-31","http://newspapers.library.wales/view/4099736/4099737/13/","German+Submarine" +"ISKIPPER WHO ELUDED A PIRATE.I","1915-04-16","http://newspapers.library.wales/view/4098999/4099005/65/","German+Submarine" +"ALMOST HUMOROUS LIES. r I","1915-04-16","http://newspapers.library.wales/view/4098999/4099005/75/","German+Submarine" +"Advertising","1915-08-02","http://newspapers.library.wales/view/4099745/4099746/22/","German+Submarine" +"Advertising","1916-10-14","http://newspapers.library.wales/view/4102378/4102379/42/","German+Submarine" +"U-BOAT IN TROUBLE.","1917-06-12","http://newspapers.library.wales/view/4103592/4103593/23/","German+Submarine" +"NO WARNING GIVEN.I","1916-07-06","http://newspapers.library.wales/view/4101798/4101804/126/","German+Submarine" +"SINKING SUBMARINE i -","1915-11-05","http://newspapers.library.wales/view/4100341/4100342/18/","German+Submarine" +"NORTH-EAST COAST RAIDED.I","1916-07-15","http://newspapers.library.wales/view/4115242/4115243/12/","German+Submarine" +"Portmadoc Patriots.","1917-05-11","http://newspapers.library.wales/view/3413744/3413750/76/","German+Submarine" +"ENEMY SUBMARINE SUNK.","1914-11-28","http://newspapers.library.wales/view/3611354/3611356/11/","German+Submarine" +"NEWS IN BRIEF__I","1915-05-12","http://newspapers.library.wales/view/4099183/4099186/25/","German+Submarine" +"THEY CALL IT AN ACCIDENT.I","1915-04-20","http://newspapers.library.wales/view/4099022/4099023/33/","German+Submarine" +"THE WAR i -","1916-03-22","http://newspapers.library.wales/view/4101238/4101239/24/","German+Submarine" +"RESCUED BY CLIFF-LADDERSI","1916-04-27","http://newspapers.library.wales/view/4101446/4101447/23/","German+Submarine" +"jTHEWAR","1916-04-28","http://newspapers.library.wales/view/4101451/4101452/22/","German+Submarine" +"BRITISH OFFICER'S DARING ACT.I","1915-08-28","http://newspapers.library.wales/view/4114807/4114814/127/","German+Submarine" +"WRECKAGE OF H!S OWN I SHIP.","1916-01-15","http://newspapers.library.wales/view/4092719/4092724/74/","German+Submarine" +"FIRST ARMED U.S. LINER. I","1917-04-07","http://newspapers.library.wales/view/4115538/4115539/21/","German+Submarine" +"-- ----------Special Telegrams.","1915-05-29","http://newspapers.library.wales/view/3611589/3611594/63/","German+Submarine" +"BRESLAU TORPEDOED. !","1915-07-31","http://newspapers.library.wales/view/3611670/3611672/9/","German+Submarine" +"GERMAN PIRAC. y CONTINUED.","1915-07-31","http://newspapers.library.wales/view/3611670/3611672/30/","German+Submarine" +"- - - - -_-_ -LUSITANIA VICTIMS.","1915-05-14","http://newspapers.library.wales/view/4130090/4130098/56/","German+Submarine" +"THE WAR.","1916-07-14","http://newspapers.library.wales/view/3690070/3690076/61/","German+Submarine" +"GERMAN SUBMARINE SUNK.","1915-07-10","http://newspapers.library.wales/view/4114716/4114723/103/","German+Submarine" +"Prindder Siwgwr.","1917-07-20","http://newspapers.library.wales/view/3688777/3688780/27/","German+Submarine" +"-==----=.-WAR LATEST. J","1915-08-19","http://newspapers.library.wales/view/3857758/3857766/97/","German+Submarine" +"LOSS OF H.M.S. -HAWKE.i","1914-10-21","http://newspapers.library.wales/view/4118357/4118361/39/","German+Submarine" +"I Milford Haven News. I","1916-12-13","http://newspapers.library.wales/view/4118917/4118920/24/","German+Submarine" +"BRESLAU TORPEDOED. I","1915-07-28","http://newspapers.library.wales/view/4118557/4118561/39/","German+Submarine" +"U-BOAT CHASERS. v","1917-07-14","http://newspapers.library.wales/view/3979012/3979015/39/","German+Submarine" +"PERUVIANS DEMANDS.I","1917-02-16","http://newspapers.library.wales/view/4122100/4122102/15/","German+Submarine" +"TRAWLER TORPEDOED.","1915-04-16","http://newspapers.library.wales/view/4121236/4121239/40/","German+Submarine" +"SHELLS AT TRAWLER. I","1915-04-30","http://newspapers.library.wales/view/4121254/4121257/22/","German+Submarine" +"THE .WELSH AND THE ONION. I","1916-04-07","http://newspapers.library.wales/view/4243402/4243409/73/","German+Submarine" +".PRESIDENT WILSON S ULTI-I MATUM-","1916-04-20","http://newspapers.library.wales/view/4243420/4243425/44/","German+Submarine" +"I L. & N.W. Railwaymen's Sympathy. I","1915-05-28","http://newspapers.library.wales/view/4121290/4121295/42/","German+Submarine" +"Submarine Sunk by Aeroplane. I","1915-08-27","http://newspapers.library.wales/view/4121407/4121412/51/","German+Submarine" +"CHASED BY SUBMARINE. I","1914-12-18","http://newspapers.library.wales/view/4121083/4121085/8/","German+Submarine" +"BRIFISH STEAMERS SUNK.","1914-12-04","http://newspapers.library.wales/view/4121065/4121071/63/","German+Submarine" +"[No title]","1916-02-04","http://newspapers.library.wales/view/4121614/4121617/55/","German+Submarine" +"BRAVE FISHERMEN REWARDED. I","1915-07-02","http://newspapers.library.wales/view/4121335/4121338/32/","German+Submarine" +"I_Captures of U Boats..-.-,","1917-05-17","http://newspapers.library.wales/view/4013736/4013739/38/","German+Submarine" +"HONOUR FOR CAPTAIN OF THORDIS.","1915-03-26","http://newspapers.library.wales/view/4121209/4121216/81/","German+Submarine" +"WHITE STAR LINER SUNK.","1915-08-20","http://newspapers.library.wales/view/4243105/4243110/45/","German+Submarine" +"ABERARTH.","1915-05-01","http://newspapers.library.wales/view/3888691/3888705/133/","German+Submarine" +"GERMAN SUBMARINE SUNK. -","1914-11-26","http://newspapers.library.wales/view/3755185/3755191/61/","German+Submarine" +"—— *1*— GERMAN SUBMARINE SUNK. --------","1914-10-29","http://newspapers.library.wales/view/3755149/3755155/63/","German+Submarine" +"SUBMARINE SCAREDI OFF.","1915-03-06","http://newspapers.library.wales/view/4092332/4092340/138/","German+Submarine" +"i -MET GInIAN SUBMARINES. !","1915-02-27","http://newspapers.library.wales/view/4092323/4092326/31/","German+Submarine" +"I OUTSIDE THE PALE. j","1915-02-06","http://newspapers.library.wales/view/4092296/4092299/43/","German+Submarine" +"IFIRST RESULTS OF IT","1915-02-27","http://newspapers.library.wales/view/4092323/4092325/19/","German+Submarine" +"THE TUBANTiA. ______!","1916-06-14","http://newspapers.library.wales/view/4101677/4101678/14/","German+Submarine" +"MURDERED AT SEA____I","1917-05-22","http://newspapers.library.wales/view/4103502/4103503/20/","German+Submarine" +"THEWAR","1915-06-19","http://newspapers.library.wales/view/4099450/4099451/27/","German+Submarine" +"------------TULWAR","1915-03-12","http://newspapers.library.wales/view/3412710/3412718/69/","German+Submarine" +"MURDERED AT SEA. I","1917-05-26","http://newspapers.library.wales/view/4115587/4115590/85/","German+Submarine" +"SMALL HARBOUR I SHELLED.","1916-07-15","http://newspapers.library.wales/view/4092907/4092913/116/","German+Submarine" +"PIRATE'S DOOM.I","1915-06-12","http://newspapers.library.wales/view/4114664/4114671/107/","German+Submarine" +"DASH FOR SUBMARINE.","1915-04-01","http://newspapers.library.wales/view/3857578/3857585/96/","German+Submarine" +"SUBMARINE PIRATES KILL TWO FISHERMEN.","1915-04-30","http://newspapers.library.wales/view/4121254/4121256/9/","German+Submarine" +"LEYLAND LINER SHELLED.","1915-08-06","http://newspapers.library.wales/view/4121380/4121382/8/","German+Submarine" +"THE SINKING OF "e;"e; U4 I."e;' .——ep.-","1916-12-29","http://newspapers.library.wales/view/4122037/4122040/13/","German+Submarine" +"THREE SHIPS SUNK.I -","1915-07-16","http://newspapers.library.wales/view/4121353/4121356/43/","German+Submarine" +"TRAGEDY OF THE U9.","1914-11-05","http://newspapers.library.wales/view/4012955/4012956/11/","German+Submarine" +"*.-J' .SUBMARINE OUTWITTED.","1915-02-18","http://newspapers.library.wales/view/3755293/3755301/90/","German+Submarine" +"| YEAR'S DIARY. J YEAR'S. DIARY.","1915-08-07","http://newspapers.library.wales/view/4114768/4114775/106/","German+Submarine" +"PIRATES' tlA TEST.","1915-05-01","http://newspapers.library.wales/view/4099106/4099113/129/","German+Submarine" +"PIRATES GET BUSY.I ———.0———","1915-05-03","http://newspapers.library.wales/view/4099115/4099116/25/","German+Submarine" +"U.S. STEAMER SHELLED","1917-03-15","http://newspapers.library.wales/view/4103217/4103218/17/","German+Submarine" +"- CAPTAIN SAM OF THE SNOWDON PEAK.","1915-03-11","http://newspapers.library.wales/view/3857551/3857558/103/","German+Submarine" +"BRITISH STEAMERS TORPEDOED.","1915-02-25","http://newspapers.library.wales/view/3857533/3857535/12/","German+Submarine" +"BRITISH STEAMERS TORPEDOED,","1915-02-24","http://newspapers.library.wales/view/4118447/4118451/46/","German+Submarine" +"Advertising","1914-10-22","http://newspapers.library.wales/view/3755140/3755148/98/","German+Submarine" +"EIGHTEEN PIltATJiS PERISH","1915-03-13","http://newspapers.library.wales/view/4092341/4092349/124/","German+Submarine" +"I I TORPEDOED.","1915-01-22","http://newspapers.library.wales/view/4098303/4098304/31/","German+Submarine" +" THEWAR","1915-09-08","http://newspapers.library.wales/view/4099969/4099970/31/","German+Submarine" +"SIR E. GREY'S REPLY","1916-01-08","http://newspapers.library.wales/view/4115022/4115026/67/","German+Submarine" +",NEW GERMAN! 'CRIME.","1918-06-08","http://newspapers.library.wales/view/4105145/4105146/13/","German+Submarine" +"U BOAT'S lONG TRIP I I","1916-07-10","http://newspapers.library.wales/view/4101821/4101823/27/","German+Submarine" +"TURNING POINT OF ,WAR !","1917-04-19","http://newspapers.library.wales/view/4103362/4103363/5/","German+Submarine" +"I TWELVE LVES LOST. j","1915-04-17","http://newspapers.library.wales/view/4114560/4114569/135/","German+Submarine" +"ST ASAPH.","1915-06-05","http://newspapers.library.wales/view/3611598/3611603/73/","German+Submarine" +"BARRY CAPTAIN'S DEED.","1915-03-12","http://newspapers.library.wales/view/4130009/4130016/54/","German+Submarine" +"NAVAL","1916-10-28","http://newspapers.library.wales/view/4093012/4093017/94/","German+Submarine" +"-II -.ACHES u. s,. I BREMEN REACHES U.S. .... i","1916-09-30","http://newspapers.library.wales/view/4092984/4092989/83/","German+Submarine" +"GERMAN WAR ON SHIPPING.","1915-02-04","http://newspapers.library.wales/view/3857506/3857508/10/","German+Submarine" +"I RUBBER ONIONS.","1916-05-06","http://newspapers.library.wales/view/3978462/3978467/63/","German+Submarine" +"I THREE S IE A ME IIS SUNK.","1915-06-02","http://newspapers.library.wales/view/4118517/4118521/52/","German+Submarine" +"I BALTIC BATTLE.","1915-07-09","http://newspapers.library.wales/view/4121344/4121347/31/","German+Submarine" +"GERMAN SUBMARINE ATTACK ON DUTCH SHIPPING.","1917-03-02","http://newspapers.library.wales/view/4122118/4122120/18/","German+Submarine" +"WAR ON NEUTRALS. I","1915-04-02","http://newspapers.library.wales/view/4121218/4121224/70/","German+Submarine" +"OLD CRUISER SUNK","1914-11-07","http://newspapers.library.wales/view/4092206/4092209/35/","German+Submarine" +"TWO MORE PIRATES ! GONE P I -","1915-04-03","http://newspapers.library.wales/view/4092359/4092365/100/","German+Submarine" +"¡SHIP OF MANY ADVENTURES.I","1915-11-13","http://newspapers.library.wales/view/3978237/3978244/80/","German+Submarine" +"I'.I IWHITE STAR LINER j","1915-06-05","http://newspapers.library.wales/view/4092431/4092434/57/","German+Submarine" +"TORPEDOED AMERICAN. i 1-1","1915-06-05","http://newspapers.library.wales/view/4092431/4092438/135/","German+Submarine" +"ISUNK THE ARABIC.","1915-09-04","http://newspapers.library.wales/view/4092548/4092552/58/","German+Submarine" +"DISMISSED THE SERVICE.","1915-09-11","http://newspapers.library.wales/view/4092557/4092562/80/","German+Submarine" +"SWANSEA TRADER.","1915-10-09","http://newspapers.library.wales/view/4092593/4092597/80/","German+Submarine" +"CREW DECLINED WINE.!","1915-04-03","http://newspapers.library.wales/view/4092359/4092361/30/","German+Submarine" +"CAPTAIN, OFFICERS AND .CREW HONOURED.","1915-04-17","http://newspapers.library.wales/view/4092377/4092384/110/","German+Submarine" +"THEWAR I - - - .","1915-06-08","http://newspapers.library.wales/view/4099372/4099373/29/","German+Submarine" +"THEWAR i","1915-06-09","http://newspapers.library.wales/view/4099379/4099380/36/","German+Submarine" +"- '-"e;"e;, .-. __"e;.__n__-_,-'-___C"e;:;: I SUBMARINE CONE. i .I","1915-03-03","http://newspapers.library.wales/view/4098678/4098681/31/","German+Submarine" +"[No title]","1916-02-01","http://newspapers.library.wales/view/4100923/4100929/108/","German+Submarine" +"CHASES BY QERHAM SIWRINLI","1915-02-08","http://newspapers.library.wales/view/4098516/4098522/86/","German+Submarine" +"THEWAR"e;","1915-09-13","http://newspapers.library.wales/view/4099997/4099998/27/","German+Submarine" +"I WHITE STAR LINER. I","1916-05-09","http://newspapers.library.wales/view/4101500/4101501/4/","German+Submarine" +"I VICTIM OF PIRATES.","1915-05-29","http://newspapers.library.wales/view/4099308/4099314/114/","German+Submarine" +"ATTACK ON SUBMARINEj","1915-10-05","http://newspapers.library.wales/view/4100134/4100135/4/","German+Submarine" +"JUTLAND BATTLE !","1917-01-03","http://newspapers.library.wales/view/4102846/4102847/30/","German+Submarine" +"JUTLAND BATTLE","1917-01-04","http://newspapers.library.wales/view/4102853/4102856/70/","German+Submarine" +"BRITONFERRY ENGINEER. I","1918-08-03","http://newspapers.library.wales/view/4115932/4115936/97/","German+Submarine" +"-OUR HUGE EFFORT.I","1917-07-28","http://newspapers.library.wales/view/4103798/4103799/23/","German+Submarine" +"THE REWA.","1918-01-16","http://newspapers.library.wales/view/4104535/4104536/33/","German+Submarine" +"SHELLED BY U-BOAT,","1918-07-23","http://newspapers.library.wales/view/4105339/4105340/7/","German+Submarine" +"j'FERRYENGINEER.1 Ii ! 'FERRY ENGINEER. 1: , -__.-_._-_-","1918-07-27","http://newspapers.library.wales/view/4105359/4105362/56/","German+Submarine" +"UNDERSEA WAR I . } c:r - . !","1918-08-21","http://newspapers.library.wales/view/4105463/4105466/45/","German+Submarine" +"I NAVY WHICH WINS! i","1918-06-26","http://newspapers.library.wales/view/4105220/4105221/14/","German+Submarine" +"HOSPITL SHIP ER!MEI _","1918-07-03","http://newspapers.library.wales/view/4105250/4105251/4/","German+Submarine" +"IONLY -12 -SHIPS LOST","1917-11-08","http://newspapers.library.wales/view/4104242/4104244/42/","German+Submarine" +"! MYSTERY MAN.","1918-05-29","http://newspapers.library.wales/view/4105100/4105103/45/","German+Submarine" +"LABOUR AFTER WAR. I ...","1917-10-16","http://newspapers.library.wales/view/4104140/4104141/11/","German+Submarine" +".I .,J7. FISHING BOATS. t","1918-06-12","http://newspapers.library.wales/view/4105160/4105161/17/","German+Submarine" +"YEAR'S DIARY.J","1915-08-04","http://newspapers.library.wales/view/4099759/4099763/89/","German+Submarine" +"I NORWAY AND U-BOATS I -","1916-10-16","http://newspapers.library.wales/view/4102385/4102386/26/","German+Submarine" +"THE SIREN km THE SUBMARINE","1916-02-16","http://newspapers.library.wales/view/4101022/4101023/20/","German+Submarine" +"TO-DAYS WAR RESUME¡","1916-07-10","http://newspapers.library.wales/view/4101821/4101823/33/","German+Submarine" +"I UNITING GREECE. !","1917-06-21","http://newspapers.library.wales/view/4103632/4103633/5/","German+Submarine" +"U.S. AND SUBMARINES.","1916-10-18","http://newspapers.library.wales/view/4102399/4102402/53/","German+Submarine" +"'-' ' ' "e; "e;' NEUTRALS IN EUROPE. n»","1917-02-05","http://newspapers.library.wales/view/4103032/4103037/94/","German+Submarine" +"FISHERMEN'S FIND. --","1915-03-23","http://newspapers.library.wales/view/4098825/4098826/17/","German+Submarine" +"SUBMARINE RAID.","1916-07-12","http://newspapers.library.wales/view/4101835/4101836/3/","German+Submarine" +"WAR RESUMEI","1916-07-12","http://newspapers.library.wales/view/4101835/4101836/38/","German+Submarine" +"H Bt f**' ? F ?& F? THEWAR I","1915-11-11","http://newspapers.library.wales/view/4100380/4100381/25/","German+Submarine" +"SWANSEA TRADER.","1915-07-05","http://newspapers.library.wales/view/4099557/4099558/11/","German+Submarine" +"U-BA-AT VICTIMS","1917-06-29","http://newspapers.library.wales/view/4103671/4103675/71/","German+Submarine" +"-"e;AN UNHAPPY ACCIDENT."e;I","1915-08-24","http://newspapers.library.wales/view/4099878/4099879/33/","German+Submarine" +"I U -BOAT --AS -CRUISER. I","1916-11-28","http://newspapers.library.wales/view/4102646/4102647/32/","German+Submarine" +"SPAIN'S STROMG NOTE.","1917-04-25","http://newspapers.library.wales/view/4103387/4103388/21/","German+Submarine" +",-,u,-,--,-I SPANISH STEAMER SUM i ',-,","1916-04-11","http://newspapers.library.wales/view/4101357/4101358/4/","German+Submarine" +"- - - - V.C.'s DYiNG MESSAGE.","1918-01-24","http://newspapers.library.wales/view/4104570/4104571/6/","German+Submarine" +"i BRISTOL CHANNEL SPIES.","1918-03-12","http://newspapers.library.wales/view/4104778/4104779/40/","German+Submarine" +":.CARPATHIA LOST","1918-07-20","http://newspapers.library.wales/view/4105329/4105330/15/","German+Submarine" +"TO-DAY'S NEWS IN BRIEF","1917-11-22","http://newspapers.library.wales/view/4104302/4104303/25/","German+Submarine" +"THE BRITANNIC.","1916-11-25","http://newspapers.library.wales/view/4102632/4102633/5/","German+Submarine" +"C-30AT AT .NEW YORK","1917-10-20","http://newspapers.library.wales/view/4104160/4104161/6/","German+Submarine" +"BRITISH PLUCK REWARDED.I","1915-04-10","http://newspapers.library.wales/view/4098954/4098955/29/","German+Submarine" +"THEWAR","1915-07-26","http://newspapers.library.wales/view/4099697/4099698/26/","German+Submarine" +"TO-DAYS WAR RESUME I .. : .","1916-11-06","http://newspapers.library.wales/view/4102511/4102512/44/","German+Submarine" +"U-BOAT MURDERS. I ———O:","1917-08-06","http://newspapers.library.wales/view/4103833/4103834/10/","German+Submarine" +"| VESSEL TORPEDOED.I !___.___","1915-04-12","http://newspapers.library.wales/view/4098963/4098964/8/","German+Submarine" +";MANY SHIPS SUNK ( - - .. I","1915-12-02","http://newspapers.library.wales/view/4100522/4100523/4/","German+Submarine" +"SEIZED ON BRUSSELS. -","1916-10-03","http://newspapers.library.wales/view/4102308/4102312/101/","German+Submarine" +"LATEST SUBMARINE VICTIMS","1915-06-16","http://newspapers.library.wales/view/4099427/4099430/41/","German+Submarine" +"TORPEDOED SHIP SALVED","1915-06-18","http://newspapers.library.wales/view/4099441/4099449/118/","German+Submarine" +"NEUTRALS SUNK.","1916-10-25","http://newspapers.library.wales/view/4102441/4102442/15/","German+Submarine" +"THEWAR I","1915-12-03","http://newspapers.library.wales/view/4100529/4100530/30/","German+Submarine" +"-THE POLITE PIRATEI ——-8———","1915-07-30","http://newspapers.library.wales/view/4099727/4099730/59/","German+Submarine" +"| TO-DAYS WAR RESUME","1917-08-14","http://newspapers.library.wales/view/4103868/4103869/38/","German+Submarine" +"DAMAGE TO THE WAYFARER.I","1915-04-15","http://newspapers.library.wales/view/4098990/4098998/114/","German+Submarine" +"I VICTIMS OF FALABA OUTRAGE. I","1915-04-16","http://newspapers.library.wales/view/4098999/4099000/26/","German+Submarine" +"TO-DAYS WAR RESUME","1916-10-12","http://newspapers.library.wales/view/4102364/4102365/31/","German+Submarine" +"HOLLWEG'S FALL,1 —' 1 ■ 1 ' ■I","1917-07-17","http://newspapers.library.wales/view/4103748/4103749/5/","German+Submarine" +"Advertising","1915-07-16","http://newspapers.library.wales/view/4099635/4099636/33/","German+Submarine" +"OILING THE U BOATS","1915-11-23","http://newspapers.library.wales/view/4100458/4100465/129/","German+Submarine" +"- - - - - - - - - - THE WAR","1915-06-11","http://newspapers.library.wales/view/4099395/4099396/27/","German+Submarine" +"U BOAT'S HASTY RETREAT I","1916-02-02","http://newspapers.library.wales/view/4100932/4100933/12/","German+Submarine" +"THE WAR |","1915-06-15","http://newspapers.library.wales/view/4099418/4099419/29/","German+Submarine" +"I NEW GREEK CABINET'","1916-10-09","http://newspapers.library.wales/view/4102343/4102348/96/","German+Submarine" +"[ U-BOAT BRUTALITY. i I I","1917-01-25","http://newspapers.library.wales/view/4102971/4102974/69/","German+Submarine" +""e; NEXT TIME "e; SAYS THE PIRATE.!","1915-06-23","http://newspapers.library.wales/view/4099473/4099479/93/","German+Submarine" +"ITRANSPCRT SHELLED___/","1915-11-11","http://newspapers.library.wales/view/4100380/4100381/14/","German+Submarine" +"BORE SHIPS SUNK","1916-03-01","http://newspapers.library.wales/view/4101110/4101111/3/","German+Submarine" +"NEBRASKAN REACHES PORT. I","1915-05-28","http://newspapers.library.wales/view/4099299/4099307/151/","German+Submarine" +"! PIRATES' VICTIMS.","1915-03-20","http://newspapers.library.wales/view/4114508/4114515/84/","German+Submarine" +".FIFTY LIVES LOST. j","1916-04-08","http://newspapers.library.wales/view/4115142/4115143/11/","German+Submarine" +"I THE NAVAL FLIGHT. I","1916-08-22","http://newspapers.library.wales/view/4102072/4102073/14/","German+Submarine" +"[No title]","1916-08-24","http://newspapers.library.wales/view/4102084/4102089/86/","German+Submarine" +"RUTHLESS MEASURES ADVOCATED. I","1915-02-05","http://newspapers.library.wales/view/4098488/4098490/7/","German+Submarine" +"SAVED BY INCHES.I I","1915-02-05","http://newspapers.library.wales/view/4098488/4098490/31/","German+Submarine" +"PIRATE'S WAR ON A TRAWLERS. I","1915-05-20","http://newspapers.library.wales/view/4099244/4099250/89/","German+Submarine" +"NEWS IN BRIEF","1915-04-13","http://newspapers.library.wales/view/4098972/4098977/53/","German+Submarine" +"BLAENAU FESTZmcm.","1915-04-09","http://newspapers.library.wales/view/3412746/3412753/82/","German+Submarine" +"TRANSIT SHElLED I","1915-11-13","http://newspapers.library.wales/view/4114934/4114939/101/","German+Submarine" +"LATEST WAR NEWS I","1915-08-28","http://newspapers.library.wales/view/4114807/4114814/126/","German+Submarine" +"z -_-- :,==:-,=-= I CLAUDE AND ALICE ASKEW.!","1917-10-20","http://newspapers.library.wales/view/4115734/4115735/31/","German+Submarine" +"I £2(0 PRIZE Fgq SWANSEA TRADER"e;SU''REW !","1915-10-09","http://newspapers.library.wales/view/4114879/4114884/85/","German+Submarine" +"I WELSH WHIP AND THE "e; U "e; BOATS.","1917-02-10","http://newspapers.library.wales/view/4110354/4110356/17/","German+Submarine" +"NEUTRAL VESSELS SUNK.","1916-10-21","http://newspapers.library.wales/view/4115348/4115349/10/","German+Submarine" +"PIRATE'S WAR ON TRAWLERS. I","1915-05-22","http://newspapers.library.wales/view/4114625/4114632/111/","German+Submarine" +"toss OF Ult, ADMITTEDI. I","1914-11-28","http://newspapers.library.wales/view/4114296/4114303/113/","German+Submarine" +"LATEST WAR NEWSI <","1915-08-21","http://newspapers.library.wales/view/4114794/4114801/109/","German+Submarine" +"TIDE OF PATRIOTISM. I","1917-04-07","http://newspapers.library.wales/view/4115538/4115539/16/","German+Submarine" +"! SCENE IN COUNTY COURT.","1915-06-26","http://newspapers.library.wales/view/4114690/4114695/78/","German+Submarine" +"BRiTISH LINER SUNK.","1917-02-10","http://newspapers.library.wales/view/4115482/4115483/9/","German+Submarine" +"IMPRISONED OFFICERS.","1915-05-01","http://newspapers.library.wales/view/3611553/3611556/36/","German+Submarine" +"SINKING OF AMERICAN SHIPS.","1915-05-08","http://newspapers.library.wales/view/3611562/3611565/30/","German+Submarine" +"BRITISH CRUISER SUNK.","1914-11-07","http://newspapers.library.wales/view/3611327/3611329/5/","German+Submarine" +", VON MACKENSEN CHECK-: D. I--","1915-07-31","http://newspapers.library.wales/view/3611670/3611672/25/","German+Submarine" +"Latest War News. -","1918-07-06","http://newspapers.library.wales/view/3612682/3612685/35/","German+Submarine" +"BARRY SAILORS TERRIBLE ORDEAL. i","1917-04-20","http://newspapers.library.wales/view/4130531/4130538/42/","German+Submarine" +"TORPEDOED CREW IN OPEN BOATSV","1917-05-11","http://newspapers.library.wales/view/4130558/4130563/39/","German+Submarine" +"IA CHARMED UFE.--I","1918-04-20","http://newspapers.library.wales/view/4110664/4110666/48/","German+Submarine" +"NTAVAL I","1916-12-02","http://newspapers.library.wales/view/4093047/4093052/86/","German+Submarine" +"[No title]","1916-07-15","http://newspapers.library.wales/view/4092907/4092908/7/","German+Submarine" +"Moored Memories.","1915-07-02","http://newspapers.library.wales/view/3678735/3678743/90/","German+Submarine" +"/MANY SHIPS SUNK","1915-12-04","http://newspapers.library.wales/view/4114967/4114972/98/","German+Submarine" +"STEAMER SVNK BY SUBMARINE.I","1915-06-05","http://newspapers.library.wales/view/4114651/4114661/172/","German+Submarine" +"FOUR DAYS IN OPEN BOAT.","1917-03-24","http://newspapers.library.wales/view/4115524/4115527/87/","German+Submarine" +"- DEONIAETH ARFON.","1917-06-01","http://newspapers.library.wales/view/3688742/3688744/9/","German+Submarine" +"BRECON MAN'S STARTLINGj STORY.","1915-05-27","http://newspapers.library.wales/view/3857650/3857654/33/","German+Submarine" +"I LIFE ON A U BOAT.","1916-06-10","http://newspapers.library.wales/view/3978507/3978512/64/","German+Submarine" +"TEN BRITISH SUBMARINES ALREADY CROSSED ATLANTIC. I","1916-07-15","http://newspapers.library.wales/view/3978552/3978560/93/","German+Submarine" +"LOCAL COMPENSATION AWARD, i","1916-03-22","http://newspapers.library.wales/view/4118727/4118730/19/","German+Submarine" +"GERMAN NOTE TO U.S.',","1915-07-14","http://newspapers.library.wales/view/4118547/4118551/58/","German+Submarine" +"- - .-.-.- - - - - - Sad Spectacle at Milford.","1917-03-28","http://newspapers.library.wales/view/4118992/4118995/35/","German+Submarine" +"I THE ESCAPE OF THE ASTURIAS. I","1915-02-10","http://newspapers.library.wales/view/4118437/4118441/45/","German+Submarine" +"GERMAN WAR ON SHIPPING,","1915-02-03","http://newspapers.library.wales/view/4118432/4118436/41/","German+Submarine" +"IRISH SEA RAID.I","1915-02-03","http://newspapers.library.wales/view/4118432/4118436/42/","German+Submarine" +"DUTCH STEAMER SUNK. j","1915-04-23","http://newspapers.library.wales/view/4121245/4121247/18/","German+Submarine" +""e;THE INHUMAN DOGS."e;","1915-04-23","http://newspapers.library.wales/view/4121245/4121248/33/","German+Submarine" +"CONTRAST IN SEA WARFARE METHODS I","1917-04-06","http://newspapers.library.wales/view/4122163/4122166/29/","German+Submarine" +""e;A MALEDICTION."e;","1915-04-01","http://newspapers.library.wales/view/4242925/4242928/26/","German+Submarine" +"i POOR RESULTS ACHIEVED BY GERMAN ,BLOCKADE.","1915-05-28","http://newspapers.library.wales/view/4121290/4121295/62/","German+Submarine" +"■ - - "e; I. i. r"e;"e;T i...'.I I BAOGE FOR TORPfcDOfiD SEAMEN.","1918-05-24","http://newspapers.library.wales/view/4124651/4124653/14/","German+Submarine" +"TORPEDO-BOATS SUNK-","1915-06-18","http://newspapers.library.wales/view/4121317/4121323/80/","German+Submarine" +"FIRST OF GERMANY'S SUBMARINE"e;I CRUISERS LOST.","1918-05-31","http://newspapers.library.wales/view/4124660/4124667/80/","German+Submarine" +"STEAMER'S ATTACK ON U BOAT.I","1915-10-08","http://newspapers.library.wales/view/4121461/4121467/70/","German+Submarine" +"IWHEN SUBMARINES MEET. - ---","1918-08-30","http://newspapers.library.wales/view/4124780/4124783/14/","German+Submarine" +"ISKIPPER COURT-MARTIALLED. I","1915-09-10","http://newspapers.library.wales/view/4121425/4121428/44/","German+Submarine" +"BELGIAN STEAMER AMONG GERMAN SUBMARINES' VICTIMS.","1915-07-09","http://newspapers.library.wales/view/4121344/4121350/70/","German+Submarine" +"ILOST GERMAN SUBMARINES.I Is","1915-10-08","http://newspapers.library.wales/view/4121461/4121463/6/","German+Submarine" +"TY'NYGONGL. I","1917-12-14","http://newspapers.library.wales/view/4244106/4244113/84/","German+Submarine" +"MONEY SPENT ON SUBMARINES.","1915-07-16","http://newspapers.library.wales/view/4121353/4121360/98/","German+Submarine" +"Advertising","1915-03-02","http://newspapers.library.wales/view/4008620/4008621/4/","German+Submarine" +".British Liner Captured by GermanI Submarine.","1916-02-01","http://newspapers.library.wales/view/4009052/4009058/24/","German+Submarine" +"The New Menace.","1915-02-04","http://newspapers.library.wales/view/3755275/3755279/31/","German+Submarine" +"THE HUNS AGAIN.","1915-04-01","http://newspapers.library.wales/view/3755347/3755351/26/","German+Submarine" +"jTHE IRISH RISING","1916-04-28","http://newspapers.library.wales/view/4242015/4242020/27/","German+Submarine" +"[No title]","1917-03-16","http://newspapers.library.wales/view/4241493/4241500/52/","German+Submarine" +"[No title]","1916-07-14","http://newspapers.library.wales/view/4242114/4242122/64/","German+Submarine" +"i ANOTHER GERMAN CRIME. I","1916-03-03","http://newspapers.library.wales/view/4121650/4121653/41/","German+Submarine" +"- _ - -Food Economy No. 2. -I","1917-05-12","http://newspapers.library.wales/view/4123396/4123397/13/","German+Submarine" +"I - - NEVIN.","1917-06-01","http://newspapers.library.wales/view/4243882/4243888/79/","German+Submarine" +"< '., w.","1915-03-13","http://newspapers.library.wales/view/4122971/4122975/40/","German+Submarine" +"CRUISER SQUADRONI ATTACKED BY GERMANS.","1914-08-15","http://newspapers.library.wales/view/4614232/4614237/38/","German+Submarine" +"IFIRST *NEUTRAL VICTIM.","1915-02-26","http://newspapers.library.wales/view/4121173/4121179/81/","German+Submarine" +"I REWARDS FOR BRAVERY. ——0-","1915-03-12","http://newspapers.library.wales/view/4121191/4121197/64/","German+Submarine" +"The War.","1916-06-10","http://newspapers.library.wales/view/3580148/3580155/69/","German+Submarine" +"I AUSTRIA'S PLIGH-T. 11","1914-12-05","http://newspapers.library.wales/view/4092242/4092246/22/","German+Submarine" +"LINER'S ESCAPEi i-.00.1","1915-02-12","http://newspapers.library.wales/view/4098548/4098549/14/","German+Submarine" +"NAVAL NEWS.","1914-10-21","http://newspapers.library.wales/view/4097681/4097682/7/","German+Submarine" +"FOUR VESSELS SUNK. I","1915-02-06","http://newspapers.library.wales/view/4114430/4114441/176/","German+Submarine" +"PIRATES RESUME OPERATIONS.","1915-07-28","http://newspapers.library.wales/view/4099711/4099714/43/","German+Submarine" +"- - - - - PIRATES DROWNEDI","1915-03-11","http://newspapers.library.wales/view/4098737/4098738/16/","German+Submarine" +"U. RAIDERS","1916-10-09","http://newspapers.library.wales/view/4102343/4102344/21/","German+Submarine" +"ITHREE TORPEDOES j","1915-04-05","http://newspapers.library.wales/view/4098915/4098916/22/","German+Submarine" +"TORPEDOED CREW AT BARRY.","1915-04-02","http://newspapers.library.wales/view/4130036/4130041/24/","German+Submarine" +"Haverfordwest Lad's Adventure.","1917-07-18","http://newspapers.library.wales/view/4119072/4119073/2/","German+Submarine" +"I SINKING A SUBMARINE.","1915-03-12","http://newspapers.library.wales/view/4121191/4121197/55/","German+Submarine" +"ISHELLED BY SUBMARINE.","1915-04-02","http://newspapers.library.wales/view/4121218/4121224/79/","German+Submarine" +" THE FIGHT OFF L 1/Jt1J . f - LUNOY.-","1916-02-08","http://newspapers.library.wales/view/4100969/4100973/78/","German+Submarine" +"A WEEK OF STEADY ...PROGRESS.,,","1915-09-03","http://newspapers.library.wales/view/4130234/4130239/26/","German+Submarine" +"Progress of the War.","1915-04-09","http://newspapers.library.wales/view/3678627/3678635/86/","German+Submarine" +"Progress of the War.","1915-04-09","http://newspapers.library.wales/view/3678618/3678626/84/","German+Submarine" +"GERMAN SUBMARINE SUNK.","1914-08-13","http://newspapers.library.wales/view/3755050/3755058/80/","German+Submarine" +"I GALE WASHING MINES ASHORE.","1914-11-21","http://newspapers.library.wales/view/4092224/4092227/22/","German+Submarine" +"ITUESDAY.I","1914-11-26","http://newspapers.library.wales/view/4012982/4012983/5/","German+Submarine" +"I< !ARMY OF :35C,000 IREADY.","1915-04-10","http://newspapers.library.wales/view/4092368/4092376/150/","German+Submarine" +"^ ) 1! STORY OF THE LIZZIE - !","1915-04-03","http://newspapers.library.wales/view/4092359/4092367/143/","German+Submarine" +"i WARS WGRST CRIME, IoI","1915-04-03","http://newspapers.library.wales/view/4092359/4092367/155/","German+Submarine" +"TORPEDOED BY SUB-I MARINE.I -","1915-01-30","http://newspapers.library.wales/view/4092287/4092294/113/","German+Submarine" +"LEYLAND LINER SUNK --;¡,. - -","1915-07-03","http://newspapers.library.wales/view/4092467/4092475/162/","German+Submarine" +"TO BE WARNED flRSTI ON","1915-09-04","http://newspapers.library.wales/view/4092548/4092555/126/","German+Submarine" +"NAVAL -","1915-11-13","http://newspapers.library.wales/view/4092638/4092646/164/","German+Submarine" +"I WITHOUT WARNING. j","1915-06-09","http://newspapers.library.wales/view/4099379/4099380/26/","German+Submarine" +"THE SCROLL OF FAME","1917-05-05","http://newspapers.library.wales/view/4103432/4103435/62/","German+Submarine" +"FIVE SHIPS SUNK.","1915-06-14","http://newspapers.library.wales/view/4099411/4099416/91/","German+Submarine" +"I ALLEGED SPY CHARGED I","1915-05-18","http://newspapers.library.wales/view/4099228/4099234/115/","German+Submarine" +"iMEWS IN BRIEFI","1915-09-14","http://newspapers.library.wales/view/4100004/4100009/85/","German+Submarine" +"TOLL OF THE PIRATE. i —— I","1915-05-31","http://newspapers.library.wales/view/4099317/4099318/16/","German+Submarine" +"THE SMALLEST M.P. j","1916-12-22","http://newspapers.library.wales/view/4102795/4102798/69/","German+Submarine" +"-LOST LINER --! !","1918-07-26","http://newspapers.library.wales/view/4105354/4105357/49/","German+Submarine" +"- ¡GERMAN NAVY.","1918-11-18","http://newspapers.library.wales/view/4105849/4105850/14/","German+Submarine" +"FOUR DAYS lii OPEN BOAT","1917-03-20","http://newspapers.library.wales/view/4103237/4103238/16/","German+Submarine" +"ITO PUNISH PIRACY.i","1917-03-21","http://newspapers.library.wales/view/4103242/4103243/9/","German+Submarine" +"NEWS IN BRIEFi","1915-04-26","http://newspapers.library.wales/view/4099063/4099066/40/","German+Submarine" +"r ESCAPE OF U 53 J","1916-10-17","http://newspapers.library.wales/view/4102392/4102393/14/","German+Submarine" +"NOT SUNK. ) I","1915-03-20","http://newspapers.library.wales/view/4098809/4098810/4/","German+Submarine" +"IWILSON WAITS","1917-02-03","http://newspapers.library.wales/view/4103025/4103026/4/","German+Submarine" +"I U-BOATS TO AMERICA.","1916-07-12","http://newspapers.library.wales/view/4101835/4101836/9/","German+Submarine" +"ISSL MPiERS PAPERS","1916-02-21","http://newspapers.library.wales/view/4101052/4101057/107/","German+Submarine" +"DOCTORS CAllED UP","1917-04-21","http://newspapers.library.wales/view/4103372/4103373/12/","German+Submarine" +"U BOAT SUNK BYI AVIATOR I","1915-08-27","http://newspapers.library.wales/view/4099899/4099900/9/","German+Submarine" +"THE 9d. LOAF.","1917-07-26","http://newspapers.library.wales/view/4103788/4103789/20/","German+Submarine" +"NAVAL ACTION ?","1915-04-10","http://newspapers.library.wales/view/4098954/4098961/105/","German+Submarine" +"Advertising","1915-07-26","http://newspapers.library.wales/view/4099697/4099698/33/","German+Submarine" +"Advertising","1915-06-17","http://newspapers.library.wales/view/4099434/4099435/38/","German+Submarine" +"TO-DAY'S NEWS IN BRIEF I","1917-05-23","http://newspapers.library.wales/view/4103507/4103508/37/","German+Submarine" +"Advertising","1917-05-25","http://newspapers.library.wales/view/4103517/4103520/63/","German+Submarine" +": IMPERIAL PARLIAMENT.! ! --I","1916-07-18","http://newspapers.library.wales/view/4101870/4101873/39/","German+Submarine" +"GERMAN RAID ON TRANSPORTS !","1916-10-28","http://newspapers.library.wales/view/4102462/4102465/56/","German+Submarine" +"POPE AID PEACEI","1917-08-14","http://newspapers.library.wales/view/4103868/4103869/24/","German+Submarine" +"IGALLOUS PIRATESI I - I","1915-04-16","http://newspapers.library.wales/view/4098999/4099000/20/","German+Submarine" +"I _PIRATES' VICTIMS","1915-06-28","http://newspapers.library.wales/view/4099505/4099506/9/","German+Submarine" +"¡ GERMAN -U-BOATS.","1917-02-17","http://newspapers.library.wales/view/4103101/4103102/43/","German+Submarine" +"THE U-BOAT CAMPAICN. ._-._-I","1916-10-30","http://newspapers.library.wales/view/4102469/4102470/18/","German+Submarine" +"NORTH SEA FIGHT !","1916-07-24","http://newspapers.library.wales/view/4101905/4101906/14/","German+Submarine" +"Advertising","1915-06-24","http://newspapers.library.wales/view/4099480/4099481/34/","German+Submarine" +"GERMANY'S PLEDGE.I","1917-07-14","http://newspapers.library.wales/view/4103738/4103739/8/","German+Submarine" +"AIR RAID RESULTS.","1915-03-27","http://newspapers.library.wales/view/4114521/4114528/99/","German+Submarine" +"GERMAN DREADNOUGHT TORPEDOED.","1916-08-23","http://newspapers.library.wales/view/4102079/4102082/60/","German+Submarine" +"I 20 BIG SHiPS-I","1917-09-06","http://newspapers.library.wales/view/4103968/4103969/8/","German+Submarine" +"NEW QUAY.","1917-05-04","http://newspapers.library.wales/view/3413735/3413739/38/","German+Submarine" +"AMAZING PLOT. 1","1916-04-28","http://newspapers.library.wales/view/3413241/3413244/29/","German+Submarine" +"'ABERDOVEY.","1917-05-11","http://newspapers.library.wales/view/3413744/3413749/52/","German+Submarine" +"J PWLLHELIT","1917-08-10","http://newspapers.library.wales/view/3413861/3413868/96/","German+Submarine" +"I ON THE SCREEN.","1914-12-04","http://newspapers.library.wales/view/4097982/4097988/85/","German+Submarine" +"VOICES OF THE WORLD.","1915-05-11","http://newspapers.library.wales/view/4099174/4099175/32/","German+Submarine" +"HOW U-BOATS ARE SUNK ,","1917-12-04","http://newspapers.library.wales/view/4104354/4104357/55/","German+Submarine" +"DASH FOR LIBERTY.J","1915-04-21","http://newspapers.library.wales/view/4099029/4099032/50/","German+Submarine" +"THE BRITISH NAVY.","1918-05-03","http://newspapers.library.wales/view/3414212/3414217/60/","German+Submarine" +"THE WAR DAY BY JAY. -;","1917-09-28","http://newspapers.library.wales/view/3413924/3413932/108/","German+Submarine" +"ONLY TEN SAVED","1916-04-14","http://newspapers.library.wales/view/3413223/3413230/97/","German+Submarine" +"[No title]","1917-08-11","http://newspapers.library.wales/view/4115664/4115668/110/","German+Submarine" +"I FIGHTING THE "e; U"e;I IBOATS. .","1917-02-03","http://newspapers.library.wales/view/4110347/4110349/21/","German+Submarine" +"BOMBS FROM PATROL IBOATS.r I","1917-02-17","http://newspapers.library.wales/view/4110361/4110366/103/","German+Submarine" +"I ALLEGED SPY CHARGED. I","1915-05-22","http://newspapers.library.wales/view/4114625/4114636/206/","German+Submarine" +"IMRS. GRUNDY'S JOTTINGS","1916-05-19","http://newspapers.library.wales/view/4168936/4168941/27/","German+Submarine" +"I THE SUBMARINE MENACE.","1917-05-04","http://newspapers.library.wales/view/4130549/4130554/19/","German+Submarine" +"I.,THE . WAR.I","1914-10-23","http://newspapers.library.wales/view/4128759/4128763/30/","German+Submarine" +"I RE-UNITED, AFTER LONGI' YEARS!","1916-05-26","http://newspapers.library.wales/view/4168945/4168952/49/","German+Submarine" +"I REVIEW OF PUBLICATIONS.","1916-07-28","http://newspapers.library.wales/view/4169026/4169028/9/","German+Submarine" +"! ONLY EIGHTEEN HOURS OUT i OF BARRY.","1917-10-26","http://newspapers.library.wales/view/4130774/4130781/45/","German+Submarine" +"—' r - ■ L. ' 1 • *'. WAS ON THE ASTURIAS.","1917-04-07","http://newspapers.library.wales/view/4110410/4110413/88/","German+Submarine" +"? ONLY WELSHMAN ON ! CYMRIC. I","1916-05-20","http://newspapers.library.wales/view/4092865/4092868/50/","German+Submarine" +"U U BOAI S DESPATCHES.-","1916-10-14","http://newspapers.library.wales/view/4092998/4093000/32/","German+Submarine" +"WAR JOTTINGS","1916-08-25","http://newspapers.library.wales/view/3690116/3690118/13/","German+Submarine" +"|DARING NAVAL ENCOUNTERS","1914-12-18","http://newspapers.library.wales/view/3678471/3678474/25/","German+Submarine" +"GERMANY RUNS AMOK!","1917-02-03","http://newspapers.library.wales/view/4115475/4115476/24/","German+Submarine" +"Progress of the War.I","1915-04-23","http://newspapers.library.wales/view/3678645/3678653/93/","German+Submarine" +"Special War Telegrams.","1915-01-23","http://newspapers.library.wales/view/3611427/3611432/75/","German+Submarine" +"[No title]","1915-02-18","http://newspapers.library.wales/view/3857524/3857532/102/","German+Submarine" +"1 THE PASSING WEEK I ................","1914-10-23","http://newspapers.library.wales/view/3585110/3585114/29/","German+Submarine" +"The Torpedoed Hospital Ship.","1918-03-06","http://newspapers.library.wales/view/4119237/4119240/24/","German+Submarine" +"Preparation in America.!","1916-04-19","http://newspapers.library.wales/view/4118747/4118751/45/","German+Submarine" +"Do You Know -","1918-05-15","http://newspapers.library.wales/view/4119282/4119285/35/","German+Submarine" +"- - - - - - Liverpool Steamer Torpedoed","1915-03-17","http://newspapers.library.wales/view/4118462/4118465/21/","German+Submarine" +"THE SECOND OUTRAGE.","1915-03-31","http://newspapers.library.wales/view/4118472/4118474/7/","German+Submarine" +"AMLWCH","1918-05-15","http://newspapers.library.wales/view/3457282/3457284/53/","German+Submarine" +"I—————— MILFORD AND CARDIFF TRAWLERS SUNK.","1915-06-09","http://newspapers.library.wales/view/4118522/4118525/25/","German+Submarine" +"A Pathfinder Survivor.","1914-09-23","http://newspapers.library.wales/view/4118342/4118346/40/","German+Submarine" +"J 1'1' f '! PASSING W -l'K I","1915-12-24","http://newspapers.library.wales/view/3585415/3585419/39/","German+Submarine" +"THE GERMAN WAY.I","1915-04-23","http://newspapers.library.wales/view/4121245/4121247/16/","German+Submarine" +"SUNK WITHOUT WARNING.I","1915-04-23","http://newspapers.library.wales/view/4121245/4121251/78/","German+Submarine" +"MORE NEUTRALS SUNK.I","1915-05-07","http://newspapers.library.wales/view/4121263/4121266/20/","German+Submarine" +"V-'■' GERMAN SUBMARINE SUM.! I","1917-04-06","http://newspapers.library.wales/view/4122163/4122166/27/","German+Submarine" +"I HEAVY BRITISH LOSSES.","1915-06-11","http://newspapers.library.wales/view/4243015/4243020/57/","German+Submarine" +"TO-DAY'S NEWS. 'i","1915-06-11","http://newspapers.library.wales/view/4243015/4243020/58/","German+Submarine" +"SUBMARINE PIRATES. .","1915-07-30","http://newspapers.library.wales/view/4121371/4121377/105/","German+Submarine" +"I ICAUGHT IN THE ACT.","1916-11-10","http://newspapers.library.wales/view/4121974/4121980/63/","German+Submarine" +"GREAT LINER TORPEDOED. I","1916-03-31","http://newspapers.library.wales/view/4121686/4121688/3/","German+Submarine" +"AIRMEN AND BOMBS.I","1914-12-18","http://newspapers.library.wales/view/4121083/4121086/22/","German+Submarine" +"IGERMAN RAIDER RAMMED BY PATROL VESSEL.","1914-11-27","http://newspapers.library.wales/view/4121056/4121062/74/","German+Submarine" +"I THE "e;BLOCKADE."e;","1915-06-25","http://newspapers.library.wales/view/4121326/4121332/68/","German+Submarine" +"Advertising","1915-08-24","http://newspapers.library.wales/view/4008845/4008851/24/","German+Submarine" +"[No title]","1917-04-12","http://newspapers.library.wales/view/4013705/4013709/40/","German+Submarine" +"Advertising","1915-09-09","http://newspapers.library.wales/view/4011663/4011669/13/","German+Submarine" +"CWMAMMAN.I","1916-06-08","http://newspapers.library.wales/view/4013395/4013398/23/","German+Submarine" +"Vicar of Rhuddlan's Son at the Front.","1914-11-12","http://newspapers.library.wales/view/3755167/3755175/81/","German+Submarine" +"NEWS IN BRIEF.","1916-12-29","http://newspapers.library.wales/view/4242330/4242335/34/","German+Submarine" +"BRITISH CRUISER SUNK.I","1914-11-06","http://newspapers.library.wales/view/4121029/4121035/80/","German+Submarine" +"CAPTAIN OF THE BRUSSELS j CA.7TAIN OF THr"e;, BRUSSELU(z.I","1916-08-04","http://newspapers.library.wales/view/4121848/4121851/25/","German+Submarine" +"I GARW GLEANINGS.","1917-03-30","http://newspapers.library.wales/view/3886969/3886973/22/","German+Submarine" +"OUTRAGE ON THE SEA. I","1915-05-14","http://newspapers.library.wales/view/4030809/4030811/14/","German+Submarine" +"HOW SUBMARINES AREI BEING SUNii. / ...-I","1917-12-08","http://newspapers.library.wales/view/3979201/3979202/1/","German+Submarine" +"[No title]","1916-08-26","http://newspapers.library.wales/view/3978606/3978611/84/","German+Submarine" +"Hesperian Outrage. I","1915-09-11","http://newspapers.library.wales/view/4614704/4614707/28/","German+Submarine" +"Only Survivor.I","1918-06-29","http://newspapers.library.wales/view/3979458/3979466/71/","German+Submarine" +"STATEMENTS BY OFFICERS OF THE ASTURIAS.","1915-02-19","http://newspapers.library.wales/view/4121164/4121166/3/","German+Submarine" +"I NO HONOURS FOR PIRATES. I","1915-03-12","http://newspapers.library.wales/view/4121191/4121197/54/","German+Submarine" +"PENRHIWCEIBER CIRL'S THRILLINC EXPERIENCES.","1915-09-18","http://newspapers.library.wales/view/3579806/3579811/51/","German+Submarine" +""e;PREFER 3PEN ENMi fVI"e;","1915-04-24","http://newspapers.library.wales/view/4092386/4092388/21/","German+Submarine" +"GLAD TO BE CAPTURED,*","1914-12-05","http://newspapers.library.wales/view/4092242/4092249/71/","German+Submarine" +".. . LINER CHASES T "e;0...-.","1915-07-24","http://newspapers.library.wales/view/4092494/4092497/29/","German+Submarine" +"THREE GO DOWN INj IIRISH SEA.I","1915-02-06","http://newspapers.library.wales/view/4092296/4092299/29/","German+Submarine" +"I ONE BY -ONE","1915-04-03","http://newspapers.library.wales/view/4092359/4092366/127/","German+Submarine" +"- - - - - - -._- - - -_ - - - RUSSIANS NEAR CRACOW j !","1914-11-16","http://newspapers.library.wales/view/4097852/4097853/4/","German+Submarine" +"fi A I WHO SANK r!'}u V-y 5 i' 1 THE MAJESTIC. .—-«».—","1916-02-01","http://newspapers.library.wales/view/4100923/4100927/69/","German+Submarine" +"A NEW CLAIMANT. !","1915-03-06","http://newspapers.library.wales/view/4098705/4098706/7/","German+Submarine" +"ISHELLED BY SUBMARINE i","1915-05-29","http://newspapers.library.wales/view/4099308/4099311/55/","German+Submarine" +"-MMETHWER","1918-07-08","http://newspapers.library.wales/view/4105267/4105268/20/","German+Submarine" +"A FAILURE","1915-08-12","http://newspapers.library.wales/view/4099808/4099812/91/","German+Submarine" +"SEVERAL SHIPS U, 1/1i ð i i.... ù i SUNK. -","1916-03-27","http://newspapers.library.wales/view/4101266/4101267/3/","German+Submarine" +"U-BOAT MENACE I","1917-02-24","http://newspapers.library.wales/view/4103133/4103138/93/","German+Submarine" +"A LOOK AROUNDI I","1915-03-27","http://newspapers.library.wales/view/4098861/4098865/65/","German+Submarine" +"CAPTAINOFTHE"e;UZZlE"e;: CAPTAIN Of THE "e;LIZZIE"e; !","1915-03-29","http://newspapers.library.wales/view/4098870/4098876/106/","German+Submarine" +"U-BOAT BARBARITY - - - - -","1916-11-01","http://newspapers.library.wales/view/4102483/4102486/80/","German+Submarine" +"- - - - - AN ARMED LINER SUNK.","1915-03-13","http://newspapers.library.wales/view/4098755/4098761/91/","German+Submarine" +"GIVlrC THEM A RUN. Io","1915-03-18","http://newspapers.library.wales/view/4098789/4098790/23/","German+Submarine" +"- WAR SUMMARYI","1916-07-15","http://newspapers.library.wales/view/4115242/4115243/15/","German+Submarine" +"IN PARLIAMENT. I .. I","1915-04-28","http://newspapers.library.wales/view/4099081/4099089/151/","German+Submarine" +"NE WS IN BRIEF I","1915-04-30","http://newspapers.library.wales/view/4099097/4099102/47/","German+Submarine" +"RUTHLESS HUNS","1915-02-03","http://newspapers.library.wales/view/4098449/4098464/108/","German+Submarine" +"WAR SUMMARY 1","1916-10-14","http://newspapers.library.wales/view/4115339/4115340/19/","German+Submarine" +"IN PARLIAMENT","1917-05-12","http://newspapers.library.wales/view/4115573/4115574/24/","German+Submarine" +"--------LUSITAMA TORPEDOED,","1915-05-15","http://newspapers.library.wales/view/3611571/3611573/2/","German+Submarine" +"ANOTHER LINER TORPEDOED. -.","1915-09-11","http://newspapers.library.wales/view/3611716/3611718/7/","German+Submarine" +"I UPS GRUNDY'S JOTTINGS. I","1915-07-09","http://newspapers.library.wales/view/4130162/4130167/24/","German+Submarine" +"IALLIES9 GREAT PROGRESS.","1915-03-12","http://newspapers.library.wales/view/4130009/4130014/27/","German+Submarine" +"RHYDLEWIS M'S EXCITING EXPERIENCE","1915-07-23","http://newspapers.library.wales/view/3678762/3678765/29/","German+Submarine" +"THE WAR.","1916-10-13","http://newspapers.library.wales/view/3690175/3690183/82/","German+Submarine" +"TI-IE WAR.","1914-10-29","http://newspapers.library.wales/view/3857400/3857403/25/","German+Submarine" +"By the Way.","1915-02-05","http://newspapers.library.wales/view/3585185/3585188/29/","German+Submarine" +"Germans Routed.","1914-08-12","http://newspapers.library.wales/view/4118312/4118316/51/","German+Submarine" +"SUNK BY GERMAN j SUBMARINE. ' __i","1915-05-12","http://newspapers.library.wales/view/4118502/4118506/44/","German+Submarine" +"HOW THE VESSELS IV, ERE SUNK.","1915-02-03","http://newspapers.library.wales/view/4118432/4118436/43/","German+Submarine" +"V.C.'S EIGHT WOUNDS.","1915-04-16","http://newspapers.library.wales/view/4121236/4121242/85/","German+Submarine" +"I I THE "e;BLOCKADE."e;","1915-05-07","http://newspapers.library.wales/view/4121263/4121266/19/","German+Submarine" +"War and Politics. j","1915-08-26","http://newspapers.library.wales/view/4093797/4093799/5/","German+Submarine" +"J-IOLYHEAO MAIL BOATI .CHASED.","1915-02-05","http://newspapers.library.wales/view/4242853/4242860/87/","German+Submarine" +"DIARY QF THE WAR. I","1915-01-07","http://newspapers.library.wales/view/4093500/4093502/15/","German+Submarine" +"DIARY OF THE WAR.","1915-01-21","http://newspapers.library.wales/view/4093518/4093525/115/","German+Submarine" +"WHITE STAR LINER CRRASID BY SUBMARINE,","1915-06-04","http://newspapers.library.wales/view/4121299/4121302/24/","German+Submarine" +"OUTWARD BOUND VESSEL ATTACKED.","1915-09-10","http://newspapers.library.wales/view/4121425/4121431/73/","German+Submarine" +"DIARY OF THE WAR.1","1915-01-14","http://newspapers.library.wales/view/4093509/4093511/14/","German+Submarine" +"APPAM SAFE. I","1916-02-04","http://newspapers.library.wales/view/4121614/4121619/69/","German+Submarine" +"Expected Has HappenedI","1915-01-14","http://newspapers.library.wales/view/4013045/4013046/8/","German+Submarine" +"[No title]","1916-01-28","http://newspapers.library.wales/view/3689868/3689869/3/","German+Submarine" +"MYSTERY OF THE U-BOAT SINKING","1916-01-05","http://newspapers.library.wales/view/4100744/4100750/117/","German+Submarine" +"NAVAL NEWS.","1914-10-16","http://newspapers.library.wales/view/4097653/4097658/71/","German+Submarine" +"CAPTAINOFTHE"e;UZZlE"e;: CAPTAIN Of THE "e;LIZZIE"e; !","1915-03-29","http://newspapers.library.wales/view/4098870/4098876/104/","German+Submarine" +" bi?K LvhKYlH?b.'*","1915-04-03","http://newspapers.library.wales/view/4098906/4098907/11/","German+Submarine" +"THE JOLLY ,ROCER."e;","1915-02-18","http://newspapers.library.wales/view/4098587/4098590/46/","German+Submarine" +"FOUR VESSELS SUNK.","1915-02-01","http://newspapers.library.wales/view/4098405/4098424/109/","German+Submarine" +"THE PASSING WEEK","1915-08-13","http://newspapers.library.wales/view/3585320/3585324/37/","German+Submarine" +"THE PASSING WEEK ! D..LL1)'.l/.A,fDL","1916-06-16","http://newspapers.library.wales/view/3585540/3585544/35/","German+Submarine" +"rrll PASSING WEEKI","1915-09-03","http://newspapers.library.wales/view/3585335/3585339/40/","German+Submarine" +"- - - - I --MAESTEG.I","1917-04-20","http://newspapers.library.wales/view/3886984/3886988/35/","German+Submarine" +"SUBMARINES OFF LANCASHIRE.","1915-02-05","http://newspapers.library.wales/view/4121146/4121152/71/","German+Submarine" +"In Lighter Vein.","1915-08-05","http://newspapers.library.wales/view/3755509/3755511/8/","German+Submarine" +"IThe Kaiser's Mistake.","1915-08-12","http://newspapers.library.wales/view/3755518/3755520/10/","German+Submarine" +"Ymgom yr Adar Duon ar - Graig yr Adar.","1918-09-12","http://newspapers.library.wales/view/4021248/4021254/32/","German+Submarine" +"Awr ym Mharc Aberdar.I","1915-06-10","http://newspapers.library.wales/view/4019718/4019723/25/","German+Submarine" +"[No title]","1915-05-29","http://newspapers.library.wales/view/3978021/3978028/90/","German+Submarine" +"Welsh Whip on the War.","1917-02-08","http://newspapers.library.wales/view/4013642/4013648/63/","German+Submarine" +"BATTLESHIP GONE.i","1915-07-10","http://newspapers.library.wales/view/4092476/4092479/27/","German+Submarine" +"HEROES OF 113. 1 n&M??? ?jBr &t?. tt -0I","1915-09-04","http://newspapers.library.wales/view/4092548/4092550/16/","German+Submarine" +"ITHE HESPERIAN.","1915-09-11","http://newspapers.library.wales/view/4092557/4092560/63/","German+Submarine" +"GERMAN PAPER IBLOCKADE.","1915-02-13","http://newspapers.library.wales/view/4092305/4092309/47/","German+Submarine" +"FATE OF THE I ' LUSITANtA.","1915-06-19","http://newspapers.library.wales/view/4092449/4092455/82/","German+Submarine" +"IGERMANS' PLAN. I","1914-09-25","http://newspapers.library.wales/view/4242682/4242688/82/","German+Submarine" +"Advertising","1914-09-10","http://newspapers.library.wales/view/4097118/4097119/7/","German+Submarine" +"PIRATES ABROAD I I -","1915-05-04","http://newspapers.library.wales/view/4099122/4099130/157/","German+Submarine" +"PIRATES' DOINGS - 11.^ >","1915-06-07","http://newspapers.library.wales/view/4099365/4099366/15/","German+Submarine" +"IN HALF-A-MINUTE -,a.","1915-06-08","http://newspapers.library.wales/view/4099372/4099373/25/","German+Submarine" +"FATE OF 1)21.","1915-03-04","http://newspapers.library.wales/view/4098687/4098688/3/","German+Submarine" +"THE PIRATES.","1915-03-04","http://newspapers.library.wales/view/4098687/4098689/45/","German+Submarine" +"TWO MORE","1915-06-11","http://newspapers.library.wales/view/4099395/4099400/90/","German+Submarine" +"AC HIBAB A H El G HTS --0","1915-06-14","http://newspapers.library.wales/view/4099411/4099412/31/","German+Submarine" +"TO-DAY'S HEWS IN BRIEF, i - !","1916-05-08","http://newspapers.library.wales/view/4101495/4101496/25/","German+Submarine" +"ITWICE TORPEDOED","1915-05-20","http://newspapers.library.wales/view/4099244/4099249/79/","German+Submarine" +"I PIRATES AGAIN BUSY..","1915-05-24","http://newspapers.library.wales/view/4099271/4099276/80/","German+Submarine" +"ANOTHER AIR RAID.","1915-02-17","http://newspapers.library.wales/view/4098580/4098581/18/","German+Submarine" +"I NO MERCY.i","1914-12-29","http://newspapers.library.wales/view/4098144/4098149/99/","German+Submarine" +"WAR SUMMARY !","1916-02-05","http://newspapers.library.wales/view/4115055/4115060/97/","German+Submarine" +"| TO-BAY'S NEWS I BRIEF TO-DAY'S NWS IN BRIEF I","1918-08-06","http://newspapers.library.wales/view/4105394/4105395/20/","German+Submarine" +"I.UOSG SINK U-BOAT —-——..———","1917-04-27","http://newspapers.library.wales/view/4103397/4103398/18/","German+Submarine" +"TO-DAY'S NEWS iff BRiEF","1918-03-22","http://newspapers.library.wales/view/4104825/4104826/18/","German+Submarine" +"U-BOAT PERiLI MET. --","1918-02-02","http://newspapers.library.wales/view/4104610/4104611/22/","German+Submarine" +"I PRISONERS OH JJ-BOAT I","1916-11-14","http://newspapers.library.wales/view/4102560/4102561/17/","German+Submarine" +"HOSPITAL SHIPS i THREATENEDI ——j, ..------...I G","1917-02-01","http://newspapers.library.wales/view/4103013/4103014/25/","German+Submarine" +"SUBMARINE DOE ??L","1915-07-05","http://newspapers.library.wales/view/4099557/4099558/6/","German+Submarine" +"- - - - [ WEEK'S LOSSES","1917-06-28","http://newspapers.library.wales/view/4103664/4103667/56/","German+Submarine" +"THE EX-PREMIER'S VIEWS. I","1917-02-08","http://newspapers.library.wales/view/4103053/4103057/107/","German+Submarine" +"Advertising","1915-08-28","http://newspapers.library.wales/view/4099906/4099912/95/","German+Submarine" +"I SWEDEN'S VIEW","1917-09-11","http://newspapers.library.wales/view/4103988/4103989/11/","German+Submarine" +"~u. S. NAVY","1917-04-11","http://newspapers.library.wales/view/4103327/4103328/5/","German+Submarine" +"MORE VICTIMS. -0","1915-08-20","http://newspapers.library.wales/view/4099857/4099858/4/","German+Submarine" +"- - - - BOUND FOR SWANSEA I ———-.———","1915-06-01","http://newspapers.library.wales/view/4099324/4099332/159/","German+Submarine" +"[ FOUR YEARS AGO. !","1916-04-15","http://newspapers.library.wales/view/4101385/4101388/62/","German+Submarine" +"- - - - -.-ION THE BRITISH I I. FRONT - *","1915-11-30","http://newspapers.library.wales/view/4100506/4100507/13/","German+Submarine" +"j .12 LIVES LOST I ..-!","1915-04-12","http://newspapers.library.wales/view/4098963/4098971/145/","German+Submarine" +"THE FALABA JUDGMENT I","1915-07-08","http://newspapers.library.wales/view/4099580/4099581/15/","German+Submarine" +"U-BOAT PIRACY","1916-10-25","http://newspapers.library.wales/view/4102441/4102443/41/","German+Submarine" +"THE SCROLL OF FAME I","1917-08-09","http://newspapers.library.wales/view/4103848/4103851/88/","German+Submarine" +"SUBMARINE SUNK.I","1916-08-07","http://newspapers.library.wales/view/4101987/4101990/72/","German+Submarine" +"THE BLOCKADE","1917-03-13","http://newspapers.library.wales/view/4103207/4103208/3/","German+Submarine" +"I BERNSTORFF'S WILY DIPLOMACY. I-","1916-02-14","http://newspapers.library.wales/view/4101008/4101009/5/","German+Submarine" +"! WAR SUMMARYI I---","1916-05-27","http://newspapers.library.wales/view/4115191/4115192/12/","German+Submarine" +"-WAR SUMMARY","1916-03-11","http://newspapers.library.wales/view/4115110/4115115/89/","German+Submarine" +"! WAR SUMMARY I -","1916-03-25","http://newspapers.library.wales/view/4115128/4115129/13/","German+Submarine" +"I WAR SUMMARY","1916-04-22","http://newspapers.library.wales/view/4115156/4115157/16/","German+Submarine" +"WAR SUMMARYI","1916-03-04","http://newspapers.library.wales/view/4115099/4115104/80/","German+Submarine" +"- == - - THAT NAVAL "e; FIGHT."e; I - i","1916-08-24","http://newspapers.library.wales/view/4102084/4102085/28/","German+Submarine" +"-__-_-----_---------PORTMADOC.","1916-12-15","http://newspapers.library.wales/view/3413555/3413557/20/","German+Submarine" +"SHELlEO BY PIRATES. I I"e; I0 ^ I","1915-05-07","http://newspapers.library.wales/view/4099149/4099150/33/","German+Submarine" +"FOUR VESSELS SUNK.","1915-02-01","http://newspapers.library.wales/view/4098405/4098407/15/","German+Submarine" +"i HUN PIRATES I - -","1918-03-14","http://newspapers.library.wales/view/4105433/4105435/32/","German+Submarine" +"IWAR SUMMARYj","1918-02-02","http://newspapers.library.wales/view/4115812/4115813/26/","German+Submarine" +"CURE FOR GERMAN MADNESS.","1916-03-07","http://newspapers.library.wales/view/4101147/4101150/58/","German+Submarine" +"FANTASTIC DREAMS I","1916-08-14","http://newspapers.library.wales/view/4102023/4102028/86/","German+Submarine" +"-.--ITJ-OAY'S NEWS IN BRIEF j .","1918-05-30","http://newspapers.library.wales/view/4105105/4105106/25/","German+Submarine" +"Family Notices","1918-10-31","http://newspapers.library.wales/view/4105780/4105783/34/","German+Submarine" +"-------__--------_..--------.,----"e;sr"e; s B sy* / B S-a s— W / /m THE WAR","1915-02-26","http://newspapers.library.wales/view/3412692/3412697/58/","German+Submarine" +".LLANGRANOG.","1915-07-02","http://newspapers.library.wales/view/3412854/3412856/10/","German+Submarine" +"PGRTMADOC.","1918-05-31","http://newspapers.library.wales/view/3414239/3414246/86/","German+Submarine" +"LINER TORPEDOED. f","1915-09-11","http://newspapers.library.wales/view/4114833/4114837/76/","German+Submarine" +"I U BOAT LOSSES. ________)","1915-09-11","http://newspapers.library.wales/view/4114833/4114844/278/","German+Submarine" +"RUTHLESS SEAl WAR,i i I","1917-02-03","http://newspapers.library.wales/view/4110347/4110352/87/","German+Submarine" +"I NAVAL I I-I","1917-02-03","http://newspapers.library.wales/view/4110347/4110352/96/","German+Submarine" +"!GATHERING OF THE j CLANS.I","1916-01-01","http://newspapers.library.wales/view/4092701/4092707/109/","German+Submarine" +",AMERICA. !","1917-03-17","http://newspapers.library.wales/view/4110389/4110394/108/","German+Submarine" +"! SUBMARINE CRLHSERS. I _ I","1916-02-19","http://newspapers.library.wales/view/4092764/4092769/72/","German+Submarine" +"[ , f¡f !U N E tri : ¥. f1(Y- ';t : ?14,- ru? IN I i/ *'-' H, J Ih"e;"e;',Fb W /","1916-03-25","http://newspapers.library.wales/view/4092800/4092803/37/","German+Submarine" +"ITWICE TO-RPEÖOED.","1915-05-22","http://newspapers.library.wales/view/4114625/4114632/110/","German+Submarine" +"BRAVERY AT SEA.","1916-12-30","http://newspapers.library.wales/view/4115438/4115443/100/","German+Submarine" +"WAR .SUMMARYI","1917-09-22","http://newspapers.library.wales/view/4115706/4115707/12/","German+Submarine" +"I QERMAKY'S &IEW PCS.","1915-04-24","http://newspapers.library.wales/view/4114573/4114578/71/","German+Submarine" +"PIRATES OUTWITTED. !","1915-07-24","http://newspapers.library.wales/view/4114742/4114746/55/","German+Submarine" +"I BRITI,SH LINER SUNK.","1915-07-03","http://newspapers.library.wales/view/4114703/4114710/122/","German+Submarine" +",WAR SO WARY","1917-02-10","http://newspapers.library.wales/view/4115482/4115483/19/","German+Submarine" +"STEAMER DEFIES SUBMARINE","1915-07-10","http://newspapers.library.wales/view/3611643/3611645/18/","German+Submarine" +"I MBS.tiRUNDl'S JOTTINGS","1918-03-08","http://newspapers.library.wales/view/4128930/4128935/29/","German+Submarine" +"MORE APPEALS TO PUBLIC.","1915-10-22","http://newspapers.library.wales/view/4130297/4130299/14/","German+Submarine" +"THE WHIMPERERS.","1915-11-19","http://newspapers.library.wales/view/4130333/4130338/20/","German+Submarine" +"OUR DAKGER FROM ZEPPELINS.","1916-02-18","http://newspapers.library.wales/view/4168819/4168824/28/","German+Submarine" +"BARRY COUNTY COURT.","1916-03-24","http://newspapers.library.wales/view/4168864/4168867/14/","German+Submarine" +"'OUR WAY-OR NOT AT ALL."e; I - I","1916-12-30","http://newspapers.library.wales/view/4093075/4093080/96/","German+Submarine" +"MURDER MOST FOUL","1916-08-05","http://newspapers.library.wales/view/4092928/4092930/32/","German+Submarine" +"GERMAN SUBMARINE BLOCKADE. ----","1915-02-26","http://newspapers.library.wales/view/3678564/3678572/99/","German+Submarine" +"WAR jjOTTINGS","1917-03-30","http://newspapers.library.wales/view/3690401/3690409/84/","German+Submarine" +"INTERESTING SUBMARINE HUNT","1914-10-23","http://newspapers.library.wales/view/3678399/3678401/21/","German+Submarine" +"THE WAR. -","1916-11-17","http://newspapers.library.wales/view/3690220/3690228/93/","German+Submarine" +"PENCADER AND DISTRICT","1916-11-24","http://newspapers.library.wales/view/3690229/3690235/59/","German+Submarine" +"i SWANSEA TRADER. -","1915-07-10","http://newspapers.library.wales/view/4114716/4114720/64/","German+Submarine" +"THE FALABA JUDGMENT.","1915-07-10","http://newspapers.library.wales/view/4114716/4114723/126/","German+Submarine" +"WAR- SUMtliARY. j j","1917-06-23","http://newspapers.library.wales/view/4115615/4115616/23/","German+Submarine" +"THE FIGHTING IN LORRAINE.","1915-04-08","http://newspapers.library.wales/view/3857587/3857594/76/","German+Submarine" +"-0 ANOTHER DISCOVERY.","1915-05-06","http://newspapers.library.wales/view/3857623/3857625/20/","German+Submarine" +"* A STRANGE EXPERIENCE.","1915-05-06","http://newspapers.library.wales/view/3857623/3857630/99/","German+Submarine" +"THE SECRET PETROL STORE AT SEA.","1915-02-11","http://newspapers.library.wales/view/3857515/3857522/91/","German+Submarine" +". THE QUEER OLD MAN OF THE SEA.","1915-03-04","http://newspapers.library.wales/view/3857542/3857544/18/","German+Submarine" +". THE SS. ELSINORE.","1915-02-18","http://newspapers.library.wales/view/3857524/3857531/88/","German+Submarine" +"ABOUT U BOATS.","1918-05-18","http://newspapers.library.wales/view/3859066/3859067/7/","German+Submarine" +"——.—— ) AVENGED HiS SON.,","1915-06-03","http://newspapers.library.wales/view/3857659/3857666/73/","German+Submarine" +"[No title]","1915-05-13","http://newspapers.library.wales/view/3857632/3857639/99/","German+Submarine" +"II HEROIC SKIPPER WHO BAFfLED A U BOAT.I","1918-03-09","http://newspapers.library.wales/view/3979318/3979324/42/","German+Submarine" +"---I Liner Defies a Submarine. j","1916-04-19","http://newspapers.library.wales/view/4118747/4118750/29/","German+Submarine" +"I I-Do You Know?","1915-03-10","http://newspapers.library.wales/view/4118457/4118460/29/","German+Submarine" +"; LOCAL WAR ITEMS. I","1915-03-17","http://newspapers.library.wales/view/4118462/4118465/20/","German+Submarine" +"LOCAL WAR ITEMS. ! --1","1915-04-21","http://newspapers.library.wales/view/4118487/4118490/19/","German+Submarine" +"THE WAR.","1914-11-05","http://newspapers.library.wales/view/3857405/3857408/24/","German+Submarine" +"-.-SUNK IN THREE MINUTES: LOSS OF LIFE.","1915-04-16","http://newspapers.library.wales/view/4121236/4121242/94/","German+Submarine" +"! PRIME BEEF.! i","1917-08-09","http://newspapers.library.wales/view/4094720/4094725/41/","German+Submarine" +"U BOAT CRUISER DEFEATED IN EPIC STRUGGLE. 11i","1918-07-19","http://newspapers.library.wales/view/4124723/4124729/63/","German+Submarine" +"r White Star Uner "e;Arabic"e; Sunk.","1915-08-20","http://newspapers.library.wales/view/4121398/4121402/55/","German+Submarine" +"SIR DAVID BEATTY IN NORTH SEA BATTLE.","1915-10-22","http://newspapers.library.wales/view/4121479/4121481/16/","German+Submarine" +"DEEDS OF DARING BY NAVAL OFFICERSI","1916-01-07","http://newspapers.library.wales/view/4121578/4121580/3/","German+Submarine" +"IMAJESTIC SUNK.","1915-06-04","http://newspapers.library.wales/view/4121299/4121305/69/","German+Submarine" +"NOT FEAR, BUT DISGUST. I","1915-09-17","http://newspapers.library.wales/view/3886262/3886268/69/","German+Submarine" +"Premier's Request to Farmers.","1917-03-15","http://newspapers.library.wales/view/4013677/4013678/2/","German+Submarine" +"J;'"e;, .-——— The "e;Blockade."e;","1915-02-25","http://newspapers.library.wales/view/3755302/3755308/69/","German+Submarine" +"Lusitania.","1915-05-13","http://newspapers.library.wales/view/3755401/3755403/6/","German+Submarine" +"COLOFN Y PLANT.","1916-09-07","http://newspapers.library.wales/view/4020303/4020308/23/","German+Submarine" +"I NEWS OF THE WEEK. *","1916-09-01","http://newspapers.library.wales/view/4242177/4242182/39/","German+Submarine" +"11111 WAR BREVITIES.I","1915-09-10","http://newspapers.library.wales/view/4241250/4241258/39/","German+Submarine" +"r ■ I NEWS OF THE WEEK.","1917-03-09","http://newspapers.library.wales/view/4241484/4241489/31/","German+Submarine" +"i RHAYADER.","1916-02-24","http://newspapers.library.wales/view/4094031/4094039/137/","German+Submarine" +"I STEAMER TORPEDOED.","1915-01-29","http://newspapers.library.wales/view/4121137/4121143/75/","German+Submarine" +"FWLLHELI COUNTY COURT.","1917-04-13","http://newspapers.library.wales/view/4243827/4243833/103/","German+Submarine" +"I Hunting SubmarinesI","1915-03-13","http://newspapers.library.wales/view/4122971/4122974/31/","German+Submarine" +"News in a Nutshell —.—","1916-01-01","http://newspapers.library.wales/view/4123041/4123045/47/","German+Submarine" +"BRUTAL MURDER OF 39 -MEN AT SEA. I","1917-08-18","http://newspapers.library.wales/view/3979057/3979058/2/","German+Submarine" +"SMASHING THE SUBMARINE.I","1914-08-15","http://newspapers.library.wales/view/4614232/4614237/39/","German+Submarine" +"ICAERGYBI.","1916-04-04","http://newspapers.library.wales/view/4028721/4028727/41/","German+Submarine" +"I LINER OUTWITS SUBMARINE I","1916-04-21","http://newspapers.library.wales/view/4121713/4121716/34/","German+Submarine" +"ISIR ROGER -CASEMENT.","1916-04-28","http://newspapers.library.wales/view/4121722/4121728/65/","German+Submarine" +"- TORPEDOED. ..","1915-02-26","http://newspapers.library.wales/view/4121173/4121179/67/","German+Submarine" +"I*MAILBOAT ATTACKED. -","1915-02-26","http://newspapers.library.wales/view/4121173/4121179/68/","German+Submarine" +"NOT ONE SHIP SUNK IN SECOND WEEK.","1915-03-12","http://newspapers.library.wales/view/4121191/4121197/52/","German+Submarine" +"PIRATES' WOMEN VICTIMS. I","1915-04-02","http://newspapers.library.wales/view/4121218/4121224/78/","German+Submarine" +"RUSSIAN AND BRITISH VESSELS SUNK IBY U31.,","1915-04-09","http://newspapers.library.wales/view/4121227/4121230/27/","German+Submarine" +"LETTERS TO THE EDITOR.","1917-08-25","http://newspapers.library.wales/view/3580724/3580727/17/","German+Submarine" +"-I Scraps.|","1915-06-12","http://newspapers.library.wales/view/3579680/3579686/105/","German+Submarine" +"THE PREMIER'S I -BRACING -MESSAGE.I","1917-04-28","http://newspapers.library.wales/view/4103402/4103404/33/","German+Submarine" +"-__-_._- -W-"e;"e; A DECOY SHIP. I","1915-03-12","http://newspapers.library.wales/view/4098746/4098747/14/","German+Submarine" +"A LOOK AROUND! I","1915-03-29","http://newspapers.library.wales/view/4098870/4098874/65/","German+Submarine" +"Advertising","1914-08-15","http://newspapers.library.wales/view/3611241/3611245/26/","German+Submarine" +"BRITAIN'S GREAT FIGHT FOR FREEDOM., —a.","1914-10-23","http://newspapers.library.wales/view/4128759/4128764/38/","German+Submarine" +"IS NOT RETALIATION THE .ONLY REMEDY? j","1915-05-07","http://newspapers.library.wales/view/4130081/4130086/30/","German+Submarine" +"!STEADY PROGRESS OF ITHE ALLIES.","1915-08-20","http://newspapers.library.wales/view/4130216/4130221/31/","German+Submarine" +"THE WAR. --","1918-07-05","http://newspapers.library.wales/view/3679111/3679114/24/","German+Submarine" +"f OMNIBUS MOTES.","1914-11-07","http://newspapers.library.wales/view/4114257/4114263/114/","German+Submarine" +"THE NAVAL PATROL.","1918-05-11","http://newspapers.library.wales/view/3859054/3859055/2/","German+Submarine" +"- - - - _ -____ - -Pirates Attack Allan Liner.","1915-09-08","http://newspapers.library.wales/view/4118587/4118591/60/","German+Submarine" +"NOTES ON NEWS.","1915-09-03","http://newspapers.library.wales/view/4121416/4121419/24/","German+Submarine" +"! THE WAR AT SEA. I i I","1915-01-01","http://newspapers.library.wales/view/3885929/3885935/75/","German+Submarine" +"PROGRESS OF THE WAR. ----","1915-04-02","http://newspapers.library.wales/view/3678609/3678617/93/","German+Submarine" +"¡. THE WAR. -","1916-02-18","http://newspapers.library.wales/view/3689893/3689898/41/","German+Submarine" +"Great Progress in the Dardanelles.","1915-03-12","http://newspapers.library.wales/view/3678582/3678590/88/","German+Submarine" +"Submarine's Duel WithI Trawler,","1915-06-02","http://newspapers.library.wales/view/4118517/4118520/32/","German+Submarine" +"U.S.A. PREPARING FOR WAR m","1917-02-07","http://newspapers.library.wales/view/4103046/4103049/59/","German+Submarine" +"..... 'R 71a S?D i Oil Ar?4 fm-. 1.1 TO ml","1917-04-03","http://newspapers.library.wales/view/4103297/4103298/3/","German+Submarine" +"- ..----..-IBRILLIANT SUCCESSES OF THE ALLIES AT ALL FRONTS. -10","1917-02-02","http://newspapers.library.wales/view/4130432/4130437/24/","German+Submarine" +"i !A SHEAF OF WAR STORIES.","1918-07-20","http://newspapers.library.wales/view/3859174/3859175/5/","German+Submarine" +"THE RAID OF THE U 21.","1915-02-04","http://newspapers.library.wales/view/3857506/3857508/11/","German+Submarine" +"THE PASSING WEEK","1915-09-10","http://newspapers.library.wales/view/3585340/3585344/34/","German+Submarine" +"War and Politics. i I—— t","1915-05-13","http://newspapers.library.wales/view/4093662/4093664/5/","German+Submarine" +"OUngt SHSRT STORY.! -a","1918-07-05","http://newspapers.library.wales/view/4124705/4124707/2/","German+Submarine" +"I Yr Adar Duon.","1918-10-31","http://newspapers.library.wales/view/4021311/4021316/31/","German+Submarine" +"[No title]","1917-07-19","http://newspapers.library.wales/view/4020708/4020710/10/","German+Submarine" +"Shop Dafydd y Crydd.I -I","1915-06-10","http://newspapers.library.wales/view/4019718/4019721/12/","German+Submarine" +"GERMAN DRIVKN BACK.","1914-10-03","http://newspapers.library.wales/view/4092161/4092169/78/","German+Submarine" +""e;SHUFFUNG ALONG."e; I","1915-01-30","http://newspapers.library.wales/view/4092287/4092289/19/","German+Submarine" +"II I iii STB-CNCLY RE-i IINFORCED."e; ——.—— I","1915-08-21","http://newspapers.library.wales/view/4092530/4092532/15/","German+Submarine" +"'"e; :i."e;. ' - THE ROYAL EDWARD. I : .———we———","1915-08-21","http://newspapers.library.wales/view/4092530/4092535/79/","German+Submarine" +"i "e;ARABIG"e; SHR?VCBS ——— THE PASSING WEEK!","1916-06-02","http://newspapers.library.wales/view/3585530/3585534/40/","German+Submarine" +"P"e; OUR LONDON LETTER. I","1916-07-28","http://newspapers.library.wales/view/4121839/4121841/2/","German+Submarine" +"STEAMER TORPEDOED OFF I ANGLESEY.","1915-02-26","http://newspapers.library.wales/view/4242880/4242887/93/","German+Submarine" +"Politics and the War.","1915-03-04","http://newspapers.library.wales/view/4093572/4093574/5/","German+Submarine" +"-'>- - - - - - - - - - BRITAIN'S FOOD PROBLEM.","1916-11-24","http://newspapers.library.wales/view/4121992/4121996/51/","German+Submarine" +"IALONG THE CAMBRIAN COAST","1917-08-24","http://newspapers.library.wales/view/4243974/4243981/90/","German+Submarine" +"War and Politics.","1915-04-29","http://newspapers.library.wales/view/4093644/4093646/5/","German+Submarine" +"ALONG THE CAMBRIAN COAST I","1917-12-21","http://newspapers.library.wales/view/4244115/4244122/119/","German+Submarine" +"CHANNEL BOAT SUNK. —01—.","1916-03-31","http://newspapers.library.wales/view/4121686/4121688/2/","German+Submarine" +"The "e;Hold-Up"e; of I.L.P. Delegates.","1917-06-16","http://newspapers.library.wales/view/4001706/4001708/14/","German+Submarine" +"«EAVY DEFEAT FOR HAVELOCK WILSON! i","1918-09-14","http://newspapers.library.wales/view/3999877/3999880/16/","German+Submarine" +"DRAPED IN BRITISH AND AMERICANI FLAGS.","1915-05-14","http://newspapers.library.wales/view/3886100/3886106/71/","German+Submarine" +"WAR NOTES.","1915-03-27","http://newspapers.library.wales/view/4000820/4000823/10/","German+Submarine" +"NEWS FROM ACTUAL FIGHTERS. —————————o","1914-11-05","http://newspapers.library.wales/view/4012955/4012963/96/","German+Submarine" +"WAR DAY BY DAY.-I","1915-09-10","http://newspapers.library.wales/view/4241250/4241253/9/","German+Submarine" +"I GETTING ON WITH THE J-VAR.","1917-06-15","http://newspapers.library.wales/view/4243896/4243898/5/","German+Submarine" +"PORTMADOC. I","1917-04-05","http://newspapers.library.wales/view/4243818/4243824/81/","German+Submarine" +"I ***********************1 » About the War. » : About the War. :!","1916-01-28","http://newspapers.library.wales/view/3886424/3886426/15/","German+Submarine" +"- .NODIADAU CYFUNDEBOL. i","1917-01-16","http://newspapers.library.wales/view/4029075/4029079/21/","German+Submarine" +"LLYTHYRAU ODDIWRIH Y ..-MILWYR.._","1917-01-23","http://newspapers.library.wales/view/4029084/4029091/44/","German+Submarine" +"[No title]","1915-04-10","http://newspapers.library.wales/view/4092368/4092369/8/","German+Submarine" +"THE WAR DAY BY DAY.-I ----","1914-11-27","http://newspapers.library.wales/view/3678444/3678452/102/","German+Submarine" +"THE PASSING WEEKI","1915-10-22","http://newspapers.library.wales/view/3585370/3585374/36/","German+Submarine" +"? cn? s'Mf? AMn ? rUK ?uLA?U.","1918-04-17","http://newspapers.library.wales/view/4119262/4119266/36/","German+Submarine" +"4 rilE PASSING WEEK","1915-03-12","http://newspapers.library.wales/view/3585210/3585214/41/","German+Submarine" +"<-Encouraging Progress of the ..Allies. -- -_1"e;"e;/_-","1914-10-22","http://newspapers.library.wales/view/4012937/4012938/1/","German+Submarine" +"Advertising","1917-05-15","http://newspapers.library.wales/view/4025889/4025891/4/","German+Submarine" +"[No title]","1914-10-24","http://newspapers.library.wales/view/4092188/4092189/7/","German+Submarine" +"German Retreat in Belgium.","1914-11-05","http://newspapers.library.wales/view/4012955/4012956/1/","German+Submarine" +"n ot CRIM'E H r mNC. ARABICI [ ' ... '- - ?___ 'oJ"e;::'"e; "e;::-'J I","1915-08-28","http://newspapers.library.wales/view/4092539/4092541/9/","German+Submarine" +"[No title]","1915-04-03","http://newspapers.library.wales/view/4092359/4092360/11/","German+Submarine" +"■P"e;.—■——»—■'mmmmmm„,*m>m■■■■!.e—» NAKED FACTS OF THEIAI --Y","1915-03-06","http://newspapers.library.wales/view/4098705/4098709/45/","German+Submarine" +"WHAT WILL A ERICA DO ?","1915-02-18","http://newspapers.library.wales/view/4098587/4098591/53/","German+Submarine" +"DAY AFTER "e;THE Ml"e; I-","1915-02-19","http://newspapers.library.wales/view/4098594/4098598/82/","German+Submarine" +"BRITAIN S SEA FORCES vi If' ù .. 1 ' '.i /), .","1916-05-31","http://newspapers.library.wales/view/4101605/4101609/97/","German+Submarine" +"- - ! WITHOUT WARNING.","1915-02-22","http://newspapers.library.wales/view/4098610/4098617/154/","German+Submarine" +"BRITAIN S SEA FORCES","1916-06-02","http://newspapers.library.wales/view/4101615/4101618/68/","German+Submarine" +"- is- -THE"e; WAR DAY BY DAY.","1918-11-16","http://newspapers.library.wales/view/4116005/4116007/42/","German+Submarine" +"Advertising","1918-11-04","http://newspapers.library.wales/view/4105797/4105801/71/","German+Submarine" +".-ARABIC S LAST MOMENTS.","1915-08-21","http://newspapers.library.wales/view/4099864/4099865/14/","German+Submarine" +"NOTES AND COMMENTSI","1916-03-31","http://newspapers.library.wales/view/4101294/4101298/77/","German+Submarine" +"BRITAIN'S SEA FORCES","1916-05-30","http://newspapers.library.wales/view/4101598/4101601/73/","German+Submarine" +"The War SBi**. + +| Indice | Mot | Décompte (tf) | Df | +| ----- | ---------- | -------- | --- | +| 1 | afternoon | 1 | 66 | +| 2 | against | 1 | 189 | +| 3 | age | 1 | 224 | +| 4 | ago | 1 | 161 | +| 5 | air | 1 | 80 | +| 6 | all | 1 | 310 | +| 7 | american | 1 | 277 | +| 8 | an | 1 | 352 | +| 9 | and | 13 | 364 | +| 10 | around | 2 | 149 | +| 11 | as | 2 | 357 | +| 12 | ascension | 1 | 6 | +| 13 | asylum | 1 | 2 | +| 14 | at | 8 | 362 | +| 15 | avenue | 2 | 68 | +| 16 | balloon | 1 | 2 | +| 17 | bankruptcy | 1 | 8 | +| 18 | barrel | 1 | 7 | +| 19 | baxter | 1 | 4 | +| 20 | be | 1 | 332 | +| 21 | beat | 1 | 33 | +| 22 | began | 1 | 241 | +| 23 | bell | 1 | 24 | +| 24 | bly | 2 | 1 | +| 25 | body | 1 | 112 | +| 26 | born | 1 | 342 | +| 27 | but | 1 | 343 | +| 28 | by | 3 | 349 | +| 29 | career | 1 | 223 | +| 30 | character | 1 | 89 | + +La formule la plus directe pour calculer la fréquence _inverse_ de document **idf** d'un mot _i_, requise par **tf-idf**, est **N/dfi**, où _N_ représente le nombre total de documents dans le corpus. Plusieurs implémentations normalisent cependant les résultats à l'aide de calculs supplémentaires. En règle générale, **tf-idf** utilise la normalisation pour deux raisons : d'abord pour éviter que les calculs de fréquences ne soient biaisés par la présence de documents très courts ou très longs, ensuite pour calculer les valeurs de fréquence inverse de document de chaque mot. Par exemple, l'implémentation de Scikit-Learn remplace **N** par **N+1**, calcule le logarithme naturel de **(N+1)/dfi** et ajoute 1 au résultat. Nous reviendrons sur la notion de normalisation dans la section intitulée [« Paramètres Scikit-Learn »](#paramètres-scikit-learn) + +L'équation suivante décrit les opérations que Scikit-Learn applique pour calculer les valeurs d'**idf**[^7] : + +$$ idf_i = ln[\, ({N}+1) /\, {df_i}] + 1 $$ + +Une fois **idfi** calculé, **tf-idfi** est **tfi** multiplié par **idfi**. + +$$ tf{\text -}idf_i = tf_i \, \times \, idf_i $$ + +Les équations mathématiques comme celles-ci peuvent être intimidantes lorsqu'on n'a pas l'habitude d'en lire. Cependant, une fois qu'on a acquis l'expérience nécessaire, elles expliquent le fonctionnement d'un algorithme plus clairement que n'importe quelle explication textuelle bien écrite. Pour plus de détails sur ce sujet, le billet en anglais « Do Digital Humanists Need to Understand Algorithms ? » de Ben Schmidt constitue un bon point de départ.[^8] Afin de rendre la signification des équations du **idf** et du **tf-idf** plus concrètes, j'ai ajouté deux nouvelles colonnes au tableau des fréquences de termes que nous avons vu précédemment. La première nouvelle colonne contient les scores **idf** calculés, tandis que la seconde multiplie les valeurs **Décompte** et **Idf** pour obtenir les scores **tf-idf** finaux. Notez que les valeurs **idf** sont plus élevées lorsque les documents apparaissent dans moins de documents (c'est-à-dire, lorsque leurs valeurs **df** sont basses). Les valeurs ainsi obtenues dans notre exemple sont comprises entre 1 et 6. + +D’autres méthodes de normalisation pourraient produire des échelles de valeurs différentes : en utilisant la [valeur centrée réduite](https://perma.cc/XF7S-B533) par exemple, mais ce n'est pas la seule ([cf. l'article Wikipédia en anglais sur le sujet](https://perma.cc/Q47J-VCXM)). + +Notez aussi que la formule de calcul de **tf-idf** implémentée par cette version de l'algorithme fait en sorte que les valeurs ne peuvent jamais être inférieures aux décomptes d'occurrences. Il s'agit d'un effet secondaire de la méthode de normalisation: en ajoutant 1 à la valeur **idf**, nous nous assurons de ne jamais multiplier nos **Décomptes** par des nombres inférieurs à 1. Cela évite de trop perturber la distribution des valeurs. + +| Indice | Mot | Décompte | Df | Idf | Tf-idf | +| ------ | --------- | -------- | --- | ---------- | ----------- | +| 1 | afternoon | 1 | 66 | 2.70066923 | 2.70066923 | +| 2 | against | 1 | 189 | 1.65833778 | 1.65833778 | +| 3 | age | 1 | 224 | 1.48926145 | 1.48926145 | +| 4 | ago | 1 | 161 | 1.81776551 | 1.81776551 | +| 5 | air | 1 | 80 | 2.51091269 | 2.51091269 | +| 6 | all | 1 | 310 | 1.16556894 | 1.16556894 | +| 7 | american | 1 | 277 | 1.27774073 | 1.27774073 | +| 8 | an | 1 | 352 | 1.03889379 | 1.03889379 | +| 9 | and | 13 | 364 | 1.00546449 | 13.07103843 | +| 10 | around | 2 | 149 | 1.89472655 | 3.78945311 | +| 11 | as | 2 | 357 | 1.02482886 | 2.04965772 | +| 12 | ascension | 1 | 6 | 4.95945170 | 4.95945170 | +| 13 | asylum | 1 | 2 | 5.80674956 | 5.80674956 | +| 14 | at | 8 | 362 | 1.01095901 | 8.08767211 | +| 15 | avenue | 2 | 68 | 2.67125534 | 5.34251069 | +| 16 | balloon | 1 | 2 | 5.80674956 | 5.80674956 | +| 17 | bankruptcy | 1 | 8 | 4.70813727 | 4.70813727 | +| 18 | barrel | 1 | 7 | 4.82592031 | 4.82592031 | +| 19 | baxter | 1 | 4 | 5.29592394 | 5.29592394 | +| 20 | be | 1 | 332 | 1.09721936 | 1.09721936 | +| 21 | beat | 1 | 33 | 3.37900132 | 3.37900132 | +| 22 | began | 1 | 241 | 1.41642412 | 1.41642412 | +| 23 | bell | 1 | 24 | 3.68648602 | 3.68648602 | +| 24 | bly | 2 | 1 | 6.21221467 | 12.42442933 | +| 25 | body | 1 | 112 | 2.17797403 | 2.17797403 | +| 26 | born | 1 | 342 | 1.06763140 | 1.06763140 | +| 27 | but | 1 | 343 | 1.06472019 | 1.06472019 | +| 28 | by | 3 | 349 | 1.04742869 | 3.14228608 | +| 29 | career | 1 | 223 | 1.49371580 | 1.49371580 | +| 30 | character | 1 | 89 | 2.40555218 | 2.40555218 | + +Rappelons que les tableaux ci-dessus représentent une version spécifique de l'algorithme **tf-idf**. Il en existe d'autres. On calcule généralement des valeurs **tf-idf** pour tous les mots et pour tous les documents du corpus, pas seulement pour 30 mots dans un seul document. C'est ce qui nous permet de savoir quels mots ont les scores **tf-idf** les plus élevés dans chaque document. Pour avoir une meilleure idée de ce à quoi ressemblent les résultats d'un calcul **tf-idf** complet, veuillez télécharger et ouvrir le fichier Excel des valeurs calculées pour la nécrologie de Bly dans [les documents d'accompagnement de la leçon](/assets/tf-idf/lecon-fichiers.zip). Pour ce faire, ouvrez le fichier d'archive (de type .zip) et choisissez le fichier `bly_tfidf_complet.xlsx`. + +## Comment exécuter tf_idf en Python 3 + +Dans cette section de la leçon, nous retracerons pas à pas le chemin que j'ai parcouru pour calculer des valeurs de **tf-idf** pour tous les termes apparaissant dans tous les documents du corpus nécrologique. Si vous désirez suivre le processus de plus près, vous pouvez télécharger les fichiers associés à la leçon, ouvrir l'archive `.zip` et exécuter le carnet Jupyter Notebook intitulé `TF-IDF-code-fr.ipynb` qui se trouve dans le dossier `lecon-fichiers`. Vous pouvez aussi créer votre propre carnet Jupyter au même endroit et copier-coller les blocs de code qui apparaissent ci-dessous au moment approprié. Si vous travaillez dans l'environnement Anaconda, consultez la [documentation des carnets Jupyter](https://perma.cc/W92W-C3Z3) pour savoir comment changer le répertoire de travail des carnets. Notez que, comme dans tous les langages de programmation, il existe plusieurs manières de compléter chacune des étapes que nous étudierons ci-dessous. + +Mon premier bloc de code est conçu pour récupérer les noms de tous les fichiers .txt qui se trouvent dans le répertoire `txt`. Ces lignes de code importent la classe `Path` du module `pathlib` et invoquent la méthode `Path().rglob()` pour produire une liste de tous les fichiers qui se trouvent dans le répertoire 'txt' et dont les noms se terminent avec l'extension .txt. `pathlib` concaténera le chemin du répertoire, `file.parent`, à chaque nom de fichier pour construire des chemins complets pour chaque fichier (sous macOS ou Windows). + +J'ajoute ainsi chaque nom de fichier à une liste nommée `tous_fichiers_txt`. Enfin, je renvoie la longueur de `tous_fichiers_txt` pour vérifier que j'ai bien trouvé les 366 fichiers attendus. Cette approche boucler-et-ajouter est très courante en Python. + +```python +from pathlib import Path + +tous_fichiers_txt =[] +for fichier in Path("txt").rglob("*.txt"): + tous_fichiers_txt.append(fichier.parent / fichier.name) + +# décompte du nombre de fichiers dans la liste +n_fichiers = len(tous_fichiers_txt) +print(n_fichiers) +``` + +Concernant le choix des noms de variables il existe deux méthodes courantes qui donne respectivement la priorité à la commodité puis à la sémantique. Par commodité, on pourrait choisir de nommer une variable **x** pour qu'il soit facile et rapide de taper son nom au besoin. Un nom de variable sémantique tente, quant à lui, de transmettre au lecteur une information sur la fonction ou l'usage de la variable. En nommant ma liste de fichiers textuels `tous_fichiers_txt` et la variable qui contient la taille de cette liste `n_fichiers`, j'accorde la priorité à la sémantique. En même temps, j'utilise des abréviations comme `txt` pour « texte » et `n` pour « nombre » pour gagner du temps et j'ai choisi `tous_fichiers_txt` plutôt que `les_noms_de_tous_les_fichiers_textuels` parce que la concision demeure un objectif important. Les normes concernant l'utilisation des majuscules et des barres de soulignement en Python sont codifiées dans PEP-8, le guide stylistique officiel du langage, avec lequel je vous recommande de vous familiariser.[^9] + +Pour diverses raisons, nous voulons que nos calculs s'effectuent par ordre journalier et mensuel (le corpus contient un fichier pour chaque jour et pour chaque mois de l'année). Pour ce faire, nous pouvons utiliser la méthode `sort()` pour classer les fichiers par ordre numérique ascendant, puis afficher le premier nom de fichier pour nous assurer qu'il s'agit bien de `txt/0101.txt`. + +```python +tous_fichiers_txt.sort() +tous_fichiers_txt[0] +``` + +Nous pouvons ensuite utiliser la liste des noms de fichiers pour lire chaque fichier en mémoire et le convertir en un format que Python peut interpréter comme du texte. Le prochain bloc de code contient une autre opération de type boucler-et-ajouter qui parcourt la liste de noms de fichiers et ouvre chacun d'entre eux. L'instruction `with open(txt_file) as f` permet notamment d'ouvrir un fichier, d'effectuer une action sur celui-ci et de le refermer, ce que nous faisons ici sur tout les fichiers de notre liste. J'invoque ensuite la méthode `read()` de Python pour convertir le contenu de chaque fichier textuel en une chaîne de caractères (`str`), ce qui constitue la manière d'indiquer à Python que les données doivent être interprétées comme du texte. J'ajoute chacune de ces chaînes de caractères, une par une, à une nouvelle liste nommée `tous_documents`. Note importante : les chaînes de caractères qui constituent cette liste y apparaissent dans le même ordre que les noms de fichiers dans la liste `tous_fichiers_txt`. + +```python +tous_documents = [] +for fichier_txt in tous_fichiers_txt: + with open(fichier_txt) as f: + fichier_txt_chaine = f.read() + tous_documents.append(fichier_txt_chaine) +``` + +C'est tout le travail de mise en place dont nous avons besoin. Les étapes de traitement du texte comme la [tokenisation](https://perma.cc/8SZP-DCGF) et l'élimination de la ponctuation seront effectuées automatiquement lorsque nous utiliserons le `TfidfVectorizer` de Scikit-Learn pour représenter nos documents à l'aide des scores **tf-idf** calculés en fonction de leur contenu. Le bloc de code ci-dessous importe `TfidfVectorizer` du module Scikit-Learn, qui est préinstallé avec Anaconda. `TfidfVectorizer` est une classe d'objets Python développée en programmation orientée objet. Je construis donc une instance de cette classe, nommée `vectoriseur`, à laquelle je fournis des paramètres spécifiques (j’aurai plus de choses à dire au sujet de ces paramètres dans la section intitulée [« Paramètres Scikit-Learn »](#paramètres-scikit-learn)). J'applique ensuite la méthode `fit_transform()` de cet objet à ma liste de chaînes de caractères (la variable nommée `tous_documents`). La variable `documents_transformes` contient les résultats de l'opération `fit_transform()`. Notez que nous pourrions aussi fournir à `TfidfVectorizer` une liste de mots vides (rappelons qu'il s'agit de mots structurels communs) dont nous ne voulons pas nous préoccuper. En outre, pour réaliser certaines opérations, comme la division en lexèmes ou le filtrage des mots vides, dans une langue autre que l'anglais, il pourrait être nécessaire de prétraiter les textes à l'aide d'un autre module Python ou de fournir à `TfidfVectorizer` un analyseur (tokenizer) et/ou une liste de mots vides sur mesure. + +```python +# importer le vectoriseur TfidfVectorizer de Scikit-Learn. +from sklearn.feature_extraction.text import TfidfVectorizer + +vectoriseur = TfidfVectorizer(max_df=.65, min_df=1, stop_words=None, use_idf=True, norm=None) +documents_transformes = vectoriseur.fit_transform(tous_documents) +``` + +La méthode `fit_transform()` ci-dessus transforme la liste de chaînes de caractères en une [matrice creuse](https://perma.cc/4C3Y-M6FD). Dans le cas qui nous concerne, la matrice contient des valeurs **tf-idf** pour tous les mots et tous les textes. Les matrices creuses épargnent de la mémoire en laissant de côté toutes les valeurs égales à zéro. Nous avons cependant besoin d'accéder à toutes les valeurs. Le prochain bloc de code invoque donc la méthode `toarray()` pour convertir la matrice creuse en un [tableau NumPy](https://perma.cc/78YF-4K7K). Nous pouvons afficher la longueur de ce tableau pour nous assurer qu'il est de la même taille que notre liste de documents. + +```python +documents_transformes_tableau = documents_transformes.toarray() +# la prochaine ligne de code vérifie que le tableau numpy contient le même nombre +# de documents que notre liste de fichiers +len(documents_transformes_tableau) +``` +Un tableau NumPy ressemble à une liste sans y être identique. Je pourrais rédiger une leçon complète rien que sur les différences entre les deux, mais une seule des caractéristiques des tableaux NumPy est importante pour le moment : ils convertissent les données stockées dans `documents_transformes` dans un format qui contient explicitement les scores **tf-idf** de tous les mots dans tous les documents. Rappelons que la matrice creuse, elle, excluait toutes les valeurs égales à zéro. + +Nous voulons que toutes les valeurs soient représentées pour que chaque document soit associé au même nombre de valeurs, soit une pour chaque mot qui existe dans le corpus. Chaque ligne du tableau `documents_transformes_tableau` est elle-même un tableau qui représente un des documents du corpus. Nous disposons donc essentiellement d'une grille dans laquelle chaque ligne représente un document et chaque colonne, un mot. Imaginez un tableau semblable à ceux des sections précédentes pour chaque document, mais sans étiquettes pour identifier les lignes et les colonnes. + +Pour combiner les valeurs avec leurs étiquettes, il nous faut deux éléments d'information : l'ordre des documents et et l’ordre des tf-idf obtenu pour chaque mot. L'ordre des documents est facile à obtenir puisqu'il s'agit du même que dans la liste `tous_documents`. La liste de tous les mots du corpus, elle, est stockée dans la variable `vectoriseur` et elle suit le même ordre qu'utilise `documents_transformes_tableau` pour emmagasiner les données. Nous pouvons utiliser la méthode `get_feature_names()` de la classe `TFIDFVectorizer` pour accéder à cette liste de mots. Puis, chaque ligne de `documents_transformes_tableau` (qui contient les valeurs **tf-idf** d'un document) peut être jumelée avec la liste de mots. Pour plus de détails sur les structures de données de type DataFrame du module Pandas de Python, veuillez consulter la leçon [« Visualizing Data with Bokeh and Pandas »](/en/lessons/visualizing-with-bokeh). + +```python +import pandas as pd + +# créer un répertoire de sortie s'il n'existe pas déjà +Path("./tf_idf_resultats").mkdir(parents=True, exist_ok=True) + +# construire une liste de noms de fichiers de résultats à partir de +# la liste de noms de fichiers de données et du répertoire de sortie +fichiers_resultats = [str(fichier_txt).replace(".txt", ".csv").replace("txt/", "tf_idf_resultats/") for fichier_txt in tous_fichiers_txt] + +# traiter chacun des documents du tableau documents_transformes_tableau +# en utilisant enumerate() pour conserver la trace de la position courante dans le tableau +for compteur, document in enumerate(documents_transformes_tableau): + # construire un objet de la classe DataFrame + tf_idf_tuples = list(zip(vectoriseur.get_feature_names(), document)) + un_document_format_df = pd.DataFrame.from_records(tf_idf_tuples, columns=['terme', 'pointage']).sort_values(by='pointage', ascending=False).reset_index(drop=True) + + # enregistrer les résultats dans un document CSV, en utilisant + # la variable 'compteur' pour choisir le nom de fichier + un_document_format_df.to_csv(fichiers_resultats[compteur]) +``` + + +Le bloc de code ci-dessus est composé de trois parties : + +1. Après avoir importé le module pandas, le code vérifie l'existence du répertoire de sortie `tf_idf_resultats`. Si ce répertoire n'existe pas déjà, il est créé à ce moment. +2. Un chemin vers un fichier .csv est construit à partir de chacun des noms de fichiers .txt qui apparaissent dans la liste construite plus haut. Le processus de construction de la variable `fichiers_resultats` convertira, par exemple, `txt/0101.txt` (le chemin du premier fichier .txt de la liste) en `tf_idf_resultats/0101.csv`, et ainsi de suite pour tous les fichiers du corpus. +3. À l'aide d'une boucle, on associe chaque vecteur de scores **tf-idf** avec la liste des mots extraite de `vectoriseur`, on convertit les paires mot/score en objets de type DataFrame, et on enregistre chaque DataFrame dans son propre fichier .csv (un format textuel courant pour les feuilles de calcul). + +## Interpréter les listes de mots : meilleures pratiques et mises en garde + +Lorsque vous exécuterez les blocs de code ci-dessus, vous obtiendrez un répertoire nommé `tf_idf_resultats` contenant 366 fichiers de type .csv. Chacun de ces fichiers contient une liste de mots et de leurs scores **tf-idf** pour un document spécifique. Comme nous avons pu le constater dans le cas de la nécrologie de Nellie Bly, ces listes de mots peuvent être très significatives, cependant, il faut bien comprendre qu'une surinterprétation de ce genre de résultats peut déformer notre compréhension du texte sous-jacent. + +En général, il vaut mieux approcher ces listes de mots en se disant qu'elles seront utiles pour susciter des hypothèses ou des questions de recherche, mais que les résultats de **tf-idf** ne justifieront peut-être pas de conclusions définitives à eux seuls. À titre d'exemple, j'ai assemblé une liste de nécrologies d'individus ayant vécus à la fin du XIXe et au début du XXe siècle qui ont écrit pour des journaux ou pour des magazines et qui étaient associés d'une quelconque façon aux mouvements de réforme sociale. Cette liste inclut Nellie Bly, [Willa Cather](https://perma.cc/6RGB-UQHV), [W.E.B. Du Bois](https://perma.cc/QYW8-SL8D), [Upton Sinclair](https://perma.cc/43WH-G6XL) et [Ida Tarbell](https://perma.cc/TC7V-8CEY), mais il est possible que d'autres individus dont les nécrologies apparaissent dans le corpus correspondent également à cette description.[^10] + +Je m'attendais initialement à ce que plusieurs mots significatifs soient partagés entre ces individus, mais ce n'est pas toujours le cas. Le tableau ci-dessous présente les 20 mots dont les scores **tf-idf** sont les plus élevés dans chacune des cinq nécrologies. Chaque liste est dominée par des mots spécifiques à son document (noms propres, lieux, entreprises, etc.) que l'on peut filtrer à l'aide des paramètres de **tf-idf** ou tout simplement ignorer. La section « Paramètres Scikit-Learn » approfondit les questions liées aux entités nommées ou un syntagme comme des tokens uniques. D'autre part, on peut chercher des mots qui expriment clairement la relation entre un individu et sa profession littéraire. + +| Rang Tf-idf | Nellie Bly | Willa Cather | W.E.B. Du Bois | Upton Sinclair | Ida Tarbell | +| 1 | cochrane | cather | dubois | sinclair | tarbell | +| 2 | her | her | dr | socialist | she | +| 3 | she | she | negro | upton | her | +| 4 | seaman | nebraska | ghana | **books** | lincoln | +| 5 | bly | miss | peace | lanny | miss | +| 6 | nellie | forrester | **encyclopedia** | social | oil | +| 7 | mark | sibert | communist | budd | abraham | +| 8 | ironclad | twilights | barrington | jungle | mcclure | +| 9 | **plume** | willa | fisk | brass | easton | +| 10 | vexations | antonia | atlanta | california | **volumes** | +| 11 | phileas | mcclure | folk | **writer** | minerva | +| 12 | 597 | **novels** | booker | vanzetti | standard | +| 13 | elizabeth | pioneers | successively | macfadden | business | +| 14 | **nom** | cloud | souls | sacco | titusville | +| 15 | balloon | **book** | council | **wrote** | **articles** | +| 16 | forgeries | calif | party | meat | bridgeport | +| 17 | mcalpin | **novel** | disagreed | **pamphlets** | expose | +| 18 | asylum | southwest | harvard | my | trusts | +| 19 | fogg | **verse** | **arts** | industry | mme +| 20 | verne | **wrote** | soviet | **novel** | **magazine** | + +J'ai utilisé les caractères gras pour souligner des termes qui semblent particulièrement reliés à l'écriture. Cette liste inclut _articles_, _arts_, _book_ (livre), _books_ (livres), _encyclopedia_ (encyclopédie), _magazine_, _nom_, _novel_ (roman), _novels_ (romans), _pamphlets_, _plume_, _verse_ (vers/poésie), _volumes_, _writer_ (auteur/autrice) et _wrote_ (écrit), auxquels on pourrait ajouter les titres de livres spécifiques ou les noms de magazines. Ne tenons pas compte de ces détails pour le moment et remarquons que, si les listes de Cather et de Sinclair contiennent plusieurs mots associés aux livres et à l'écriture, ce n'est pas le cas pour Bly, Du Bois et Tarbell. + +On pourrait facilement tirer des conclusions hâtives. L'identité de Cather semble fortement reliée à son genre, à son attachement à des lieux, à sa fiction et à sa poésie. Sinclair est plus fortement associé à la politique et à ses écrits au sujet de la viande, de l'industrie et du procès controversé de [Nicola Sacco et Bartolomeo Vanzetti](https://perma.cc/3VZK-PLDG) qui a mené à l'exécution des deux individus. Bly est reliée à son pseudonyme, à son mari et à ses écrits portant sur les institutions psychiatriques. Du Bois est relié aux questions de race et à sa carrière universitaire. Quant à Tarbell, ce sont les thèmes sur lesquels elle écrit qui la définissent : les affaires, les monopoles, le géant du pétrole Standard Oil et le président américain Abraham Lincoln. En allant un peu plus loin, je pourrais argumenter que la discussion du genre semble plus caractéristique des nécrologies de femmes, tandis que la question raciale n'apparaît parmi les termes les plus importants que dans le cas du seul Afro-Américain de la liste. + +Chacune de ces observations nécessite d’être approfondie et ne doit pas impliquer une généralisation. D'abord, je dois vérifier si les paramètres que j'ai choisis pour **tf-idf** produisent des effets qui pourraient disparaître dans d'autres conditions ; des résultats probants devraient être assez stables pour résister à ce genre d'ajustements. Notez que nous discuterons de certains de ces paramètres dans la section [« Paramètres Scikit-Learn »](#paramètres-scikit-learn). Je devrai ensuite lire au moins quelques-unes des nécrologies pour m'assurer que certains termes ne me transmettent pas de faux signaux. En lisant la nécrologie de Du Bois, par exemple, je pourrais constater que les mentions de son oeuvre « The Encyclopedia of the Negro » contribue au moins en partie à la valeur du score du mot _negro_ dans le texte. + +Par ailleurs, je pourrais découvrir que la nécrologie de Bly inclut effectivement des mots comme _journalism_, _journalistic_, _newspapers_ (journaux) et _writing_ (écriture), mais cette nécrologie est très courte et la plupart des mots qui y apparaissent ne le font qu'une ou deux fois. Des mots qui ont de très forts scores **idf** sont donc plus susceptibles d'apparaître au sommet de sa liste. Puisque je veux vraiment équilibrer les poids de **tf** et d'**idf**, je pourrais ne pas tenir compte des mots qui apparaissent seulement dans quelques documents ou encore ignorer les résultats provenant de nécrologies dont la longueur est inférieure à un certain seuil. + +Enfin, je peux concevoir des tests pour répondre directement à des questions comme: est-ce que les nécrologies d'Afro-Américains sont plus susceptibles de mentionner la race ? Je crois que l'hypothèse « oui » est plausible mais je devrais tout de même assujettir mes hypothèses à l'épreuve d'un examen minutieux avant de tirer d'en des conclusions. + +## Quelques manières d'utiliser tf-idf en histoire numérique + +Comme je l'ai déjà mentionné, **tf-idf** provient du domaine de la reherche d'informations. La normalisation de la fréquence d'occurrence de mots dans les différents documents d'un corpus constitue d'ailleurs toujours une opération courante dans l'industrie du développement Web, notamment dans le cas des moteurs de recherche textuels. En contexte d'analyse culturelle ou d'histoire numérique, cependant, la pertinence de **tf-idf** se limite à des tâches bien précises. En général, celles-ci appartiennent à l'une de trois catégories : + +### 1. Outil d'exploration ou de visualisation + +Nous avons déjà démontré que des listes de mots accompagnées de scores **tf-idf** pour chacun des documents d'un corpus peuvent constituer de puissants outils d'interprétation. Elles peuvent notamment suggérer des hypothèses ou des questions de recherche. Ces listes peuvent aussi former les bases de stratégies d'exploration et de visualisation plus sophistiquées. L'article [« A full-text visualization of the Iraq War Logs »](https://perma.cc/QBZ4-DKTE) de Jonathan Stray et Julian Burgess en constitue un bon exemple.[^11] Stray et Burgess utilisent des valeurs **tf-idf** pour construire une visualisation de réseau dans laquelle des registres de la guerre en Irak sont reliés à leurs mots-clés les plus distinctifs. Cette technique de visualisation d'information textuelle a permis à Stray de développer le [projet Overview](https://perma.cc/L8PN-KQ5B), qui propose aux usagers un tableau de bord à partir duquel naviguer dans des milliers de documents pour visualiser leurs contenus. Nous pourrions employer cette approche pour visualiser notre corpus nécrologique et peut-être y identifier des groupes d'articles dont les mots-clés se ressemblent. + +### 2. Outil pour calculer la similarité des textes et des ensembles de traits caractéristiques + +Puisque **tf-idf** produit souvent des scores bas pour les mots structurels fréquents et des scores plus élevés pour les mots associés au contenu thématique d'un texte, cette méthode est appropriée pour les tâches qui requièrent l'identification de similarités entre des textes. Un moteur de recherche appliquera souvent **tf-idf** à un corpus pour ensuite proposer à l'usager des résultats classés en fonction de la [similarité cosinus](https://perma.cc/9NV6-SS9G) entre les documents et les mots-clés de recherche entrés par l'usager. Le même raisonnement s'applique à des questions comme: « quelle nécrologie de notre corpus ressemble le plus à celle de Nellie Bly » ? + +Nous pouvons aussi utiliser **tf-idf** pour découvrir les mots les plus importants dans un document ou dans un groupe de documents. Par exemple, je pourrais regrouper un ensemble de nécrologies de journalistes (dont celle de Nellie Bly) dans un seul document avant d'appliquer **tf-idf** à celui-ci. Les résultats de l'opération pourraient servir de règle heuristique pour identifier des termes spécifiques aux nécrologies de journalistes, en comparaison avec l'ensemble des nécrologies du corpus. La liste de mots ainsi obtenue pourrait ensuite servir dans une variété d'autres tâches informatiques. + +### 3. Étape de prétraitement + +Les paragraphes ci-dessus ont permis d'introduire les raisons pour lesquelles le score **tf-idf** sert souvent d'étape de prétraitement dans les calculs d'apprentissage automatique. Par exemple, les scores **tf-idf** ont tendance à être plus révélateurs que les décomptes bruts lorsqu'on développe un modèle de classification par apprentissage automatique supervisé, notamment parce qu'ils augmentent les poids des mots reliés aux thèmes des documents tout en réduisant ceux des mots structurels fréquents. Il existe cependant une exception notable à cette règle : l'identification de l'auteur d'un texte anonyme, pour laquelle les mots structurels ont une forte valeur prédictive. + +
+

Note du traducteur : la leçon intitulée « Introduction à la stylométrie en Python » présente une application de ce genre de calculs.

+
+ +Comme nous le verrons dans la section sur les [paramètres de Scikit-Learn](#paramètres-scikit-learn), **tf-idf** peut aussi émonder les listes de traits caractéristiques des modèles d'apprentissage automatique ; or, il est souvent préférable de développer des modèles basés sur le moins de traits caractéristiques possible. + +## Variations sur le thème de tf-idf + +### Paramètres Scikit-Learn + +L'objet `TfidfVectorizer` de Scikit-Learn dispose de plusieurs paramètres internes qu'on peut modifier pour influencer les résultats de calcul. En règle générale, tous ces paramètres ont leurs avantages et leurs inconvénients : il n'existe pas de configuration parfaite unique. Il est donc préférable de bien connaître chacun des réglages possibles afin de pouvoir expliquer et défendre vos choix le moment venu. La liste complète des paramètres peut être consultée dans la [documentation de Scikit-Learn](https://perma.cc/JUN8-39Z6) ; en voici quelques-uns parmi les plus importants : + +#### 1. Mots vides (stopwords) + +Dans le code ci-dessus, j'ai utilisé `stop_words=None` mais `stop_words='english'` est aussi disponible. Ce réglage filtrera automatiquement de votre corpus les mots très courants, comme « the », « to », and « of », qui apparaissent dans une [liste prédéfinie](https://perma.cc/6CSZ-G9BL). Notez que la plupart de ces mots vides ont probablement déjà des scores **tf-idf** très bas en raison de leur ubiquité, même si d'autres réglages peuvent influencer ces scores. Pour une discussion des listes de mots vides qu’on retrouve dans divers outils open-source de traitement du langage naturel, veuillez lire [« Stop Word Lists in Free Open-source Software Packages »](https://perma.cc/V5WN-4E8P). + +
+Note du traducteur : il est aussi possible de remplacer « None » par une liste de mots vides personnalisée, comme `stop_words=['le', 'la', 'les']`. Si vous travaillez avec des documents en français, il s'agit d'une alternative potentiellement plus efficace que de se fier au faible score tf-idf de la plupart des mots-vides. +
+ +#### 2. min_df, max_df + +Ces paramètres contrôlent le nombre minimal et le nombre maximal de documents dans lesquels un mot doit apparaître pour être inclus dans les calculs. Les deux paramètres peuvent être exprimés sous forme de nombres réels entre 0 et 1, qui représentent alors des pourcentages de l'ensemble du corpus, ou sous forme de nombres entiers qui représentent des décomptes de documents bruts. En règle générale, spécifier une valeur inférieure à 0.9 pour max_df éliminera la majorité (voire la totalité) des mots vides. + +#### 3. max_features + +Ce paramètre élague les termes les moins fréquents du corpus avant d'appliquer **tf-idf**. Il peut être particulièrement utile en contexte d'apprentissage automatique, où l'on ne souhaite habituellement pas dépasser le nombre de traits caractéristiques recommandé par les concepteurs de l'algorithme choisi. + +#### 4. norm, smooth_idf, and sublinear_tf + +Chacun de ces paramètres influencera l'éventail de valeurs numériques que l'algorithme **tf-idf** produira. Le paramètre `norm` est compatible avec la normalisation l1 et l2, expliquée sur [machinelearningmastery.com](https://perma.cc/3ULS-SUB2). `Smooth_idf` lisse les résultats en ajoutant la valeur 1 à chaque fréquence de document, comme s'il existait un document additionnel qui contient exactement une occurrence de tous les mots qui apparaissent dans le corpus. `Sublinear_tf'` applique une opération de changement d'échelle aux résultats en remplaçant tf par log(tf). Pour plus de détails au sujet du lissage et de la normalisation dans le contexte de **tf-idf**, veuillez consulter Manning, Raghavan et Schütze.[^12] + +### Traits caractéristiques : au-delà des mots + +Le concept fondamental de **tf-idf**, qui consiste à pondérer les décomptes d'occurrences en fonction du nombre de documents dans lesquels les mots apparaissent, peut s'appliquer à d'autres traits caractéristiques des textes. Par exemple, il est relativement facile de combiner **tf-idf** avec la [racinisation](https://perma.cc/WV3J-BF3B) ou la [lemmatisation](https://perma.cc/T3XA-Q9HG), deux méthodes courantes qui permettent de regrouper de multiples déclinaisons et conjugaisons du même mot en une seule forme. Par exemple, la racine de _happy_ et _happiness_ est _happi_ tandis que le lemme qui les regroupe est _happy_. Une fois la racinisation ou la lemmatisation complétée, on peut remplacer les décomptes de mots par les décomptes de racines ou de lemmes avant d'appliquer **tf-idf**. Notez que, puisque ces opérations fusionnent plusieurs formes apparentées en une seule, les lemmes et les racines auront des décomptes d'occurrences plus élevés que chacun des mots qu'ils regroupent, et donc des valeurs **tf-idf** habituellement plus basses. + +On peut aussi appliquer la transformation **tf-idf** à des locutions ou à des n-grammes, c'est-à-dire à des séquences de mots consécutifs. Un article intitulé [« These Are The Phrases Each GOP Candidate Repeats Most »](https://perma.cc/37WS-MB8F), publié sur fivethirtyeight.com en mars 2016, utilise cette approche pour calculer les fréquences inverses de documents de phrases entières plutôt que celles de mots.[^13] + +## tf-idf et méthodes alternatives communes + +On peut comparer **tf-idf** à plusieurs autres méthodes qui servent à isoler et/ou à classifier les mots les plus importants dans un document ou dans une collection de documents. Cette section mentionne brièvement trois de ces méthodes alternatives, apparentées mais distinctes, qui mesurent des aspects similaires mais non identiques de l'information textuelle. + +### 1. Spécificité (Keyness) + +Plutôt que de transformer les décomptes d'occurrences à l'aide de calculs, la spécificité produit une valeur numérique qui indique jusqu'à quel point la présence d'un mot dans un document est statistiquement typique ou atypique par rapport à l'ensemble du corpus. Par exemple, à l'aide d'un [test du khi-carré](https://perma.cc/4Z2W-SZCS), il est possible de mesurer l'écart entre la fréquence d'occurrence d'un mot et la norme du corpus, puis de dériver une [valeur p](https://perma.cc/X3AW-F6B9) qui indique la probabilité d'observer cette fréquence d'occurrence dans un échantillon aléatoire. Pour plus d'information sur la spécificité, voir Bondi et Scott.[^14] + + +
+Note du traducteur  : En anglais, « keyness » est un terme générique qui regroupe toute une panoplie de mesures statistiques qui tentent d'assigner une signification quantifiable à la présence d'un terme dans un document ou dans un ensemble de documents, en comparaison avec un corpus plus étendu. En français, le terme « spécificité » a acquis un sens plus précis suite aux travaux de Pierre Lafon ; voir notamment l'article de 1980 « Sur la variabilité de la fréquence des formes dans un corpus », publié dans la revue Mots, vol. 1, no. 1. +
+ +### 2. Modèles thématiques + +La modélisation thématique et **tf-idf** sont des techniques radicalement différentes, mais je constate que les néophytes en matière d'humanités numériques désirent souvent modéliser les thèmes d'un corpus dès le début alors que **tf-idf** constituerait parfois un meilleur choix.[^15] Puisque l'algorithme est transparent et que ses résultats sont reproductibles, **tf-idf** est particulièrement utile lorsqu'on souhaite obtenir une vue d'ensemble d'un corpus, à vol d'oiseau, pendant la phase d'exploration initiale de la recherche. Comme le mentionne Ben Schmidt, les chercheurs qui emploient la modélisation thématique doivent reconnaître que les thèmes qui en ressortent ne sont pas forcément aussi cohérents qu'on le souhaiterait.[^16] C'est l'une des raisons pour lesquelles **tf-idf** a été intégré au [projet Overview](https://perma.cc/L8PN-KQ5B). + +Les modèles thématiques peuvent aussi aider les chercheurs à explorer leurs corpus et ils offrent de nombreux avantages, notamment la capacité de suggérer de vastes catégories ou « communautés » de textes, mais il s'agit d'une caractéristique commune à l'ensemble des méthodes d'apprentissage automatique non supervisées. Les modèles thématiques sont particulièrement attrayants parce qu'ils assignent à chaque document des valeurs numériques qui mesurent jusqu'à quel point chacun des thèmes y est important et parce qu'ils représentent ces thèmes sous forme de listes de mots coprésents, ce qui suscite de fortes impressions de cohérence. Cependant, l'algorithme probabiliste qui sous-tend la modélisation thématique est très sophistiqué et simple d'en déformer les résultats si l'on n'est pas assez prudent. Les mathématiques derrière **tf-idf**, elles, sont assez simples pour être expliquées dans une feuille de calcul Excel. + +### 3. Résumé automatique des textes + +Le résumé automatique est une autre manière d'explorer un corpus. Rada Mihalcea et Paul Tarau, par exemple, ont publié au sujet de TextRank, un modèle de classement basé sur la théorie des graphes, aux possibilités prometteuses pour l'extraction automatique de mots et de phrases-clés.[^17] Comme dans le cas de la modélisation thématique, TextRank approche la recherche d'informations d'une manière complètement différente du **tf-idf** mais les objectifs des deux algorithmes ont beaucoup en commun. Cette méthode pourrait être appropriée pour votre propre recherche, surtout si votre but consiste à obtenir assez rapidement une impression générale du contenu de vos documents avant de construire un projet de recherche plus poussé. + +# Références et lectures supplémentaires + +- Milo Beckman, « These Are The Phrases Each GOP Candidate Repeats Most, », _FiveThirtyEight_, le 10 mars 2016, consulté le 9 juin 2022, [https://fivethirtyeight.com/features/these-are-the-phrases-each-gop-candidate-repeats-most/](https://perma.cc/37WS-MB8F). + +- Jessica Bennett et Amisha Padnani, « Overlooked », _The New York Times_, 8 mars 2018, [https://www.nytimes.com/interactive/2018/obituaries/overlooked.html](https://perma.cc/HWZ7-XS23). + +- David M. Blei, Andrew Y. Ng et Michael I. Jordan, « Latent Dirichlet Allocation« , _Journal of Machine Learning Research_ 3 (Janvier 2003): 993-1022. + +- Marina Bondi et Mike Scott, dirs. _Keyness in Texts_. Philadelphie: John Benjamins, 2010. + +- Scikit-Learn Developers « TfidfVectorizer »(en anglais), consulté le 9 juin 2022, [https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html](https://perma.cc/JUN8-39Z6). + +- Justin Grimmer et Gary King. [« Quantitative Discovery from Qualitative Information: A General-Purpose Document Clustering Methodology (2009) »](https://perma.cc/4YAL-H6VN), _Rencontre APSA 2009 à Toronto_, le 24 août 2009, [PDF](https://perma.cc/NUS2-J3YP). + +- « Ida M. Tarbell, 86, Dies in Bridgeport », [_The New York Times_, 17 janvier 1944](https://perma.cc/NBV6-S2XM). + +- Pierre Lafon, « Sur la variabilité de la fréquence des formes dans un corpus », _Mots_ 1, no. 1 (1980): 127-165. + +- C.D. Manning, P. Raghavan et H. Schütze, _Introduction to Information Retrieval_. Cambridge: Cambridge University Press, 2008. + +- Rada Mihalcea et Paul Tarau. « Textrank: Bringing order into text », _Proceedings of the 2004 Conference on Empirical Methods in Natural Language Processing_, Barcelone, Espagne, 2004. [http://www.aclweb.org/anthology/W04-3252](https://perma.cc/SMV5-7MYY) + +- « Nellie Bly, Journalist, Dies of Pneumonia », [_The New York Times_, 28 janvier 1922](https://perma.cc/LA5B-65HL). + +- G. Salton et M.J. McGill, _Introduction to Modern Information Retrieval_. New York: McGraw-Hill, 1983. + +- Ben Schmidt, « Do Digital Humanists Need to Understand Algorithms? », _Debates in the Digital Humanities 2016_. Édition en ligne. Minneapois: University of Minnesota Press. [http://dhdebates.gc.cuny.edu/debates/text/99](https://perma.cc/95WD-SDM5). + +- Ben Schmidt, « Words Alone: Dismantling Topic Models in the Humanities », _Journal of Digital Humanities_. Vol. 2, No. 1 (2012): n.p. [http://journalofdigitalhumanities.org/2-1/words-alone-by-benjamin-m-schmidt/](https://perma.cc/LT4N-X4MZ). + +- Karen Spärck Jones, « A Statistical Interpretation of Term Specificity and Its Application in Retrieval. », _Journal of Documentation_ 28, no. 1 (1972): 11–21. + +- Jonathan Stray et Julian Burgess. « A Full-text Visualization of the Iraq War Logs », 10 décembre 2010 (dernière mise à jour en avril 2012), [http://jonathanstray.com/a-full-text-visualization-of-the-iraq-war-logs](https://perma.cc/QBZ4-DKTE). + +- Ted Underwood, « Identifying diction that characterizes an author or genre: why Dunning's may not be the best method », _The Stone and the Shell_, 9 novembre 2011, [https://tedunderwood.com/2011/11/09/identifying-the-terms-that-characterize-an-author-or-genre-why-dunnings-may-not-be-the-best-method/](https://perma.cc/SY25-UXK3). + +- Ted Underwood, « The Historical Significance of Textual Distances », Atelier LaTeCH-CLfL (Version préimpression), COLING, Santa Fe, 2018, [https://doi.org/10.48550/arXiv.1807.00181](https://doi.org/10.48550/arXiv.1807.00181). + +- Guido van Rossum, Barry Warsaw et Nick Coghlan. « PEP 8 - Style Guide for Python Code », 5 juillet 2001 (mise à jour août 2013), [https://www.python.org/dev/peps/pep-0008/](https://perma.cc/P2ZM-VPQM). + +- Alden Whitman, « Upton Sinclair, Author, Dead; Crusader for Social Justice, 90 », [_The New York Times_, 26 novembre 1968](https://perma.cc/E4N7-2KD6). + +- « W. E. B. DuBois Dies in Ghana; Negro Leader and Author, 95 », [_The New York Times_, 28 août 1963](https://perma.cc/W5NX-XZRV). + +- « Willa Cather Dies; Noted Novelist, 70 », [_The New York Times_, 25 avril 1947](https://perma.cc/2L7H-WGKN). + +## Alternatives à Anaconda + +Si vous n'utilisez pas Anaconda, il faudra vous assurer de disposer des outils prérequis suivants : + +1. Une installation de Python 3 (préférablement Python 3.6 ou une version plus récente) +2. Idéalement, un environnement virtuel dans lequel installer et exécuter le Python +3. Le module Scikit-Learn et ses dépendances (voir [http://scikit-learn.org/stable/install.html](http://scikit-learn.org/stable/install.html)) +4. Jupyter Notebook et ses dépendances + +# Notes + +[^1]: Ted Underwood, « Identifying diction that characterizes an author or genre: why Dunning's may not be the best method », _The Stone and the Shell_, 9 novembre 2011, [https://tedunderwood.com/2011/11/09/identifying-the-terms-that-characterize-an-author-or-genre-why-dunnings-may-not-be-the-best-method/](https://perma.cc/SY25-UXK3). + +[^2]: Jessica Bennett et Amisha Padnani, « Overlooked », _The New York Times_, 8 mars 2018, [https://www.nytimes.com/interactive/2018/obituaries/overlooked.html](https://perma.cc/HWZ7-XS23). + +[^3]: Ce jeu de données est tiré d'une version du site « On This Day » du *New York Times* qui n'a pas été mise à jour depuis le 31 janvier 2011 et qui a été remplacée par un nouveau blogue plus élégant situé au [https://learning.blogs.nytimes.com/on-this-day/](https://perma.cc/W627-RBUS). Ce qui reste sur le site "On This Day" est une page HTML statique pour chaque jour de l'année (0101.html, 0102.html, etc.), y compris une page pour le 29 février (0229.html). Le contenu semble avoir été écrasé à chaque mise à jour ; il n'y a donc pas d'archives du contenu publié à chaque année. On peut présumer que les pages associées aux jours de janvier ont été mises à jour pour la dernière fois en 2011, tandis que celles pour les dates entre le 1er février et de 31 décembre ont probablement été mises à jour pour la dernière fois en 2010. La page du 29 février a probablement été changée pour la dernière fois le 29 février 2008. + +[^4]: Karen Spärck Jones, « A Statistical Interpretation of Term Specificity and Its Application in Retrieval. », _Journal of Documentation_ 28, no. 1 (1972): 16. + +[^5]: « Nellie Bly, Journalist, Dies of Pneumonia », [_The New York Times_, 28 janvier 1922: 11](https://perma.cc/LA5B-65HL). + +[^6]: Scikit-Learn Developers, « TfidfVectorizer » (en anglais), consulté le 9 juin 2022, [https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html](https://perma.cc/JUN8-39Z6). + +[^7]: Ben Schmidt, « Do Digital Humanists Need to Understand Algorithms? », _Debates in the Digital Humanities 2016_. Édition en ligne. Minneapolis: University of Minnesota Press. [http://dhdebates.gc.cuny.edu/debates/text/99](https://perma.cc/95WD-SDM5). + +[^8]: Guido van Rossum, Barry Warsaw et Nick Coghlan. « PEP 8 - Style Guide for Python Code », 5 juillet 2001 (mise à jour août 2013), [https://www.python.org/dev/peps/pep-0008/](https://perma.cc/P2ZM-VPQM). + +[^9]: « Ida M. Tarbell, 86, Dies in Bridgeport », [_The New York Times_, 17 janvier 1944](https://perma.cc/NBV6-S2XM); « W. E. B. DuBois Dies in Ghana; Negro Leader and Author, 95 », [_The New York Times_, 28 août 1963](https://perma.cc/W5NX-XZRV); Alden Whitman, « Upton Sinclair, Author, Dead; Crusader for Social Justice, 90 », [_The New York Times_, 26 novembre 1968](https://perma.cc/E4N7-2KD6); « Willa Cather Dies; Noted Novelist, 70 », [_The New York Times_, 25 avril 1947](https://perma.cc/2L7H-WGKN). + +[^10]: Jonathan Stray et Julian Burgess. « A Full-text Visualization of the Iraq War Logs », 10 décembre 2010 (dernière mise à jour en avril 2012), [http://jonathanstray.com/a-full-text-visualization-of-the-iraq-war-logs](https://perma.cc/QBZ4-DKTE). + +[^11]: C.D. Manning, P. Raghavan et H. Schütze, _Introduction to Information Retrieval_ (Cambridge: Cambridge University Press, 2008), 118-120. + +[^12]: Milo Beckman, « These Are The Phrases Each GOP Candidate Repeats Most », _FiveThirtyEight_, le 10 mars 2016, consulté le 9 juin 2022, [https://fivethirtyeight.com/features/these-are-the-phrases-each-gop-candidate-repeats-most/](https://perma.cc/37WS-MB8F). + +[^13]: Marina Bondi et Mike Scott (dir.). _Keyness in Texts_. (Philadelphie: John Benjamins, 2010). + +[^14]: Il n'est habituellement pas recommandé d'appliquer **tf-idf** comme prétraitement avant de produire un modèle thématique. Voir : [https://datascience.stackexchange.com/questions/21950/why-we-should-not-feed-lda-with-tfidf](https://perma.cc/N5W9-TYX7). + +[^15]: Ben Schmidt, « Words Alone: Dismantling Topic Models in the Humanities », _Journal of Digital Humanities_. Vol. 2, No. 1 (2012): n.p., [http://journalofdigitalhumanities.org/2-1/words-alone-by-benjamin-m-schmidt/](https://perma.cc/LT4N-X4MZ). + +[^16]: Rada Mihalcea et Paul Tarau. « Textrank: Bringing order into text », _Proceedings of the 2004 Conference on Empirical Methods in Natural Language Processing_, Barcelone, Espagne, 2004, [http://www.aclweb.org/anthology/W04-3252](https://perma.cc/SMV5-7MYY). diff --git a/fr/nos-soutiens.md b/fr/nos-soutiens.md index ac52ce75d1..fa63ec41c8 100644 --- a/fr/nos-soutiens.md +++ b/fr/nos-soutiens.md @@ -22,7 +22,6 @@ Les institutions suivantes font partie de notre programme de [Partenariat instit - [Princeton University](https://www.princeton.edu/), États-Unis - [Transkribus - READ COOP](https://readcoop.eu/), Autriche - [RStudio, PBC](https://rstudio.com/), États-Unis -- [CESTA, Stanford University](https://cesta.stanford.edu/), États-Unis - [University of Waterloo](https://uwaterloo.ca/), Canada - [Universidad de los Andes](https://uniandes.edu.co/), Colombie - [Royal Danish Library / Copenhagen University Library](https://www.kb.dk), Danemark @@ -30,7 +29,6 @@ Les institutions suivantes font partie de notre programme de [Partenariat instit - [Roskilde University Library](https://ruc.dk/en/roskilde-university-library), Danemark - [Cambridge Digital Humanities](https://www.cdh.cam.ac.uk/), Royaume-Uni - [Georg-August-Universität Göttingen](https://www.uni-goettingen.de/), Allemagne -- [Purdue University](https://www.purdue.edu/), États-Unis - [MIT Libraries](https://libraries.mit.edu/), États-Unis - [University of Nebraska-Lincoln](https://www.unl.edu/), États-Unis - [The National Archives](https://www.nationalarchives.gov.uk/), Royaume-Uni @@ -41,6 +39,9 @@ Les institutions suivantes font partie de notre programme de [Partenariat instit - [School of Advanced Study, University of London](https://www.sas.ac.uk/), Royaume-Uni - [University of Lancaster Library](https://www.lancaster.ac.uk/), Royaume-Uni - [Research Centre for Digital Publishing and Digital Humanities, Beijing Normal University at Zhuhai](https://rsgyy.bnu.edu.cn/yjjg/szcbyszrwyjzx/), Chine +- [Department of Digital Humanities](https://www.kcl.ac.uk/ddh) and [Department of History](https://www.kcl.ac.uk/history), King's College London, Royaume-Uni +- [Department of Information Studies, University College London](https://www.ucl.ac.uk/information-studies/), Royaume-Uni +- [Sussex Humanities Lab](https://www.sussex.ac.uk/research/centres/sussex-humanities-lab/), Royaume-Uni Nous accueillons volontiers les demandes de renseignements des contributeurs potentiels au [Partenariat institutionnel](pi). diff --git a/fr/recherche.md b/fr/recherche.md index a72e41e197..963379cbe3 100644 --- a/fr/recherche.md +++ b/fr/recherche.md @@ -19,6 +19,7 @@ L'équipe du projet et les membres de la communauté plus large qui la compose s ## Publications scientifiques +* Matthew Lincoln, Sarah Melton, Jennifer Isasi, François Dominic Laramée, '[Relocating Complexity: The Programming Historian and Multilingual Static Site Generation](http://www.digitalhumanities.org/dhq/vol/16/2/000585/000585.html)', _Digital Humanities Quarterly_ 16, 2 (2022). * Jennifer Isasi et Antonio Rojas Castro, ‘[¿Sin equivalencia? Una reflexión sobre la traducción al español de recursos educativos abiertos](https://muse.jhu.edu/article/842253)’, _Hispania_, 104, no. 4 (2021), 613-624. * Adam Crymble et Maria José Afanador Llach, ‘The Globally Unequal Promise of Digital Tools for History: UK and Colombia Case Study’ in Adele Nye (ed.) _Teaching History for the Contemporary World_ (Springer, 2021), 85-98. * Daniel Alves, ['Ensinar Humanidades Digitais sem as Humanidades Digitais: um olhar a partir das licenciaturas em História'](https://novaresearch.unl.pt/files/32228034/Ensinar_Humanidades_Digitais.pdf), _Revista EducaOnline_, v. 15, n. 2 (2021). @@ -34,7 +35,7 @@ L'équipe du projet et les membres de la communauté plus large qui la compose s ## Ateliers et manifestations -* Sofia Papastamkou, Hugues Pecout, Sébastien Rey-Coyrehourcq, Timothée Giraud, Gwenaëlle Patat, Margot Mellet, Servanne Monjour & Nicolas Sauret, ‘_Programming Historian en français_, Rzine, ... & Tutos : Faire communauté autour des dispositifs et des formats alternatifs du savoir’, [Colloque Humanistica 2022: Association francophone des humanités numériques](https://humanistica2022.sciencesconf.org/program/details), (18 mai 2022). +* Sofia Papastamkou, Hugues Pecout, Sébastien Rey-Coyrehourcq, Timothée Giraud, Gwenaëlle Patat, Margot Mellet, Servanne Monjour & Nicolas Sauret, ‘_Programming Historian en français_, Rzine, ... & Tutos: Faire communauté autour des dispositifs et des formats alternatifs du savoir’, [Colloque Humanistica 2022: Association francophone des humanités numériques](https://humanistica2022.sciencesconf.org/program/details), (18 mai 2022). * Jennifer Isasi & Brandon Walsh with Gabi Kirilloff, ‘[_Programming Historian_ Workshop on Twine in the Classroom](https://ach.org/blog/2022/02/15/ach-programming-historian-workshop-on-twine-in-the-classroom/)’, Association for Computers and the Humanities, États Unis (13 avril 2022). * Daniel Alves & Joana Vieira Paulino, ‘[O _Programming Historian em português_ e o ensino das Humanidades Digitais](https://www.letras.ulisboa.pt/pt/agenda/2-seminario-cecomp-hd-o-programming-historian-em-portugues-e-o-ensino-das-humanidades-digitais)’, 2.º Seminário CEComp-HD, Centro de Estudos Comparatistas da Faculdade de Letras, Universidade de Lisboa, Portugal, (23 mars 2022). * Adam Crymble & Anisa Hawes, ‘[Training the Teacher: Giving your first Digital History Workshop](https://www.history.ac.uk/our-century/centenary-events/training-teacher-giving-your-first-digital-history-workshop)’, Institute of Historical Research, Royaume-Uni (18 novembre 2021). @@ -60,10 +61,12 @@ L'équipe du projet et les membres de la communauté plus large qui la compose s * Adam Crymble, 'Python Programming for Humanists', _Day of Digital Ideas_, Université d'Edimbourg (26 mai 2015). ## Posters, présentations et conférences invitées +* Matthias Gille Levenson, Sofia Papastamkou & Célian Ringwald, '_Programming Historian_: un lieu de collaborations et d'interactions multiples', [DHNord 2022](https://www.meshs.fr/page/dhnord2022.5): Travailler en humanités numériques: collaborations, complémentarités et tensions, Lille, France, (22 juin 2022). * Adam Crymble, 'Local Needs for Global Digital Scholarship', _Quo Vadis_, UCL, Royaume-Uni (9 juin 2022). -* Matthias Gille Levenson & Gwenaëlle Patat, ‘_Programming Historian en français_ : Faire communauté pour le partage de ressources éducatives libres sur les méthodes numériques en sciences humaines et sociales francophones’, [Colloque Humanistica 2022: Association francophone des humanités numériques](https://hal.archives-ouvertes.fr/hal-03672420), Montréal, Canada (mai 2022). +* Matthias Gille Levenson & Gwenaëlle Patat, ‘_Programming Historian en français_: Faire communauté pour le partage de ressources éducatives libres sur les méthodes numériques en sciences humaines et sociales francophones’, [Colloque Humanistica 2022: Association francophone des humanités numériques](https://hal.archives-ouvertes.fr/hal-03672420), Montréal, Canada (mai 2022). +* Eric Brasil, '[Criação, manutenção e divulgação de projetos de História em meios digitais: git, GitHub e o _Programming Historian_](https://doi.org/10.5281/zenodo.6566754)’ ([diapositives](https://ericbrasiln.github.io/hdfgv/), [vidéo](https://youtu.be/aJvjkSBETBw)), Escola de Cinências Sociais, Fundação Getúlio Vargas/Centro de Pesquisa e Documentação de História Contemporânea do Brasil, (20 mai 2022). * Sofia Papastamkou, ‘Penser la pédagogie aux méthodes numériques au prisme de la reproductibilité: le cas du _Programming Historian_’, [Journées annuelles du réseau MATE-SHS: Recherche reproductible: regards croisés en sciences humaines et sociales](https://ja-mate2022.sciencesconf.org/resource/page/id/1), Paris, France, (17-18 mai 2022). -* Eric Brasil, ‘[Criação, manutenção e divulgação de projetos de História em meios digitais: git, GitHub e o _Programming Historian_](https://cpdoc.fgv.br/eventos/20052022)’, Escola de Cinências Sociais, Fundação Getúlio Vargas/Centro de Pesquisa e Documentação de História Contemporânea do Brasil, (16 mai 2022). +* Eric Brasil, ‘[Hemeroteca digital brasileira e a pesquisa histórica: reflexões sobre teoria e prática](https://doi.org/10.5281/zenodo.6568346)’ ([diapositives](https://ericbrasiln.github.io/hdufrn/), [vidéo](https://youtu.be/Uu3I9_a2knc)), Laboratório História e Memória da Educação - LAHMED da UFRN, (17 mai 2022). * Adam Crymble, 'Building Methods with the Global South' Research Methodology Conference, Coventry, Royaume-Uni, (20 avril 2022). * Adam Crymble, ‘[Trans-Atlantic Digital History and the Spatial Turn of Practice (as viewed from London)](https://ihrdighist.blogs.sas.ac.uk/2021/09/tuesday-29th-march-2022-dr-adam-crymble-ucl-trans-atlantic-digital-history/)’ Institute of Historical Research Digital History Seminar, London, Royaume-Uni, (29 mars 2022). * Jennifer Isasi, ‘El flujo editorial en _Programming Historian en español_’ Edición Digital de Textos, Máster Universitario en Humanidades Digitales, Universidad Internacional de La Rioja, Espagne, (2021-2022). diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-1.PNG b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-1.PNG new file mode 100644 index 0000000000..564553b30d Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-1.PNG differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-10.png b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-10.png new file mode 100644 index 0000000000..29a8279ed1 Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-10.png differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-11.png b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-11.png new file mode 100644 index 0000000000..af2a8ae402 Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-11.png differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-12.png b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-12.png new file mode 100644 index 0000000000..7227d78e27 Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-12.png differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-13.PNG b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-13.PNG new file mode 100644 index 0000000000..87ba89c9fa Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-13.PNG differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-14.png b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-14.png new file mode 100644 index 0000000000..81106e8d28 Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-14.png differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-15.png b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-15.png new file mode 100644 index 0000000000..d41dfdc628 Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-15.png differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-16.png b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-16.png new file mode 100644 index 0000000000..bc1604fee5 Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-16.png differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-2.PNG b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-2.PNG new file mode 100644 index 0000000000..06e117b651 Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-2.PNG differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-4.png b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-4.png new file mode 100644 index 0000000000..9f6fbca1d4 Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-4.png differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-5.png b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-5.png new file mode 100644 index 0000000000..cf89bf83f0 Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-5.png differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-6.png b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-6.png new file mode 100644 index 0000000000..b917a99525 Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-6.png differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-7.png b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-7.png new file mode 100644 index 0000000000..28f630319d Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-7.png differ diff --git a/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-8.png b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-8.png new file mode 100644 index 0000000000..dd6605af1e Binary files /dev/null and b/images/getting-started-with-mysql-using-r/introducao-ao-mysql-e-r-8.png differ diff --git a/images/introduction-to-stylometry-with-python/introducao-estilometria-python-01.jpeg b/images/introduction-to-stylometry-with-python/introducao-estilometria-python-01.jpeg new file mode 100644 index 0000000000..c47df7b6b6 Binary files /dev/null and b/images/introduction-to-stylometry-with-python/introducao-estilometria-python-01.jpeg differ diff --git a/pt/apoiadores.md b/pt/apoiadores.md index c11e1e3ef2..ee3ee5d78b 100644 --- a/pt/apoiadores.md +++ b/pt/apoiadores.md @@ -25,7 +25,6 @@ Contribuintes para o nosso [Programa de Parceria Institucional](/pt/ppi). - [Princeton University](https://www.princeton.edu/), Estados Unidos - [Transkribus - READ COOP](https://readcoop.eu/), Áustria - [RStudio, PBC](https://rstudio.com/), Estados Unidos -- [CESTA, Stanford University](https://cesta.stanford.edu/), Estados Unidos - [University of Waterloo](https://uwaterloo.ca/), Canadá - [Universidad de los Andes](https://uniandes.edu.co/), Colômbia - [Royal Danish Library / Copenhagen University Library](https://www.kb.dk), Dinamarca @@ -33,7 +32,6 @@ Contribuintes para o nosso [Programa de Parceria Institucional](/pt/ppi). - [Roskilde University Library](https://ruc.dk/en/roskilde-university-library), Dinamarca - [Cambridge Digital Humanities](https://www.cdh.cam.ac.uk/), Reino Unido - [Georg-August-Universität Göttingen](https://www.uni-goettingen.de/), Alemanhã -- [Purdue University](https://www.purdue.edu/), Estados Unidos - [MIT Libraries](https://libraries.mit.edu/), Estados Unidos - [University of Nebraska-Lincoln](https://www.unl.edu/), Estados Unidos - [The National Archives](https://www.nationalarchives.gov.uk/), Reino Unido @@ -44,6 +42,9 @@ Contribuintes para o nosso [Programa de Parceria Institucional](/pt/ppi). - [School of Advanced Study, University of London](https://www.sas.ac.uk/), Reino Unido - [University of Lancaster Library](https://www.lancaster.ac.uk/), Reino Unido - [Research Centre for Digital Publishing and Digital Humanities, Beijing Normal University at Zhuhai](https://rsgyy.bnu.edu.cn/yjjg/szcbyszrwyjzx/), China +- [Department of Digital Humanities](https://www.kcl.ac.uk/ddh) and [Department of History](https://www.kcl.ac.uk/history), King's College London, Reino Unido +- [Department of Information Studies, University College London](https://www.ucl.ac.uk/information-studies/), Reino Unido +- [Sussex Humanities Lab](https://www.sussex.ac.uk/research/centres/sussex-humanities-lab/), Reino Unido Aceitamos consultas de possíveis contribuintes para o [Programa de Parceria Institucional](/pt/ppi). diff --git a/pt/licoes/introducao-estilometria-python.md b/pt/licoes/introducao-estilometria-python.md new file mode 100644 index 0000000000..95d299b834 --- /dev/null +++ b/pt/licoes/introducao-estilometria-python.md @@ -0,0 +1,707 @@ +--- +title: Introdução à estilometria com Python +layout: lesson +slug: introducao-estilometria-python +date: 2018-04-21 +translation_date: 2021-12-27 +authors: +- François Dominic Laramée +reviewers: +- Folgert Karsdorp +- Jan Rybicki +- Antonio Rojas Castro +editors: +- Adam Crymble +translator: +- Daniel Bonatto Seco +translation-editor: +- Jimmy Medeiros +translation-reviewer: +- Bruno Almeida +- Suemi HIguchi +difficulty: 2 +review-ticket: https://github.com/programminghistorian/ph-submissions/issues/445 +activity: analyzing +topics: [distant-reading, python] +abstract: "Nesta lição, aprenderá a realizar análises estilométricas e a determinar a autoria de textos. A lição cobre três métodos: Curvas Características de Composição de Mendenhall, Método Qui-Quadrado de Kilgariff e Método Delta de John Burrows." +original: introduction-to-stylometry-with-python +avatar_alt: Mulher a ler junto a uma pintura +doi: 10.46430/phpt0024 +--- + + +{% include toc.html %} + +# Introdução + +[Estilometria](https://perma.cc/NYH2-KWLA) é o estudo quantitativo do estilo literário por meio de métodos de [leitura distante](https://perma.cc/XK8J-F6ZF) computacional. É baseado na observação de que os autores tendem a escrever de maneiras relativamente consistentes, reconhecíveis e únicas. Por exemplo: + +* Cada pessoa tem seu próprio vocabulário único, às vezes rico, às vezes limitado. Embora um vocabulário mais amplo esteja geralmente associado à qualidade literária, nem sempre é esse o caso. Ernest Hemingway é famoso por usar um número surpreendentemente pequeno de palavras diferentes em sua escrita,[^1] o que não o impediu de ganhar o Prêmio Nobel de Literatura em 1954; +* Algumas pessoas escrevem frases curtas, enquanto outras preferem blocos longos de texto compostos por muitas frases; +* Não há duas pessoas que usem ponto-e-vírgulas, travessões e outras formas de pontuação exatamente da mesma maneira. + +As maneiras como os escritores usam pequenas [*function words*](https://perma.cc/284C-CNHD), como artigos, preposições e conjunções, mostram-se particularmente reveladoras. Em uma pesquisa dos métodos estilométricos históricos e atuais, Efstathios Stamatatos aponta que as palavras funcionais são "usadas de maneira amplamente inconsciente pelos autores e são independentes do tópico"[^2]. Para a análise estilométrica, isso é muito vantajoso, visto que esse padrão inconsciente tende a variar menos no [*corpus*](https://perma.cc/9XQ4-J4A5) de um autor do que seu vocabulário geral (e também é muito difícil para um pretenso falsificador copiar). As palavras funcionais também foram identificadas como marcadores importantes do gênero literário e da cronologia. + +Os pesquisadores têm usado a estilometria como uma ferramenta para estudar uma variedade de questões culturais. Por exemplo, uma quantidade considerável de pesquisas estudou as diferenças entre as maneiras como homens e mulheres escrevem[^3] ou sobre o que escrevem.[^4] Outros pesquisadores estudaram as maneiras como uma mudança repentina no estilo de escrita em um único texto pode indicar plágio[^5] e até mesmo a maneira como as letras dos músicos John Lennon e Paul McCartney se tornaram cada vez menos alegres e menos ativas à medida que os [Beatles](https://perma.cc/DQ66-M79T) se aproximavam do fim de sua carreira de gravação na década de 1960.[^6] + +No entanto, uma das aplicações mais comuns da estilometria é na atribuição de autoria. Dado um texto anônimo, às vezes é possível inferir quem o escreveu medindo certas características, como o número médio de palavras por frase ou a propensão do autor de usar "todavia" em vez de "no entanto", e comparando as medidas com outros textos escritos pelo suposto autor. Este é o objetivo deste tutorial, onde a partir de um conjunto de obras clássicas de romancistas lusos e brasileiros do século XIX iremos comparar exemplares de suas obras com o estilo literário do conjunto de autores a fim de tentar inferir suas respectivas autorias (nota de tradução: foi decidido mudar o _corpus_ usado nesta lição para um que fosse culturalmente mais relevante para o público que fala e escreve português; foi mantida a restante estrutura da lição original, com excepção de ligeiras adaptações face à mudança do _corpus_). + +## Objetivos de aprendizado + +No final desta lição, teremos percorrido os seguintes tópicos: + +* Como aplicar vários métodos estilométricos para inferir a autoria de um texto anônimo ou conjunto de textos; +* Como usar estruturas de dados relativamente avançadas, incluindo [dicionários](https://perma.cc/TTF4-SJ23) de [strings](https://perma.cc/7DCC-M9AT) e dicionários de dicionários, em [Python](https://perma.cc/Z82S-3L3M); +* O básico do [Natural Language Toolkit](https://perma.cc/E7LZ-WECZ) (NLTK), um módulo Python popular dedicado a [processamento de linguagem natural](https://perma.cc/MFX4-LAVZ). + +## Leitura prévia + +Se você não tem experiência com a linguagem de programação Python ou está tendo dificuldade nos exemplos apresentados neste tutorial, o autor recomenda que você leia as lições [Trabalhando com ficheiros de texto em Python](/pt/licoes/trabalhando-ficheiros-texto-python) e [Manipular Strings com Python](/pt/licoes/manipular-strings-python). Note que essas lições foram escritas em Python versão 2, enquanto esta usa Python versão 3. As diferenças de [sintaxe](https://perma.cc/E5LQ-S65P) entre as duas versões da linguagem podem ser sutis. Se você ficar em dúvida, siga os exemplos conforme descritos nesta lição e use as outras lições como material de apoio. (Este tutorial encontra-se atualizado até à versão [Python 3.8.5](https://perma.cc/XCT2-Q4AT); as [strings literais formatadas](https://perma.cc/U6Q6-59V3) na linha `with open(f'data/pg{filename}.txt', encoding='utf-8') as f:`, por exemplo, requerem Python 3.6 ou uma versão mais recente da linguagem.) + +## Materiais requeridos + +Este tutorial usa conjuntos de dados e software que você terá que baixar e instalar. + +### O conjunto de dados ### + +Para trabalhar nesta lição, você precisará baixar e descompactar o ficheiro [.zip](/assets/introduction-to-stylometry-with-python/dataset_estilometria.zip) contendo as 15 obras que compõem o *corpus* que será utilizado neste tutorial. As obras foram originalmente extraídas do [Projeto Gutenberg](https://perma.cc/8GTT-3M9N). Ao descompactar o ficheiro, será criada uma pasta com o nome `dados`. Este será o seu [diretório de trabalho](https://perma.cc/9KVS-T3A5) e todo o trabalho deve ser salvo aqui durante a execução da lição. + +### O software ### + +Esta lição usa as seguintes versões da linguagem Python e [bibliotecas](https://pt.wikipedia.org/wiki/Biblioteca_(computa%C3%A7%C3%A3o)): +* [Python 3.x](https://www.python.org/downloads/) - a última versão estável é recomendada; +* [nltk](https://www.nltk.org/) - Natural Language Toolkit, geralmente abreviado `nltk`; +* [matplotlib](https://matplotlib.org/) - visualização de dados e geração de gráficos; +* [re](https://docs.python.org/pt-br/3/library/re.html) - limpeza de dados via Regex (veremos durante o tutorial o porquê). + +Alguns desses módulos podem não estar pré-instalados em seu computador. Se você encontrar mensagens de erro como: "Módulo não encontrado" ou similares, você terá que baixar e instalar o(s) módulo(s) ausente(s). A forma mais simples de realizar esta tarefa é através do comando `pip`. Mais detalhes estão disponíveis através do tutorial do *Programming Historian* [Instalação de Módulos Python com pip](/pt/licoes/instalacao-modulos-python-pip). + +## Algumas notas sobre Independência Linguística + +Este tutorial aplica a análise estilométrica a um conjunto de textos em português (PT-PT e PT-BR) usando uma biblioteca Python chamada `nltk`. Muitas das funcionalidades fornecidas pelo `nltk` operam com outros idiomas. Contanto que um idioma forneça uma maneira clara de distinguir os limites de uma palavra, o `nltk` deve ter um bom desempenho. Idiomas como o chinês, para os quais não há distinção clara entre os limites das palavras, podem ser problemáticos. O autor original desta lição utilizou `nltk` com textos em francês sem nenhum problema; outros idiomas que usam [diacríticos](https://perma.cc/7VGD-5968), como espanhol e alemão, também devem funcionar bem com `nltk`. Consulte a [documentação do nltk](https://perma.cc/S4EX-2DBT) para obter detalhes. + +Apenas uma das tarefas neste tutorial requer código dependente do idioma. Para dividir um texto em um conjunto de palavras em uma língua diferente do inglês, você precisará especificar o idioma apropriado como um parâmetro para o [tokenizador](https://perma.cc/NGM5-4MED) da biblioteca `nltk`, que usa o inglês como padrão. Isso será explicado no tutorial. + +Por fim, observe que algumas tarefas linguísticas, como [*part-of-speech tagging*](https://perma.cc/L9SU-PS9D), podem não ser suportadas pelo `nltk` em outros idiomas além do inglês. Este tutorial não cobre a aplicação de *part-of-speech tagging*. Se você precisar para os seus próprios projetos, consulte a [documentação do nltk](https://perma.cc/S4EX-2DBT) para obter orientações. + +# O *corpus* - Contextualização + +No [exemplo original deste tutorial em inglês](/en/lessons/introduction-to-stylometry-with-python), utilizaram-se os [papéis federalistas](https://perma.cc/DW5V-MH5W) como um exemplo de aplicação de estilometria, utilizando as técnicas que serão apresentadas para inferir a autoria dos textos contestados dentro do conjunto de documentos que configura o *corpus*.[^7] +Como na língua portuguesa não temos um conjunto de textos que possua estas mesmas características, no exemplo que apresentaremos traremos um total de 15 obras completas de 5 autores diferentes, três deles portugueses e dois brasileiros, todos romancistas do século XIX, disponibilizadas pelo [Projeto Gutenberg](https://perma.cc/5PRR-TM3D). Utilizaremos duas obras de cada autor para definir seus respectivos estilos e uma terceira para constituir o conjunto de testes, para avaliarmos se as técnicas utilizadas realizarão a inferência correta de autoria através do grau de similaridade de cada obra deste conjunto com o estilo obtido de cada autor. + +Os autores e obras utilizadas são os seguintes: + +| Autor | Obra 1 | Obra 2 | Obra 3 | +| --------- | --------- | --------- | --------- | +| [Machado de **Assis**](https://perma.cc/6BMU-UKZL) (Brasil)| [Quincas Borba](https://www.gutenberg.org/ebooks/55682) (**55682**) | [Memorias Posthumas de Braz Cubas](https://www.gutenberg.org/ebooks/54829) (**54829**) | [Dom Casmurro](https://www.gutenberg.org/ebooks/55752) (**55752**) | +| [José de **Alencar**](https://perma.cc/Y3Y2-VHJ5) (Brasil) | [Ubirajara](https://www.gutenberg.org/ebooks/38496) (**38496**) | [Cinco minutos](https://www.gutenberg.org/ebooks/44540) (**44540**) | [Como e porque sou romancista](https://www.gutenberg.org/ebooks/29040) (**29040**) | +| [Camilo **Castelo Branco**](https://perma.cc/Q4AJ-VZBH) (Portugal) | [Carlota Angela](https://www.gutenberg.org/ebooks/26025) (**26025**) | [Amor de Salvação](https://www.gutenberg.org/ebooks/26988) (**26988**) | [Amor de Perdição: Memorias d'uma familia](https://www.gutenberg.org/ebooks/16425) (**16425**) | +| [António Feliciano de **Castilho**](https://perma.cc/LZ9J-3H5Z) (Portugal) | [A Chave do Enigma](https://www.gutenberg.org/ebooks/32002) (**32002**) | [A Primavera](https://www.gutenberg.org/ebooks/65021) (**65021**) | [O presbyterio da montanha](https://www.gutenberg.org/ebooks/28127) (**28127**) | +| [Manuel Pinheiro **Chagas**](https://perma.cc/8LU3-RADW) (Portugal) | [Historia alegre de Portugal](https://www.gutenberg.org/ebooks/29394) (**29394**) | [A Lenda da Meia-Noite](https://www.gutenberg.org/ebooks/23400) (**23400**) | [Astucias de Namorada, e Um melodrama em Santo Thyrso](https://www.gutenberg.org/ebooks/29342) (**29342**) | + +As partes destacadas do nome de cada autor indicam como os mesmos serão referenciados neste tutorial a partir deste ponto. Para os códigos utilizaremos o `EBook-No.` (número de referência da obra no Projeto Gutenberg), presente no nome dos ficheiros disponibilizados. + +# Nossos casos de teste + +Nesta lição, usaremos obras de romancistas brasileiros e portugueses do século XIX como um estudo de caso para demonstrar três abordagens estilométricas diferentes: + +1. Curvas características de composição de Mendenhall +2. Método Qui-Quadrado de Kilgariff +3. Método Delta de John Burrows + +Em todas as abordagens acima mencionadas, utilizaremos os documentos das colunas **Obra 1** e **Obra 2** para definir o estilo de cada autor. Os documentos da coluna **Obra 3** serão testados individualmente com cada um dos 5 autores para tentarmos inferir a autoria pela proximidade de estilo. + +# Preparando os dados para análise + +Antes de prosseguirmos com a análise estilométrica, precisamos carregar os ficheiros contendo todas as 15 obras em [estruturas de dados](https://perma.cc/P843-J4LB) na memória do computador. + +O primeiro passo neste processo é designar cada obra para o seu respectivo conjunto. Como cada obra está relacionada com o seu respectivo `EBook-No.`, podemos atribuir cada obra (valor) à chave do seu autor (ou a uma chave separada, se ela fizer parte da amostra de teste) usando um *dicionário* Python. O dicionário é um tipo de conjunto de dados composto de um número arbitrário de pares de chave-valor; neste caso, os nomes dos autores servirão como chaves (separados entre treino e teste), enquanto os `EBook-No.` das obras serão os valores associados a essas chaves. + +```python +ids_obras = { + 'Assis' : [55752, 54829], + 'Alencar' : [38496, 44540], + 'Castelo Branco' : [26025, 26988], + 'Castilho' : [32002, 65021], + 'Chagas' : [29394, 23400], + 'Assis (teste)' : [55682], + 'Alencar (teste)' : [29040], + 'Castelo Branco (teste)' : [16425], + 'Castilho (teste)' : [28127], + 'Chagas (teste)' : [29342] +} +``` + +Os dicionários Python são muito flexíveis. Por exemplo, podemos acessar um valor específico *indexando* o dicionário com uma de suas chaves, podemos varrer o dicionário inteiro fazendo um loop em sua lista de chaves, etc. Faremos amplo uso desta funcionalidade à medida que avançarmos. + +A seguir, como estamos interessados no vocabulário de cada autor, definiremos uma breve [função](https://perma.cc/P8CA-Y43Q) em Python que irá criar uma longa lista de palavras em cada uma das obras atribuídas a um único autor. Isso será armazenado como uma [string](https://perma.cc/7DCC-M9AT). +Abra o seu ambiente de desenvolvimento Python escolhido. Se você não sabe como fazer isso, leia "Configurar um ambiente de desenvolvimento integrado para Python" ([Windows](/pt/licoes/instalacao-windows), [Linux](/pt/licoes/instalacao-linux), [Mac](/pt/licoes/instalacao-mac)) antes de prosseguir. + +```python +# Função que compila todos os ficheiros de texto de cada grupo em uma única string + +import re + +def ler_ficheiros_para_string(ids_ficheiros): + global texto + strings = [] + for id_ficheiro in ids_ficheiros: + with open(f'dados/pg{id_ficheiro}.txt', + encoding='utf-8') as f: + texto = f.read() + texto = re.search(r"(START.*?\*\*\*)(.*)(\*\*\* END)", + texto, + re.DOTALL).group(2) + strings.append(texto) + return '\n'.join(strings) +``` + +Perceba que, dentro da função, temos também uma etapa de limpeza dos textos usando [expressões regulares](https://perma.cc/DT3K-XUBG). Isso foi necessário para este corpus específico pois as obras publicadas no Projeto Gutenberg possuem uma estrutura de cabeçalho e rodapé de [metadados](https://perma.cc/E8P8-GKDR) que não pode ser considerada na análise estilométrica, uma vez que não foram redigidas pelos autores analisados. A utilização de expressões regulares não faz parte do escopo deste tutorial, então limitaremo-nos a compreender que estamos utilizando a biblioteca `re` para capturar apenas o conjunto de caracteres entre os marcadores `*** START OF THIS PROJECT GUTENBERG [NOME DA OBRA] ***` e `*** END OF THIS PROJECT GUTENBERG [NOME DA OBRA] ***` presentes em cada documento do projeto. Para maiores dúvidas sobre a utilização de expressões regulares e da biblioteca `re`, consulte a [documentação](https://perma.cc/JFP3-B4P4). + +Na sequência, construímos uma nova estrutura de dados chamando repetidamente a função `ler_ficheiros_para_string ()`, passando a ela uma lista diferente de documentos a cada vez. Armazenaremos os resultados em outro dicionário, este com nomes do autor/caso de teste como chaves e todo o texto dos respectivos documentos como valores. Para simplificar, iremos nos referir à string contendo uma lista de documentos como "corpus do autor". + +```python +# Criar um dicionário com os corpora dos autores +obras = {} +for autor, ids_ficheiros in ids_obras.items(): + obras[autor] = ler_ficheiros_para_string(ids_ficheiros) +``` + +Para nos certificarmos de que os ficheiros foram carregados corretamente, imprima os primeiros cem caracteres de cada entrada do dicionário na tela: + +```python +for autor in obras: + print(obras[autor][:100]) +``` + +Se esta operação de impressão exibir quaisquer trechos de texto no console, então a operação de leitura dos ficheiros funcionou conforme o esperado e você pode prosseguir para a análise estilométrica. + +
+Se os ficheiros não forem carregados, o motivo mais provável é que o seu diretório de trabalho atual não seja o repositório `dados` criado ao descompactar o ficheiro da seção de Materiais Requeridos acima; mudar o seu diretório de trabalho deve resolver o problema. Como você faz isso depende do seu ambiente de desenvolvimento Python. +
+ +# Primeiro teste estilométrico: curvas características de composição de Mendenhall + +O pesquisador literário T. C. Mendenhall escreveu certa vez que a assinatura estilística de um autor pode ser encontrada contando a frequência com que usa palavras de tamanhos diferentes.[^8] Por exemplo, se contarmos os tamanhos de palavras em vários segmentos de 1.000 ou 5.000 palavras de qualquer romance e, em seguida, traçarmos um gráfico das distribuições de comprimento das palavras, as curvas pareceriam praticamente as mesmas, não importando que partes do romance tivéssemos escolhido. Na verdade, Mendenhall acreditava que se alguém contasse palavras suficientes selecionadas de várias partes da obra de toda a vida de um escritor (digamos, 100.000 ou mais), a "curva característica" de uso de comprimento de palavras do autor se tornaria tão precisa que seria constante ao longo de sua vida. + +Pelos padrões de hoje, contar o comprimento das palavras parece uma forma muito direta (e talvez simplista) de medir o estilo literário. O método de Mendenhall não leva em consideração as palavras do vocabulário de um autor, o que é obviamente problemático. Portanto, não devemos tratar as curvas características como uma fonte particularmente confiável de evidência estilométrica. No entanto, Mendenhall publicou a sua teoria há mais de cento e trinta anos e fez todos os cálculos à mão. É compreensível que ele tivesse optado por trabalhar com uma estatística que, embora grosseira, fosse ao menos fácil de compilar. Em honra ao valor histórico de sua tentativa inicial de estilometria, e porque a curva característica produz resultados visuais interessantes que podem ser implementados rapidamente, usaremos o método de Mendenhall como um primeiro passo em nossa exploração das técnicas de atribuição de autoria. + +O trecho de código necessário para calcular e exibir as curvas características para os autores e os documentos de teste é o seguinte: + +```python +# Carregar nltk e matpotlib +import nltk +import matplotlib.pylab as plt + +obras_tokens = {} +obras_distribuicao_comprimento = {} + +id_subplot = 1 +fig = plt.figure(figsize=(20,20)) + +autores = list(obras.keys()) + +for autor in autores: + # Transformar os corpora dos autores em listas de tokens de palavras + tokens = nltk.word_tokenize(obras[autor], language="portuguese") + + # Filtrar pontuação + obras_tokens[autor] = ([token for token in tokens + if any(c.isalpha() for c in token)]) + + # Obter a distribuição de comprimentos de tokens + token_comprimentos = [len(token) for token in obras_tokens[autor]] + obras_distribuicao_comprimento[autor] = nltk.FreqDist(token_comprimentos) + + # Plotar a curva característica de composição + lista_chaves = [] + lista_valores = [] + + for i in range(1,16): + lista_chaves.append(i) + lista_valores.append(obras_distribuicao_comprimento[autor][i]) + + lista_valores_normalizado = [value/max(lista_valores) for value in lista_valores] + + plt.subplot(5, 5, id_subplot) + plt.plot(lista_chaves, lista_valores_normalizado) + plt.xticks(lista_chaves) + plt.title(autor) + id_subplot += 1 + +plt.savefig("stilometry_comparacao.jpeg", dpi=300, bbox_inches='tight') +plt.show() +``` + +Se você estiver trabalhando em um [Jupyter Notebook](http://jupyter.org/), adicione a expressão `%matplotlib inline` após a importação das bibliotecas; caso contrário, você pode não ver os gráficos em sua tela. Se você estiver trabalhando em um [Jupyter Lab](http://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html), substitua esta expressão por `%matplotlib ipympl`. + +A primeira linha no trecho de código acima carrega o módulo *Natural Language Toolkit (nltk)*, que contém um número enorme de funções e recursos úteis para processamento de texto. Mal tocaremos em seus fundamentos nesta lição; se você decidir explorar mais a análise de texto em Python, recomendo fortemente que comece com [a documentação do nltk](https://www.nltk.org/). + +As próximas linhas configuram estruturas de dados que serão preenchidas pelo bloco de código dentro do loop `for`. Este loop faz os mesmos cálculos para todos os nossos "autores": + +* Invoca o método `word_tokenize()` do `nltk`, explicitando a linguagem do _corpus_ para português através do argumento `language="portuguese"`, e divide o _corpus_ em _tokens_, ou seja, palavras, números, pontuação, etc.; +* Olha para esta lista de tokens e filtra as não-palavras; +* Cria uma lista contendo os comprimentos de cada token de palavra restante; +* Cria um objeto de _distribuição de frequência_ a partir dessa lista de comprimentos de palavra, basicamente contando quantas palavras de uma letra, palavras de duas letras, etc., existem no _corpus_ do autor, e em seguida realiza a normalização dessa distribuição, ou seja, ajusta todos os valores em um intervalo entre 0 e 1. Esta etapa é realizada para comparar gráficos de distribuição em _corpus_ de tamanhos diferentes de forma mais clara; +* Plota um gráfico da distribuição de comprimentos de palavras no corpus, para todas as palavras de até 15 caracteres. + +Os resultados que obtemos são os seguintes: +{% include figure.html filename="introducao-estilometria-python-01.jpeg" caption="Imagem 1: Comparação da curva de Mendenhall para cada corpus." %} + +Como podemos ver pelos gráficos, é possível notar diferenças (embora sutis) entre todas as 5 curvas características de cada autor (linha superior de gráficos). Ao compararmos os documentos de teste (linha inferior de gráficos) com os autores, podemos notar que a curva característica dos documentos de teste dos autores Assis, Castilho e Chagas se assemelham mais à curva dos seus respectivos autores que de qualquer outro, o que seriam inferências corretas. O documento de Alencar é o que mais diverge da curva característica do autor. Isso pode ocorrer pelo fato do documento de teste ser uma autobiografia do autor, enquanto os documentos de treino são duas obras de ficção, o que poderia influenciar no seu estilo de escrita. Veremos nas próximas abordagens se conseguimos contornar esta situação. O documento de Castelo Branco também parece não ter se assemelhado à curva característica do autor. + +Para além desta análise meramente visual (que pode muitas vezes induzir ao erro), podemos ter um resultado quantitativo calculando a soma das distâncias entre os valores (normalizados) de frequência de cada documento de teste com os valores de frequência do *corpus* de cada possível autor. Por consequência, o autor que possuir a menor distância de frequência com o documento de teste seria o mais provável autor deste documento. Podemos implementar isso da seguinte forma: + +```python +# Dividir a lista de corpus entre autores e obras destacadas +autores = list(obras.keys())[:5] +obras_destacadas = list(obras.keys())[5:] + +obras_distribuicao_comprimento_normalizado = {} + +# Normalizar a distribuição de comprimentos de tokens em um novo dicionário +for index, obra in obras_distribuicao_comprimento.items(): + obras_distribuicao_comprimento_normalizado[index] = {k: + v/max(obra.values()) + for k, v in dict(obra).items()} + +# Calcular a soma da diferença da distribuição entre o documento de teste e cada autor (de 1 até 15 caracteres) +for obra in obras_destacadas: + for autor in autores: + soma_diferenca = 0 + for i in range(1,16): + diferenca = abs(obras_distribuicao_comprimento_normalizado[obra][i] - + obras_distribuicao_comprimento_normalizado[autor][i]) + soma_diferenca = soma_diferenca + diferenca + print('A soma da diferença do documento ' + + obra + + ' para o autor ' + + autor + + ' é ' + + str(soma_diferenca)) + print('\n') +``` + +O resultado deste trecho serão 5 blocos, cada um comparando um documento com os 5 possíveis autores. Abaixo o exemplo de como o primeiro bloco deve parecer: + +``` +A soma da diferença do documento Assis (teste) para o autor Assis é 0.25782806530977137 +A soma da diferença do documento Assis (teste) para o autor Alencar é 0.5192643726222002 +A soma da diferença do documento Assis (teste) para o autor Castelo Branco é 0.7410205025846326 +A soma da diferença do documento Assis (teste) para o autor Castilho é 0.46876355973646266 +A soma da diferença do documento Assis (teste) para o autor Chagas é 0.3466043230715998 +``` + +Vamos colocar os resultados dos 5 testes em uma [matriz de confusão](https://perma.cc/K42B-NQSR) (limitando a 4 casas decimais) para avaliarmos: + +| | Assis | Alencar | Castelo Branco | Castilho | Chagas | +| --------- | --------- | --------- | --------- | --------- | --------- | +| **Assis (teste)** | **0.2578** | 0.5192 | 0.7410 | 0.4687 | 0.3466 | +| **Alencar (teste)** | 0.9744 | **0.9844** | 0.4313 | 0.6979 | 0.7897 | +| **Castelo Branco (teste)** | 0.2812 | 0.4436 | **0.4761** | 0.2772 | 0.2803 | +| **Castilho (teste)** | 0.4396 | 0.4624 | 0.4114 | **0.1394** | 0.3184 | +| **Chagas (teste)** | 0.7746 | 0.5883 | 0.6636 | 0.6732 | **0.5888** | + +Os documentos de teste de Assis e Castilho possuem menor valor com seus respectivos autores, o que indica a maior proximidade. Isso é condizente com a similaridade dos gráficos que vimos anteriormente. O documento de teste de Chagas teve um "empate técnico" entre o estilo do próprio autor (0.5888) e Alencar (0.5883). Tanto os documentos de teste de Alencar quanto Castelo Branco ficaram com o maior valor em relação aos seus respectivos autores, logo a técnica não foi eficaz para estes dois autores. + +Se não tivéssemos informações adicionais para trabalharmos, poderíamos inferir corretamente 50% da atribuição de autoria (2 acertos, 2 erros e um "empate"), o que é um resultado considerável para uma técnica relativamente simples. Felizmente, a ciência estilométrica avançou muito desde a época de Mendenhall. + +# Segundo teste estilométrico: método qui-quadrado de Kilgariff + +Em um artigo de 2001, Adam Kilgarriff[^9] recomenda o uso da estatística qui-quadrado para determinar a autoria. Leitores familiarizados com métodos estatísticos podem se lembrar que o qui-quadrado às vezes é usado para testar se um conjunto de observações (digamos, as intenções dos eleitores conforme declarado em uma pesquisa) segue uma certa [distribuição de probabilidade](https://perma.cc/668N-9GPD) ou padrão. Não é isso que buscamos aqui. Em vez disso, simplesmente usaremos a estatística para medir a "distância" entre os vocabulários empregados em dois conjuntos de textos. Quanto mais semelhantes os vocabulários, mais provável é que o mesmo autor tenha escrito os textos em ambos os conjuntos. Isso pressupõe que o vocabulário de uma pessoa e os padrões de uso das palavras são relativamente constantes. + +Veja como aplicar a estatística para atribuição de autoria: + +* Pegue os corpora associados a dois autores; +* Junte-os em um único corpus, maior; +* Conte os tokens para cada uma das palavras que podem ser encontradas neste corpus maior; +* Selecione as [`n`](https://perma.cc/D9ND-3C83) palavras mais comuns no corpus maior; +* Calcule quantos tokens dessas `n` palavras mais comuns esperaríamos encontrar em cada um dos dois corpora originais se fossem do mesmo autor. Isso significa simplesmente dividir o número de tokens que observamos no corpus combinado em dois valores, com base nos tamanhos relativos das contribuições dos dois autores para o corpus comum; +* Calcule uma distância qui-quadrada somando, sobre as `n` palavras mais comuns, os _quadrados das diferenças entre os números reais de tokens encontrados no corpus de cada autor e os números esperados_, divididos pelos números esperados; A Figura 2 mostra a equação para a estatística qui-quadrado, onde C(i) representa o número observado de tokens para o recurso 'i' e E(i), o número esperado para esse recurso. + +{% include figure.html filename="stylometry-python-6.jpg" caption="Imagem 2: Equação para a estatística qui-quadrado." %} + +Quanto menor o valor do qui-quadrado, mais semelhantes são os dois corpora. Portanto, calcularemos o qui-quadrado de cada documento de teste com os 5 possíveis autores: os menores valores representarão a possível autoria de cada documento (assim como vimos no primeiro exemplo). + +Nota: Independentemente do método estilométrico que usamos, a escolha de `n`, o número de palavras a levar em consideração, é uma espécie de arte sombria. Na literatura pesquisada por Stamatatos[^2], pesquisadores sugeriram entre 100 e 1.000 das palavras mais comuns; um projeto chegou a usar cada palavra que aparecia no corpus pelo menos duas vezes. Como diretriz, quanto maior o corpus, maior o número de palavras que podem ser usadas como elementos sem correr o risco de dar importância indevida a uma palavra que ocorra apenas algumas vezes. Nesta lição, usaremos um `n` relativamente grande para o método qui-quadrado e um menor para o próximo método. Mudar o valor de `n` certamente mudará um pouco os resultados numéricos; no entanto, se uma pequena modificação de `n` causar uma mudança na atribuição de autoria, isso é um sinal de que o teste que você está realizando não é capaz de fornecer evidências significativas sobre o seu caso de teste. + +O seguinte trecho de código implementa o método de Kilgariff, com as frequências das 500 palavras mais comuns no corpus conjunto sendo usadas no cálculo: + +```python +# Converter os tokens para caracteres minúsculos para que a mesma palavra, +# maiúscula ou não, conte como uma palavra + +for autor in autores: + obras_tokens[autor] = ( + [token.lower() for token in obras_tokens[autor]]) + +# Calcular o qui-quadrado de cada documento de teste com cada um dos 5 autores +for obra in obras_destacadas: + for autor in autores: + + # Primeiro, construir um corpus conjunto e identificar + # as 500 palavras mais frequentes nele + corpus_conjunto= (obras_tokens[obra] + + obras_tokens[autor]) + freq_dist_conjunto = nltk.FreqDist(corpus_conjunto) + termos_comuns = list(freq_dist_conjunto.most_common(500)) + + # Que proporção do corpus conjunto é constituído pelos + # tokens do autor candidato? + autor_compartihado = (len(obras_tokens[autor]) + / len(corpus_conjunto)) + + # Agora, vamos observar as 500 palavras mais frequentes no corpus do candidato + # e comparar o número de vezes que elas podem ser observadas + # ao que seria esperado se os artigos do autor e o documento de teste + # fossem ambas amostras aleatórias do mesmo conjunto. + quiquadrado = 0 + for word,count_conjunto in termos_comuns: + + # Com que frequência vemos essa palavra comum? + autor_count = obras_tokens[autor].count(word) + obra_count = obras_tokens[obra].count(word) + + # Com que frequência deveríamos vê-la? + autor_count_esperado = count_conjunto * autor_compartihado + teste_count_esperado = count_conjunto * (1-autor_compartihado) + + # Adicionar a contribuição da palavra para a estatística qui-quadrado + quiquadrado += ((autor_count-autor_count_esperado) * + (autor_count-autor_count_esperado) / + autor_count_esperado) + + quiquadrado += ((obra_count-teste_count_esperado) * + (obra_count-teste_count_esperado) + / teste_count_esperado) + + print("A estatística de qui-quadrado do documento", + obra, + "para o candidato", + autor, + "é =", + quiquadrado) + print("\n") +``` + +Assim como no primeiro exemplo, o resultado será 5 blocos de resultados, cada um para um documento de teste. O primeiro bloco se parecerá com isso: +``` +A estatística de qui-quadrado do documento Assis (teste) para o candidato Assis é = 12266.387624251674 +A estatística de qui-quadrado do documento Assis (teste) para o candidato Alencar é = 13832.008019914058 +A estatística de qui-quadrado do documento Assis (teste) para o candidato Castelo Branco é = 15659.980573183348 +A estatística de qui-quadrado do documento Assis (teste) para o candidato Castilho é = 19458.24314684532 +A estatística de qui-quadrado do documento Assis (teste) para o candidato Chagas é = 13681.732446564287 +``` + +
+No código acima, convertemos os tokens em minúsculas para não contar os tokens de palavras que começam com uma letra maiúscula porque aparecem no início de uma frase e os tokens minúsculos da mesma palavra como duas palavras diferentes. Às vezes, isso pode causar alguns erros, por exemplo, quando um substantivo próprio e um substantivo comum são escritos da mesma forma, exceto para maiúsculas, mas geralmente esta técnica aumenta a precisão. +
+ +Agora, vamos dar uma olhada na matriz de confusão dos resultados para esta técnica: + +| | Assis | Alencar | Castelo Branco | Castilho | Chagas | +| --------- | --------- | --------- | --------- | --------- | --------- | +| **Assis (teste)** | **12266** | 13832| 15659 | 19458 | 13681 | +| **Alencar (teste)** | 2550 | **3153** | 2581 | 2663 | 2765 | +| **Castelo Branco (teste)** | 17294 | 12063 | **11187** | 18133 | 13954 | +| **Castilho (teste)** | 11349 | 9203 | 8925 | **4531** | 7548 | +| **Chagas (teste)** | 6683 | 5700 | 5836 | 6970 | **5332** | + +Como podemos observar, o teste de qui-quadrado obteve um resultado superior à curva característica de composição de Mendenhall. Assis e Castilho permanecem com a inferência correta de autoria. Chagas, que passou pelo "empate técnico" na curva de composição, com o qui-quadrado também faz a inferência correta com uma distância considerável entre os demais possíveis autores. Dos autores que não haviam sido avaliados corretamente na curva de composição, Castelo Branco possui o menor valor de qui-quadrado, outra inferência correta. Alencar, no entanto, segue como o maior valor entre os 5 possíveis autores. De qualquer forma, já passamos de 50% de acerto com a curva característica de composição para 80% com o método qui-quadrado! + +No entanto, o qui-quadrado ainda é um método pouco refinado. Por um lado, palavras que aparecem com muita frequência tendem a ter um peso desproporcional no cálculo final. Às vezes, isso é bom; outras vezes, diferenças sutis de estilo representadas pelas maneiras como os autores usam palavras mais incomuns passarão despercebidas. + +## Uma nota sobre classes gramaticais + +Em alguns casos e idiomas, pode ser útil aplicar a marcação de [Part-of-speech (classes gramaticais)](https://perma.cc/ER5P-CFQE) aos tokens de palavras antes de contá-los, de modo que a mesma palavra usada como duas classes gramaticais diferentes possa contar como dois elementos diferentes (por exemplo, o termo "mais" sendo usado como substantivo ou como advérbio de intensidade). Esta lição não usa marcação de classes gramaticais, mas poderia refinar os resultados em estudos de caso mais complexos. + +Se você precisar aplicar a marcação de classe gramatical aos seus próprios dados, poderá fazer o download de marcadores para outros idiomas, para trabalhar com uma ferramenta de terceiros como [Tree Tagger](https://perma.cc/DG9G-S5T2), ou mesmo para treinar o seu próprio marcador, mas essas técnicas estão muito além do escopo da lição atual. + +# Terceiro teste estilométrico: método Delta de John Burrows (avançado) + +Os primeiros dois métodos estilométricos foram mais fáceis de implementar. Este próximo, baseado na estatística *Delta* de John Burrows[^10], é consideravelmente mais complexo, tanto conceitualmente (a matemática é mais complicada) quanto computacionalmente (mais código necessário). É, no entanto, um dos métodos estilométricos mais proeminentes em uso hoje. + +Assim como o qui-quadrado de Kilgariff, o método Delta de Burrows é uma medida da "distância" entre um texto cuja autoria queremos averiguar e algum outro corpus. Ao contrário do qui-quadrado, no entanto, o método Delta é projetado para comparar um texto anônimo (ou conjunto de textos) com as assinaturas de vários autores diferentes ao mesmo tempo. Mais precisamente, o método Delta mede como o texto anônimo *e conjuntos de textos escritos por um número arbitrário de autores conhecidos* divergem da média de todos eles juntos. Além disso, o método Delta atribui peso igual a todas as características que mede, evitando assim o problema de palavras comuns sobrecarregarem os resultados, o que era um problema com os testes de qui-quadrado. Por todas essas razões, o método Delta de John Burrows é geralmente uma solução mais eficaz para a questão da autoria. + +O algoritmo original de Burrows pode ser resumido da seguinte forma: + +* Reúna um grande corpus composto por textos escritos por um número arbitrário de autores; digamos que o número de autores seja `x`; +* Encontre as `n` palavras mais frequentes no corpus para usar como elementos; +* Para cada uma dessas `n` características, calcule a participação de cada subcorpora dos `x` autores, como uma porcentagem do número total de palavras. Por exemplo, a palavra "ele" pode representar 4,72% das palavras no subcorpus do Autor A; +* Em seguida, calcule a média e o desvio padrão desses `x` valores e use-os como a média oficial e o desvio padrão para esse elemento em todo o corpus. Em outras palavras, estaremos usando uma _média de médias_ em vez de calcular um único valor que represente a parcela de todo o corpus dado por cada palavra. Fazemos isso porque queremos evitar que um subcorpus maior tenha maior influência nos resultados a seu favor e defina a norma do corpus de tal forma que se espere que tudo se pareça com ele; +* Para cada um dos `n` elementos e `x` subcorpora, calcule um [`z-score`](https://perma.cc/S2RH-LF9K) descrevendo o quão distante da norma do corpus está o uso desse elemento particular neste subcorpus específico. Para fazer isso, subtraia a "média das médias" de um dado elemento da frequência com que ela é encontrada no subcorpus e divida o resultado pelo seu desvio padrão. A Figura 3 mostra a equação de z-score para o elemento 'i', onde C(i) representa a frequência observada, a letra grega mu representa a média das médias e a letra grega sigma, o desvio padrão; + +{% include figure.html filename="stylometry-python-7.jpg" caption="Imagem 3: Equação para a estatística de z-score." %} + +* Em seguida, calcule os mesmos `z-scores` para cada elemento no texto para o qual queremos determinar a autoria; +* Finalmente, calcule um *score delta* comparando o documento de teste com o subcorpus de cada candidato. Para fazer isso, tome a *média dos valores absolutos das diferenças entre os `z-scores` para cada elemento entre o documento de teste e o subcorpus do candidato*. (leia duas vezes!) Isso dá peso igual a cada elemento, não importa a frequência com que as palavras ocorram nos textos; caso contrário, os 3 ou 4 principais elementos sobrecarregariam todo o resto. A Figura 4 mostra a equação para Delta, onde Z(c,i) é o `z-score` para o elemento 'i' no candidato 'c', e Z(t,i) é o `z-score` para o elemento 'i' no caso de teste; + +{% include figure.html filename="stylometry-python-8.jpg" caption="Imagem 4: Equação para a estatística Delta de John Burrows." %} + +* O candidato "vencedor", assim como nas duas outras técnicas que aplicamos, é o autor para o qual a pontuação delta entre o subcorpus do autor e o documento de teste é a mais baixa. + +Stefan Evert _et al_.[^11] fornece uma discussão aprofundada das variantes, refinamentos e complexidades do método, mas nos ateremos ao essencial para os propósitos desta lição. Uma explicação diferente de Delta, escrita em espanhol, e uma aplicação a um corpus de romances espanhóis também podem ser encontradas em um artigo recente de José Calvo Tello.[^12] + +## Seleção de elementos + +Vamos combinar todos os subcorpora em um único corpus para Delta calcular um "padrão" para trabalhar. Então, vamos selecionar um número de palavras para usar como característica. Lembre-se de que usamos 500 palavras para calcular o qui-quadrado de Kilgariff; desta vez, usaremos um conjunto menor de 30 palavras (a maioria, senão todas, palavras funcionais e verbos comuns) como nossos elementos. + +```python +# Combinar todos os corpora, exceto os documentos de teste, em um único corpus +corpus_completo = [] +for autor in autores: + corpus_completo += obras_tokens[autor] + +# Obter uma distribuição de frequência +freq_dist_corpus_completo = list(nltk.FreqDist(corpus_completo).most_common(30)) +freq_dist_corpus_completo[ :10 ] +``` + +Uma amostra das palavras mais frequentes e suas respectivas ocorrências parece com o seguinte: + +``` +[('a', 17619), + ('que', 17345), + ('de', 17033), + ('e', 15449), + ('o', 14283), + ('não', 7086), + ('do', 6019), + ('da', 5647), + ('os', 5299), + ('um', 4873)] +``` + +## Calculando elementos para cada subcorpus + +Vejamos as frequências de cada característica no subcorpus de cada candidato, como uma proporção do número total de tokens no subcorpus. Vamos calcular esses valores e armazená-los em um dicionário de dicionários, uma maneira conveniente de construir um [array bidimensional](https://perma.cc/HR9K-24MG) em Python. + +```python +# Criar uma lista com os elementos e a estrutura principal de dados +features = [word for word,freq in freq_dist_corpus_completo] +feature_freqs = {} + +for autor in autores: + # Criar um dicionário para os elementos de cada candidato + feature_freqs[autor] = {} + + # Obter um valor auxiliar contendo o número de tokens no subcorpus do autor + geral = len(obras_tokens[autor]) + + # Calcular a presença de cada elemento no subcorpus + for feature in features: + presenca = obras_tokens[autor].count(feature) + feature_freqs[autor][feature] = presenca / geral +``` + +## Calculando médias de elementos e desvios-padrão + +Dadas as frequências de elementos para todos os subcorpora que acabamos de calcular, podemos encontrar uma "média das médias" e um desvio padrão para cada elemento. Armazenaremos esses valores em outro "dicionário de dicionários". + +```python +import math + +# A estrutura de dados na qual iremos armazenar +# as "estatísticas padrão do corpus" +corpus_features = {} + +# Para cada elemento... +for feature in features: + # Criar um subdicionário que conterá a média e o desvio padrão do elemento + corpus_features[feature] = {} + + # Calcular a média das frequências expressas no subcorpora + feature_average = 0 + for autor in autores: + feature_average += feature_freqs[autor][feature] + feature_average /= len(autores) + corpus_features[feature]["Mean"] = feature_average + + # Calcular o desvio padrão usando a fórmula básica para uma amostra + feature_stdev = 0 + for autor in autores: + diff = feature_freqs[autor][feature] - corpus_features[feature]["Mean"] + feature_stdev += diff * diff + feature_stdev /= (len(autores) - 1) + feature_stdev = math.sqrt(feature_stdev) + corpus_features[feature]["StdDev"] = feature_stdev +``` + +## Calculando z-scores + +Em seguida, transformamos as frequências de características observadas no subcorpora dos cinco candidatos em `z-scores`, descrevendo o quão distante da "estatística padrão do corpus" essas observações estão. Nada extravagante aqui: nós meramente aplicamos a definição do `z-score` para cada elemento e armazenamos os resultados em outro array bidimensional. + +```python +feature_zscores = {} + +for autor in autores: + feature_zscores[autor] = {} + + for feature in features: + # Definição do z-score = (value - mean) / stddev + # Usamos variáveis intermediárias para tornar o + # código mais fácil de ler + feature_val = feature_freqs[autor][feature] + feature_mean = corpus_features[feature]["Mean"] + feature_stdev = corpus_features[feature]["StdDev"] + feature_zscores[autor][feature] = ((feature_val-feature_mean) / + feature_stdev) +``` + +## Calculando elementos, z-scores e Delta para nosso caso de teste + +Em seguida, precisamos comparar os documentos de teste com o corpus. O seguinte trecho de código, que essencialmente recapitula tudo o que fizemos até agora, conta as frequências de cada um de nossos 30 elementos nos documentos de teste e calcula os `z-scores` de acordo. +Por fim, usamos a fórmula para Delta definida por Burrows para extrair uma única pontuação comparando cada documento de teste com cada um dos cinco "autores candidatos". Lembre-se: quanto menor a pontuação Delta, mais semelhante a assinatura estilométrica do documento à do candidato. + +```python +for obra in obras_destacadas: + # Tokenizar o documento de teste + testcase_tokens = nltk.word_tokenize(obras[obra]) + + # Filtrar a pontuação e colocar os tokens em minúsculas + testcase_tokens = [token.lower() for token in testcase_tokens + if any(c.isalpha() for c in token)] + + # Calcular as frequências dos elementos do documento de teste + geral = len(testcase_tokens) + testcase_freqs = {} + for feature in features: + presenca = testcase_tokens.count(feature) + testcase_freqs[feature] = presenca / geral + + # Calcular os z-scores dos elementos do documento de teste + testcase_zscores = {} + for feature in features: + feature_val = testcase_freqs[feature] + feature_mean = corpus_features[feature]["Mean"] + feature_stdev = corpus_features[feature]["StdDev"] + testcase_zscores[feature] = (feature_val - feature_mean) / feature_stdev + + # Calcular Delta para cada autor + for autor in autores: + delta = 0 + for feature in features: + delta += math.fabs((testcase_zscores[feature] - + feature_zscores[autor][feature])) + delta /= len(features) + print( "Delta score do documento", + obra, + "para o candidato", + autor, + "é =", + delta ) + print("\n") +``` + +Como nas outras duas técnicas, o resultado serão 5 blocos de código dando o valor de Delta de cada documento para cada suposto autor. O primeiro bloco se parecerá com isso: + +``` +Delta score do documento Assis (teste) para o candidato Assis é = 0.8715781237572774 +Delta score do documento Assis (teste) para o candidato Alencar é = 1.2624531605759595 +Delta score do documento Assis (teste) para o candidato Castelo Branco é = 1.2303968803032856 +Delta score do documento Assis (teste) para o candidato Castilho é = 1.6276770882853728 +Delta score do documento Assis (teste) para o candidato Chagas é = 1.0527125070730734 +``` + +Vamos avaliar todos os valores Delta na nossa matriz de confusão (reduzidos para 4 casas decimais): + +| | Assis | Alencar | Castelo Branco | Castilho | Chagas | +| --------- | --------- | --------- | --------- | --------- | --------- | +| **Assis (teste)** | **0.8715** | 1.2624 | 1.2303 | 1.6276 | 1.0527 | +| **Alencar (teste)** | 1.9762 | **1.3355** | 1.3878 | 1.6425 | 1.5042 | +| **Castelo Branco (teste)** | 1.004 | 1.3208 | **0.8182** | 1.5202 | 1.2829 | +| **Castilho (teste)** | 1.5705 | 1.2553 | 1.0970 | **0.4518** | 0.8176 | +| **Chagas (teste)** | 1.1444 | 1.0169 | 0.9462 | 0.9864 | **0.7756** | + +Com o método Delta, pudemos inferir corretamente 100% da autoria dos documentos de teste! Alencar, que teve o pior valor nas duas outras técnicas, aqui aparece com o menor valor entre os 5 candidatos. +Ao utilizarmos autores brasileiros e portugueses, tínhamos em mente também a possibilidade de que a comparação entre ficheiros de autores de uma mesma nacionalidade pudessem ter valores mais próximos que entre autores de nacionalidades distintas, em função de particularidades linguísticas, o que parece que não foi o caso aqui. Por se tratarem de obras do século XIX, poderíamos buscar explicações para isso na maior similaridade das línguas na época, na influência da Academia Portuguesa no Brasil, ou mesmo do letramento e influências dos autores. Uma segunda análise com obras mais contemporâneas seria um excelente segundo passo para esta análise, e fica como sugestão para o leitor. + +# Leituras adicionais e recursos + +## Estudos de caso interessantes + +Estilometria e/ou atribuição de autoria têm sido utilizadas em diversos contextos, empregando diversas técnicas. Aqui estão alguns estudos de caso interessantes: + +* Javier de la Rosa e Juan Luis Suárez procuram o autor de um famoso romance espanhol do século XVI entre uma lista considerável de candidatos. [^13] +* Maria Slautina e Mikhail Marusenko usam o reconhecimento de padrões em um conjunto de recursos sintáticos, gramaticais e lexicais, desde a contagem de palavras simples (com marcação de classe gramatical) a vários tipos de frases, a fim de estabelecer semelhanças estilísticas entre os textos medievais.[^14] +* Ellen Jordan, Hugh Craig e Alexis Antonia examinam o caso de periódicos britânicos do século XIX, nos quais os artigos geralmente não eram assinados, para determinar o autor de quatro resenhas de trabalhos de ou sobre as irmãs Brontë.[^15] Este estudo de caso aplica uma versão inicial de outro método desenvolvido por John Burrows, o método Zeta, que se concentra nas palavras favoritas de um autor em vez de palavras de função comum.[^16] +* Valérie Beaudoin e François Yvon analisaram 58 peças em verso dos dramaturgos franceses Corneille, Racine e Molière, descobrindo que as duas primeiras foram muito mais consistentes na maneira como estruturaram sua escrita do que as últimas.[^17] +* Marcelo Luiz Brocardo, Issa Traore, Sherif Saad e Isaac Woungang aplicam [aprendizagem supervisionada](https://perma.cc/7TAQ-JECD) e [modelos n-gram](https://perma.cc/X34K-5R9X) para determinar a autoria de mensagens curtas com um grande número de autores em potencial, como e-mails e tweets.[^18] +* Moshe Koppel e Winter Yaron propõem o "método do impostor", que tenta determinar se dois textos foram escritos pelo mesmo autor, inserindo-os em um conjunto de textos escritos por falsos candidatos.[^19] Justin Anthony Stover _et al._ recentemente aplicou a técnica para determinar a autoria de um manuscrito do século II recém-descoberto.[^20] +* Finalmente, uma equipe liderada por David I. Holmes estudou o caso peculiar de documentos escritos por um soldado da Guerra Civil ou por sua viúva que pode ter copiado intencionalmente seu estilo de escrita.[^21] + +## Referências adicionais sobre autoria e estilometria + +A referência mais exaustiva em todos os assuntos relacionados à atribuição de autoria, incluindo a história do campo, seus fundamentos matemáticos e linguísticos e seus vários métodos, foi escrita por Patrick Juola em 2007.[^22] O Capítulo 7, em particular, mostra como a atribuição de autoria pode servir como um marcador para várias identidades de grupo (gênero, nacionalidade, dialeto, etc.), para mudanças na linguagem ao longo do tempo, e até mesmo para personalidade e saúde mental. + +Uma pesquisa mais curta pode ser encontrada em Moshe Koppel _et al._, que discute casos em que há um único autor candidato cuja autoria deve ser confirmada, um grande número de candidatos para os quais apenas pequenas amostras de escrita estão disponíveis para treinar um algoritmo de aprendizado de máquina, ou nenhum candidato conhecido.[^23] + +O artigo de Stamatatos citado anteriormente[^2] também contém uma pesquisa qualitativa do campo. + +## Varia + +*Programming historians* que desejam explorar mais a estilometria podem fazer o download do pacote [Stylo](https://cran.r-project.org/web/packages/stylo/index.html),[^24] que se tornou um padrão _de facto_. Entre outras coisas, o pacote Stylo fornece uma implementação do método Delta, funcionalidade de extração de recursos e interfaces gráficas de usuário convenientes tanto para manipulação de dados quanto para produção de resultados visualmente atraentes. Observe que o Stylo é escrito em [R](https://www.r-project.org/), o que significa que você precisará do R instalado no seu computador para executá-lo, mas entre a interface gráfica do usuário e os tutoriais, pouco ou nenhum conhecimento prévio de programação R deve ser necessário. + +Leitores fluentes em francês interessados em explorar as implicações [epistemológicas](https://perma.cc/6DFE-QTWV) das interações entre métodos quantitativos e qualitativos na análise do estilo de escrita devem ler Clémence Jacquot.[^25] + +Surpreendentemente, os dados obtidos por meio de [reconhecimento ótico de caracteres](https://perma.cc/R9U6-TRGE) (OCR) se mostraram adequados para fins de atribuição de autoria, mesmo quando os dados sofrem de altas taxas de erro de OCR.[^26] + +Por fim, existe um [grupo Zotero](https://www.zotero.org/groups/643516/stylometry_bibliography/items) dedicado à estilometria, onde você pode encontrar muitas outras referências a métodos e estudos. + +# Agradecimentos + +Agradecimentos a Stéfan Sinclair e Andrew Piper, em cujos seminários na Universidade McGill este projeto começou. Também agradeço à minha orientadora de tese, Susan Dalton, cuja orientação é sempre inestimável. + +# Notas finais + +[^1]: Veja, por exemplo, Justin Rice, ["What Makes Hemingway Hemingway? A statistical analysis of the data behind Hemingway's style"](https://perma.cc/W8TR-UH6S) + +[^2]: Efstathios Stamatatos, “A Survey of Modern Authorship Attribution Method,” _Journal of the American Society for Information Science and Technology_, vol. 60, no. 3 (December 2008), p. 538–56, citation on p. 540, [https://doi.org/10.1002/asi.21001](https://doi.org/10.1002/asi.21001). + +[^3]: Jan Rybicki, “Vive La Différence: Tracing the (Authorial) Gender Signal by Multivariate Analysis of Word Frequencies,” _Digital Scholarship in the Humanities_, vol. 31, no. 4 (December 2016), pp. 746–61, [https://doi.org/10.1093/llc/fqv023](https://doi.org/10.1093/llc/fqv023). Sean G. Weidman e James O’Sullivan, “The Limits of Distinctive Words: Re-Evaluating Literature’s Gender Marker Debate,” _Digital Scholarship in the Humanities_, 2017, [https://doi.org/10.1093/llc/fqx017](https://doi.org/10.1093/llc/fqx017). + +[^4]: Ted Underwood, David Bamman, e Sabrina Lee, “The Transformation of Gender in English-Language Fiction”, _Cultural Analytics_, Feb. 13, 2018, [https://doi.org/10.22148/16.019](https://doi.org/10.22148/16.019). + +[^5]: Sven Meyer zu Eissen e Benno Stein, “Intrinsic Plagiarism Detection,” in _ECIR 2006_, edited by Mounia Lalmas, Andy MacFarlane, Stefan Rüger, Anastasios Tombros, Theodora Tsikrika, e Alexei Yavlinsky, Berlin, Heidelberg: Springer, 2006, pp. 565–69, [https://doi.org/10.1007/11735106_66](https://doi.org/10.1007/11735106_66). + +[^6]: Cynthia Whissell, “Traditional and Emotional Stylometric Analysis of the Songs of Beatles Paul McCartney and John Lennon,” _Computers and the Humanities_, vol. 30, no. 3 (1996), pp. 257–65. + +[^7]: Douglass Adair, "The Authorship of the Disputed Federalist Papers", _The William and Mary Quarterly_, vol. 1, no. 2 (April 1944), pp. 97-122. + +[^8]: T. C. Mendenhall, "The Characteristic Curves of Composition", _Science_, vol. 9, no. 214 (Mar. 11, 1887), pp. 237-249. + +[^9]: Adam Kilgarriff, "Comparing Corpora", _International Journal of Corpus Linguistics_, vol. 6, no. 1 (2001), pp. 97-133. + +[^10]: John Burrows, "'Delta': a Measure of Stylistic Difference and a Guide to Likely Authorship", _Literary and Linguistic Computing_, vol. 17, no. 3 (2002), pp. 267-287. + +[^11]: Stefan Evert et al., "Understanding and explaining Delta measures for authorship attribution", _Digital Scholarship in the Humanities_, vol. 32, no. suppl_2 (2017), pp. ii4-ii16. + +[^12]: José Calvo Tello, “Entendiendo Delta desde las Humanidades,” [_Caracteres_, vol.5, no.1 (May 27 2016)](https://perma.cc/LNF3-QP8V), pp.140-176. + +[^13]: Javier de la Rosa and Juan Luis Suárez, “The Life of Lazarillo de Tormes and of His Machine Learning Adversities,” _Lemir_, vol. 20 (2016), pp. 373-438. + +[^14]: Maria Slautina e Mikhaïl Marusenko, “L’émergence du style, The emergence of style,” _Les Cahiers du numérique_, vol. 10, no. 4 (November 2014), pp. 179–215, [https://doi.org/10.3166/LCN.10.4.179-215](https://doi.org/10.3166/LCN.10.4.179-215). + +[^15]: Ellen Jordan, Hugh Craig, e Alexis Antonia, “The Brontë Sisters and the ‘Christian Remembrancer’: A Pilot Study in the Use of the ‘Burrows Method’ to Identify the Authorship of Unsigned Articles in the Nineteenth-Century Periodical Press,” _Victorian Periodicals Review_, vol. 39, no. 1 (2006), pp. 21–45. + +[^16]: John Burrows, “All the Way Through: Testing for Authorship in Different Frequency Strata,” _Literary and Linguistic Computing_, vol. 22, no. 1 (April 2007), pp. 27–47, [https://doi.org/10.1093/llc/fqi067](https://doi.org/10.1093/llc/fqi067). + +[^17]: Valérie Beaudoin e François Yvon, “Contribution de La Métrique à La Stylométrie,” _JADT 2004: 7e Journées internationales d'Analyse statistique des Données Textuelles_, vol. 1, Louvain La Neuve, Presses Universitaires de Louvain, 2004, pp. 107–18. + +[^18]: Marcelo Luiz Brocardo, Issa Traore, Sherif Saad e Isaac Woungang, “Authorship Verification for Short Messages Using Stylometry,” _2013 International Conference on Computer, Information and Telecommunication Systems (CITS)_, 2013, [https://doi.org/10.1109/CITS.2013.6705711](https://doi.org/10.1109/CITS.2013.6705711). + +[^19]: Moshe Koppel e Winter Yaron, “Determining If Two Documents Are Written by the Same Author,” _Journal of the Association for Information Science and Technology_, vol. 65, no. 1 (October 2013), pp. 178–87, [https://doi.org/10.1002/asi.22954](https://doi.org/10.1002/asi.22954). + +[^20]: Justin Anthony Stover et al., "Computational authorship verification method attributes a new work to a major 2nd century African author", _Journal of the Association for Information Science and Technology_, vol. 67, no. 1 (2016), pp. 239–242. + +[^21]: David I. Holmes, Lesley J. Gordon, e Christine Wilson, "A widow and her soldier: Stylometry and the American Civil War", _Literary and Linguistic Computing_, vol. 16, no 4 (2001), pp. 403–420. + +[^22]: Patrick Juola, “Authorship Attribution,” _Foundations and Trends in Information Retrieval_, vol. 1, no. 3 (2007), pp. 233–334, [https://doi.org/10.1561/1500000005](https://doi.org/10.1561/1500000005). + +[^23]: Moshe Koppel, Jonathan Schler, e Shlomo Argamon, “Computational Methods in Authorship Attribution,” _Journal of the Association for Information Science and Technology_. vol. 60, no. 1 (January 2009), pp. 9–26, [https://doi.org/10.1002/asi.v60:1](https://doi.org/10.1002/asi.v60:1). + +[^24]: Maciej Eder, Jan Rybicki, e Mike Kestemont, “Stylometry with R: A Package for Computational Text Analysis,” _The R Journal_, vol. 8, no. 1 (2016), pp. 107–21. + +[^25]: Clémence Jacquot, “Rêve d'une épiphanie du style: visibilité et saillance en stylistique et en stylométrie,” _Revue d’Histoire Littéraire de la France_ , vol. 116, no. 3 (2016), pp. 619–39. + +[^26]: Patrick Juola, John Noecker Jr, e Michael Ryan, "Authorship Attribution and Optical Character Recognition Errors", _TAL_, vol. 53, no. 3 (2012), pp. 101–127. diff --git a/pt/licoes/introducao-mysql-r.md b/pt/licoes/introducao-mysql-r.md new file mode 100644 index 0000000000..7037fca8c7 --- /dev/null +++ b/pt/licoes/introducao-mysql-r.md @@ -0,0 +1,944 @@ +--- +title: Introdução ao MySQL com R +layout: lesson +slug: introducao-mysql-r +authors: +- Jeff Blackadar +date: 2018-05-03 +translation_date: 2021-12-18 +editors: +- Amanda Visconti +reviewers: +- Jesse Sadler +- Simon Appleford +translator: +- Jéssica Evelyn Santos +translation-editor: +- Daniel Alves +translation-reviewer: +- Dália Guerreiro +- Leonardo F. Nascimento +difficulty: 2 +review-ticket: https://github.com/programminghistorian/ph-submissions/issues/439 +collection: lessons +activity: transforming +topics: [data-manipulation, distant-reading, r] +abstract: "Esta lição ajudará a armazenar grandes quantidades de dados históricos de maneira estruturada, pesquisar e filtrar esses dados e visualizar alguns dos dados como um gráfico." +original: getting-started-with-mysql-using-r +avatar_alt: Uma mão a segurar um jornal +doi: 10.46430/phpt0025 +--- + +Esta lição é direcionada aos que desejam armazenar grandes quantidades de dados de projetos de história digital de uma forma estruturada. Usaremos um sistema de gerenciamento de dados chamado MySQL para armazenar os dados. + +A linguagem R permite realizar análises e armazenar dados sem que um banco de dados relacional seja utilizado. No entanto, há situações nas quais a inclusão de bancos de dados é muito útil, dentre elas: + +- Publicar os resultados de um script em R num *web site* com dados interativos +- Manipular mais dados do que o R pode armazenar em sua própria memória +- Quando os dados já estão armazenados num banco de dados relacional +- Trabalhar com dados de entidades diferentes que são relacionados uns com os outros. Um exemplo seria um banco de dados de soldados de dois exércitos distintos que lutaram numa batalha, onde gostaríamos de saber qual esquadrão, pelotão, companhia e brigada cada soldado fazia parte. + +Uma breve discussão do tema pode ser encontrada no [*blog* de Jason A. French's](hhttps://perma.cc/5VYV-L5PG)[^1]. + +Ao final desta lição, será possível instalar um sistema de gerenciamento de banco de dados em seu computador, criar uma tabela de banco de dados, armazenar informações na tabela e realizar consultas dos dados. Na conclusão da lição, utilizaremos uma consulta do banco de dados para construir um gráfico. + +Usaremos a linguagem de programação R para os exemplos, mas as técnicas podem ser utilizadas com outras linguagens, como Python. + +Para fazer essa lição será necessário um computador com permissão para instalar os programas R e RStudio, entre outros, se já não estiverem instalados. Além da programação em R, também instalaremos alguns componentes de um sistema de gerenciamento de banco de dados chamado MySQL, que funciona nos sistemas operacionais Windows, Mac e Linux. + +Possuir algum conhecimento de instalação de programas e organização de dados em campos é útil para essa lição, cujo nível de dificuldade é mediano. + +{% include toc.html %} + +# Introdução + +O MySQL é um banco de dados relacional usado para armazenar e consultar informações. Esta lição utilizará a linguagem R para fornecer um tutorial e exemplos para: + +- Configurar e realizar uma conexão a uma tabela no MySQL +- Armazenar registros em tabelas +- Consultar informações de tabelas + +Neste tutorial, construiremos um banco de dados de artigos de periódicos que contém palavras de uma busca numa hemeroteca digital. O script armazenará o título, a data publicada e a URL de cada artigo num banco de dados. Utilizaremos outro script para realizar consultas no banco de dados e procurar por padrões historicamente relevantes. Os dados de amostra serão fornecidos pelo arquivo de periódicos [Welsh Newspapers Online](https://perma.cc/9EHD-EVEX). Estamos trabalhando com o objetivo de produzir uma lista de artigos à qual possamos consultar informações. Ao final da lição, vamos executar uma consulta para gerar um gráfico do número de artigos de periódicos no banco de dados, para verificar se há um padrão relevante. + +# Programas necessários + +R, R Studio, MySQL Server e MySQL Workbench são os programas necessários para esta lição. Algumas notas sobre a instalação desses pacotes de programas podem ser encontradas abaixo. + +## R + +Na lição [Processamento Básico de Texto em R](/pt/licoes/processamento-basico-texto-r)[^2], Taylor Arnold e Lauren Tilton fornecem um resumo excelente do conhecimento da linguagem R necessária para esta lição. Apenas um conhecimento básico de R é esperado. A lição [Noções básicas de R com dados tabulares](/pt/licoes/nocoes-basicas-R-dados-tabulares), de Taryn Dewar,[^3] aborda como instalar o R e se familiarizar com a linguagem. + +### Download do R + +Você pode realizar o download do R no [Comprehensive R Archive Network](https://cran.r-project.org/). Clique no link que corresponde ao sistema operacional do seu computador. Selecione *base* para instalar o R pela primeira vez. Uma vez que o ficheiro foi baixado, clique no ficheiro para executar o instalador. + +## RStudio + +Os exemplos desta lição utilizam o RStudio, que é uma interface de desenvolvimento para escrever e executar scripts em R. Esta lição usou a versão 1.4.1717 do RStudio. + +### Download do RStudio + +Faça o download do RStudio através do [rstudio.com](https://www.rstudio.com/products/rstudio/#Desktop) e instale-o. Já que o RStudio é de código aberto, você pode selecionar a versão gratuita do RStudio Desktop, rolar a página para baixo e clicar num dos instaladores que corresponda ao sistema operacional de seu computador. Uma vez que o download foi realizado, clique no ficheiro para executar o instalador. + +## MySQL + +SQL significa *Structured Query Language* (Linguagem estruturada de consulta), que é um conjunto de comandos para armazenar e recuperar informações a partir de um banco de dados relacional. MySQL é um tipo de sistema de gerenciamento de banco de dados relacionais. Há muitos outros, como Microsoft SQL Server, IBM DB2 e Microsoft Access. Esta lição utiliza o MySQL porque é um programa de código aberto, utilizado por uma grande comunidade, tem uma longa trajetória e possui uma versão gratuita que pode ser utilizada. + +### Realizando o download e instalando o MySQL + +Nesta seção, iremos instalar o MySQL, que é o sistema que mantém o banco de dados, assim como o MySQL Workbench, que é onde se trabalha para configurar a estrutura do banco de dados. Para usar o MySQL,o MySQL Workbench não é necessário, podem ser utilizados apenas comandos digitados. Esta lição utiliza o MySQL Workbench porque é uma *GUI* (Interface gráfica do usuário) que facilita o aprendizado de MySQL. + +Conclua essas instruções para instalar o MySQL Community Server e o MySQL Workbench em seu computador. + +### MySQL Community Server + +Este é o servidor onde o banco de dados é armazenado. Sua instalação é necessária para que seja possível conectar e armazenar os dados. Abaixo, faremos o download dos ficheiros, a instalação e iniciaremos o servidor. Esta lição utilizou a versão 8.0.21 do MySQL e 8.0.26 do MySQL Workbench. + +#### Fazendo o download do ficheiro de instalação do MySQL Community Server + +Clique neste link: [https://dev.mysql.com/downloads/mysql/](https://dev.mysql.com/downloads/mysql/). Role a página para baixo e selecione o sistema operacional que corresponde ao seu computador. Se necessário, clique em **Select Operating System** para selecionar o sistema operacional. Uma vez feita essa operação, clique no botão azul **Go to Download Page**. Depois clique no botão azul **Download**. Na página de download, role para baixo e terá a opção de começar o download clicando em **No thanks, just start my download** (Não, obrigado, apenas inicie o download). + +#### Instalação do MySQL Community Server + +Abaixo se encontram as dicas de instalação para PC e Mac: + +##### Dicas de instalação para PC + +A maneira recomendada de instalar os componentes do MySQL é através do instalador do MySQL para Windows. Com o ficheiro já baixado, clique duas vezes no ficheiro para instalá-lo. Siga as instruções para aceitar a licença (nota de tradução: com o instalador MySQL para Windows pode optar por fazer de uma vez só a instalação do MySQL Server e do MySQL Workbench; para isso, escolha os respectivos componentes e siga as instruções abaixo). +Depois que os componentes forem instalados, serão solicitadas as seguintes opções: + +###### 1. Escolhendo um tipo de configuração + +Selecione: **Developer Default** (Padrão do desenvolvedor). Esta opção *instala o MySQL Server e as ferramentas necessárias para o desenvolvimento da aplicação. Isto é útil se pretendes desenvolver aplicações para um servidor existente.* +(Ver abaixo) + +{% include figure.html filename="introducao-ao-mysql-e-r-1.PNG" caption="Configure o tipo de padrão do desenvolvedor" %} + +###### 2. Verificar Requisitos + +Clique no botão **Execute** caso haja requisitos pendentes (*failing requirements*) listados na checagem de requisitos. A lista de requisitos pode ser diferente da mostrada aqui. Uma vez que o processo de executar instalar os requisitos pendentes, clique no botão *Next* . +(Ver abaixo) + +{% include figure.html filename="introducao-ao-mysql-e-r-2.PNG" caption="Clique no botão *Execute* se necessário" %} + +###### 3. Tipo e Rede (1) + +Selecione: **Standalone MySQL Server** +(Ver abaixo) + +{% include figure.html filename="getting-started-with-mysql-7.png" caption="Select Standalone MySQL Server" %} + +###### 4. Tipo e Rede (2) + +*Config type*: Selecione: **Development Computer** +Checar: TCP/IP. Port number (Número da porta): 3306. +(Ver abaixo) + +{% include figure.html filename="introducao-ao-mysql-e-r-4.png" caption="Development Computer TCPIP Port 3306" %} + +###### 5. Contas e Funções + +{% include figure.html filename="introducao-ao-mysql-e-r-5.png" caption="Digite a senha *root* e depois guarde-a em local seguro" %} + +###### 6. Serviço do Windows + +As configurações aqui são opcionais, mas achamos mais fácil configurar o MySQL como um serviço do Windows e inclui-lo na inicialização automática. Um serviço do Windows é um processo que é executado no computador enquanto se está trabalhando. É possível mudar as configurações do serviço do Windows posteriormente, para iniciar o MySQL manualmente, para impedir que o programa inicialize quando não for necessário. + +{% include figure.html filename="introducao-ao-mysql-e-r-6.png" caption="MySQL como um serviço do Windows" %} + +Clique nos botões *Execute* e *Next* para finalizar a instalação e inicializar o servidor. + +###### 7. MySQL Workbench e Senha Root + +Procure por MySQL Workbench no menu de inicialização do Windows, sob o item MySQL. Se está lá, clique para iniciar. Caso não esteja, clique no instalador do MySQL - Community para executar novamente a instalação e adicionar o MySQL Workbench aos componentes instalados. +Depois de aberto o MySQL Workbench, clique na instância local do seu MySQL Server. +Quando a senha *root* for solicitada, digite a senha criada na etapa *5. Accounts and Roles*. +(Ver abaixo) + +{% include figure.html filename="introducao-ao-mysql-e-r-7.png" caption="Senha Root" %} + +##### Dicas de instalação para um Mac + +###### 1. Instalação do MySQL Community Server + +Com o ficheiro de instalação do MySQL Community Server baixado, clique duas vezes no ficheiro para instalá-lo. (Ver abaixo) + +{% include figure.html filename="introducao-ao-mysql-e-r-8.png" caption="Ficheiro de instalação" %} + +###### 2. Guarde a senha temporária + +Siga as instruções para aceitar a licença e o local de instalação. **Importante: Uma senha temporária será solicitada. Guarde-a cuidadosamente.** (Veja o exemplo abaixo. Sua senha temporária será diferente da mostrada abaixo.) Se um erro for cometido, é possível remover o servidor instalado e reinstalá-lo, mas essa é uma pequena complicação. Um dos revisores dessa lição achou que [essa resposta do StackOverflow](https://perma.cc/J4Q5-SLK5) pode auxiliar nesta etapa. + +{% include figure.html filename="getting-started-with-mysql-18.png" caption="Senha temporária" %} + +Concluída a instalação, iremos alterar a senha *root* para o servidor do MySQL. + +###### 3. Modifique a senha do servidor do MySQL + +**Esta seção da lição causou dificuldade para algumas pessoas. Leve o tempo que for necessário e note, por favor, que os comandos do MySQL terminam com um ponto e vírgula. Observe-os em alguns dos comandos abaixo.** + +3.1. Abra uma janela do terminal + +3.2. Adicione /usr/local/mysql/bin ao PATH através do comando abaixo. O PATH é uma lista de diretórios que o computador considera quando um comando é digitado para executar um programa. No próximo passo abaixo, ao executar o *mysql*, o PATH busca pelos diretórios que contém o programa *mysql*. O PATH procura pelo *mysql* no diretório */usr/local/mysql/bin* e o executa. O PATH apenas salva o caminho completo que for digitado, nesse caso, */usr/local/mysql/bin/mysql*, para um programa quando se quer executá-lo. + +``` +export PATH=${PATH}:/usr/local/mysql/bin +``` + +3.3. Inicie o servidor do MySQL. + +Vá até System Preferences > imagem do MySQL > clique em "Start MySQL server". + +3.4. Inicie uma sessão no MySQL. No comando abaixo, depois de *--password*, digite a senha guardada no passo *2. Guarde a senha temporária*. + +``` +mysql --user=root --password=senha_root_guardada_acima +``` + +3.5. Configure a senha *root* para uma **nova** senha. Escolha e guarde a nova senha cuidadosamente. No *prompt* mysql> , digite o seguinte comando, substituindo a nova senha entre aspas simples no comando SET PASSWORD=PASSWORD('password') com a nova senha criada. + +``` +SET PASSWORD=PASSWORD('nova_senha_criada_na_etapa_3.5'); +``` + +3.6. Reinicie o computador. Depois de reiniciar, é possível que seja necessário repetir a etapa *3.3 Inicie o servidor do MySQL* acima. + +###### 4. Download do MySQL Workbench + +Clique nesse link: [http://dev.mysql.com/downloads/workbench/](http://dev.mysql.com/downloads/workbench/). Role a página para baixo e clique em **Select Operating System** para selecionar o sistema operacional que corresponde ao seu computador. Se necessário, clique em **Select OS Version** para selecionar a versão do sistema operacional. Feito isso, clique no botão azul de **Download**. Na página de download, role para baixo e terá a opção de iniciar o download ao clicar em **No thanks, just start my download.** (Não, obrigado, apenas inicie o download.) + +Com o ficheiro baixado, clique duas vezes para instalá-lo. Feita a instalação do MySQL Workbench de acordo com as instruções na tela, arraste o ícone para a pasta de aplicações da esquerda. (Ver abaixo) + +{% include figure.html filename="introducao-ao-mysql-e-r-10.png" caption="MySQL Workbench" %} + +# Crie um banco de dados + +Aqui iremos criar um banco de dados que serve como um contentor para as tabelas nas quais armazenaremos informações. Uma tabela é a estrutura que mantém os dados que queremos armazenar. Tabelas contém muitas linhas de registros. Um exemplo de informações básicas de contato conteria campos para nome, número de telefone e endereço de e-mail. Numa tabela, os campos são organizados por *colunas*. + +Aqui está uma tabela de amostra com uma linha de dados que representa um registro: + +| nome | número de telefone | endereço de e-mail | +| ----------- | ------------------ | ------------------ | +| Pat Abraham | 613-555-1212 | pat@zmail.ca | + +## Abra o MySQL Workbench + +Abra o MySQL Workbench. Clique duas vezes em *Local Instance MySQL80* (num Mac isto pode aparecer como *Local Instance 3306*). É possível que a senha *root* criada nas etapas acima seja solicitada. Em alguns Macs, uma aba de *Query* será aberta; se não for, abra uma aba de *Query* utilizando: *File > New Query Tab*. + +## Crie um banco de dados + +Agora iremos criar um novo banco de dados. Utilizando o MySQL Workbench, realize os seguintes passos: + +1. Na janela de **Query**, digite: + + ``` + CREATE DATABASE periodicos_resultados_pesquisa; + ``` + +2. Execute o comando CREATE DATABASE. Clique no **relâmpago/raio** ou, utilizando o menu, clique em *Query* e então em *Execute Current Statement*. + +3. O novo banco de dados **periodicos_resultados_pesquisa** deve estar visível na aba **SCHEMAS**, no canto superior esquerdo da tela. Se não conseguir visualizar um item chamado periodicos_resultados_pesquisa, clique no botão de atualizar. + +(Ver abaixo:) + +{% include figure.html filename="introducao-ao-mysql-e-r-11.png" caption="Crie um banco de dados no MySQL Workbench" %} + +## USE o banco de dados + +Em seguida, iremos inserir uma declaração USE para informar ao MySQL qual banco de dados será usado. Isto se torna mais importante quando se tem mais de um banco de dados no computador. + +Na janela de **Query**, apague todo o comando CREATE DATABASE e digite: + +``` +USE periodicos_resultados_pesquisa; +``` + +Novamente, clique no **relâmpago/raio** ou, usando o menu, clique em *Query* e então em *Execute Current Statement*. É possível usar a tecla de teclado para isso. Num Mac, use *Command+Return*. Num PC, use *Ctrl+Shift+Enter*. A partir desse ponto da lição, todas as vezes que um comando for digitado na janela de *Query* será executado desta maneira. + +(Ver abaixo:) + +{% include figure.html filename="introducao-ao-mysql-e-r-12.png" caption="USE um banco de dados no MySQL Workbench" %} + +# Adicione uma tabela + +1. No MySQL Workbench, procure no lado esquerdo no painel **Navigator**, na aba **SCHEMAS**, por **periodicos_resultados_pesquisa**. +2. Clique em **Tables** com o lado direito do mouse e depois clique em **Create Table**. +3. Para **Table Name:** digite **tbl_periodicos_resultados_pesquisa** + +## Adicione colunas à tabela + +Adicione essas colunas: + +1. **id** Data type: **INT**. Clique PK (Primary Key), NN (Not Null) e AI (Auto Increment). Esta coluna de *id* será usada para relacionar registros nesta tabela com registros em outras tabelas. +2. **titulo_artigo** Data type: **VARCHAR(99)**. Esta coluna armazenará o título de cada resultado de artigo que coletarmos da busca. +3. **data_publicacao_artigo** Data type: **DATETIME**. Esta coluna armazenará a data em que o periódico foi publicado. +4. **url_artigo** Data type: **VARCHAR(99)**. Esta coluna armazenará a url de cada resultado que coletarmos da pesquisa. +5. **termo_busca_usado** Data type: **VARCHAR(45)**. Esta coluna irá armazenar a palavra que usamos para buscar os periódicos. + Clique no botão **Apply**. + +Se preferir, todas as etapas acima podem ser realizadas com um comando. Este comando pode ser executado na janela de *Query* para criar a tabela com as colunas indicadas acima. + +``` +CREATE TABLE periodicos_resultados_pesquisa.tbl_periodicos_resultados_pesquisa ( +id INT NOT NULL AUTO_INCREMENT, +titulo_artigo VARCHAR(99) NULL, +data_publicacao_artigo DATETIME NULL, +url_artigo VARCHAR(99) NULL, +termo_busca_usado VARCHAR(45) NULL, +PRIMARY KEY (id)); +``` + +*Dica: Leve o tempo que for necessário para pensar sobre a elaboração da tabela e sua nomeação, uma vez que um banco de dados bem elaborado será mais fácil de trabalhar e entender.* + +## Adicione um usuário para se conectar ao banco de dados + +Um usuário é uma conta que tem permissão para se conectar a um banco de dados. Abaixo, adicionaremos um novo usuário para que essa conta apenas se conecte a esse novo banco de dados. Usar essa conta de usuário para uma conexão com esse banco de dados limita a exposição a outros bancos de dados, caso a senha para este usuário seja comprometida. Dar ao usuário os privilégios mínimos requeridos para realizar o necessário reduz o risco, caso outra pessoa tiver acesso à senha de usuário. Por exemplo, se um usuário pode apenas ler um banco de dados, é um risco menor se a senha for descoberta do que um usuário que também pode alterar ou apagar o banco de dados. + +No menu do MySQL Workbench, clique em **Server** e depois em **Users and Privileges** + +**Usuários de Mac** - Em alguns computadores Mac, como meu laptop de teste, o painel de **Schema Privileges** não é exibido corretamente. Veja a nota abaixo da captura de tela se isso ocorrer. + +Clique no botão **Add Account** e complete os detalhes para a nova conta de usuário na caixa de diálogo: + +1. Login Name: **periodicos_pesquisa_usuario** +2. Authentication Type: selecione **Standard** +3. Limit to Hosts Matching: **localhost** +4. Tecle *Enter* e confirme uma senha *AlgoDificil* +5. Clique na aba **Administrative Roles**. Certifique-se de que nada está marcado. Esta conta é apenas para acessar o banco de dados. +6. Clique na aba **Schema Privileges** e clique **Add Entry**. +7. Na caixa de diálogo **New Schema Privilege Definition**, clique na caixa de seleção **Selected schema:** e selecione **periodicos_resultados_pesquisa**. Clique OK. +8. Clique em todas as opções de *Object Rights*: SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW, como mostrado na imagem abaixo. (Este usuário precisará fazer muitas coisas posteriormente na lição, por isso, estamos lhe concendendo várias permissões.) +9. Clique em **Apply**. + +{% include figure.html filename="introducao-ao-mysql-e-r-13.PNG" caption="Configurando permissões para a nova conta" %} + +### Schema Privileges não exibidos corretamente + +Alguns computadores Mac, como meu laptop de teste, não exibem corretamente o painel de **Schema Privileges**. Nesse caso, é possível realizar a tarefa acima através de um *script* usando uma janela de Query. + +Se o usuário já foi criado acima, execute o seguinte comando para lhe conceder privilégios de usuário: + +``` +GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON periodicos_resultados_pesquisa.* TO 'periodicos_pesquisa_usuario'@'localhost'; +``` + +Se o usuário não foi criado ainda, execute estes dois comandos para criar um usuário e depois lhe conceder privilégios de usuário: + +``` +CREATE USER 'periodicos_pesquisa_usuario'@'localhost' IDENTIFIED BY 'AlgoDificil'; +GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW ON periodicos_resultados_pesquisa.* TO 'periodicos_pesquisa_usuario'@'localhost'; +``` + +### MySQL versão 8 e tipo de autenticação de usuário. + +Quando um usuário é criado no MySQL 8 Workbench o **Authentication Type** (tipo de autenticação) é configurado para o padrão **caching_sha2_password**. Esse tipo de autenticação causa um erro para o pacote R que usaremos para conectar o banco de dados mais tarde nesta lição. O erro é *Authentication plugin 'caching_sha2_password' cannot be loaded* e é descrito no [Stack Overflow](https://perma.cc/7NVR-TSYT). + +Para evitar esse erro, podemos modificar o tipo de autenticação do usuário para padrão (Standard). Para fazer isso, execute o seguinte comando na janela de *Query*: + +``` +ALTER USER 'periodicos_pesquisa_usuario'@'localhost' IDENTIFIED WITH mysql_native_password BY 'AlgoDificil'; +``` + +# Crie um R Script que se conecte ao banco de dados + +Abra o RStudio, que foi instalado anteriormente na lição. Veja a seção [RStudio](#rstudio). + +Agora usaremos o RStudio para escrever um novo R Script e salvá-lo com o nome periodicos_resultados_pesquisa.R. + +Vá em File > New File > R Script e depois salve o novo ficheiro com o nome periodicos_resultados_pesquisa.R. + +Usaremos o pacote RMariaDB para realizar a conexão com o MySQL. (Se tiver curiosidade, a documentação para o pacote RMariaDB pode ser encontrada [aqui](https://perma.cc/FX5P-DAW7).) + +Se não possui o pacote RMariaDB instalado (o que é provável, caso seja a primeira vez que usa o RStudio), instale-o utilizando o _console_ do RStudio. Após abrir o RStudio, copie e cole o seguinte para a janela da esquerda no >, e depois dê enter: + +``` +install.packages("RMariaDB") +``` + +Adicione o seguinte comando ao script periodicos_resultados_pesquisa.R (janela de cima, à esquerda) + +``` +library(RMariaDB) +``` + +## Conectando a um banco de dados com uma senha + +Primeiro, nos conectaremos ao banco de dados usando uma senha. (Depois utilizaremos um meio de conexão melhor). Por hora, usaremos uma variável para armazenar a senha. Cada vez que iniciar o R, será necessário apagar esta variável, mas isso é melhor do que publicar uma senha *hardcoded* caso compartilhe seus scripts, como pode fazer usando o GitHub. + +No console do RStudio, digite o comando abaixo, substituindo *AlgoDificil* com a senha criada para periodicos_pesquisa_usuario nos passos realizados acima para adicionar um usuário ao banco de dados. + +``` +senhadeusuariolocal <- "AlgoDificil" +``` + +Adicione as seguintes declarações em R ao ficheiro periodicos_resultados_pesquisa.R file e salve-o. + +Para executar este script, selecione todo o texto e clique no botão *Run* (Executar). (Há outras maneiras de executar apenas uma parte do script ou o script inteiro. Se tiver curiosidade, procure no menu abaixo de Code > Run Region. O comando CTRL+ALT+R executa todo o código em R no script.) + +``` +library(RMariaDB) +# O método de conexão abaixo utiliza uma senha armazenada numa variável. +# Para utilizar isto, configure senhadeusuariolocal="A senha de periodicos_pesquisa_usuario" + +artigosDb <- dbConnect(RMariaDB::MariaDB(), user='periodicos_pesquisa_usuario', password=senhadeusuariolocal, dbname='periodicos_resultados_pesquisa', host='localhost') +dbListTables(artigosDb) +dbDisconnect(artigosDb) +``` + +No console, deverá visualizar: + +``` +> dbListTables(artigosDb) +[1] "tbl_periodicos_resultados_pesquisa" +> dbDisconnect(artigosDb) +``` + +Sucesso! O que conseguiu: + +1. Conectar ao banco de dados com dbConnect. +2. Listar a tabela no banco de dados com dbListTables. +3. Desconectar do banco de dados usando dbDisconnect. + +### Conectar-se ao banco de dados com uma senha armazenada num ficheiro de configuração + +O exemplo acima de conexão é uma das maneiras de conectar-se. O método de conexão descrito abaixo armazena a informação da conexão do banco de dados num ficheiro de configuração, para que não seja necessário digitar uma senha numa variável todas as vezes que uma sessão no R for iniciada. Acredito que esse é um processo minucioso, mas é uma maneira mais padronizada e segura de proteger as credenciais usadas para acessar seu banco de dados. Esse método de conexão será usado no código para o restante desse tutorial, mas pode ser substituído pelo método de conexão mais simples mostrado acima se preferir. + +#### Crie o ficheiro .cnf para armazenar a informação de conexão com o banco de dados MySQL + +1. Abra um editor de texto, como o notepad, nano ou TextEdit e cole os itens abaixo, modificando a senha para a criada para periodicos_pesquisa_usuario nas etapas acima para adicionar um usuário e conectá-lo ao banco de dados. + +``` +[periodicos_resultados_pesquisa] +user=periodicos_pesquisa_usuario +password=AlgoDificil +host=127.0.0.1 +port=3306 +database=periodicos_resultados_pesquisa +``` + +2. Salve este ficheiro em algum local fora do diretório de trabalho do R. Salvei o meu no mesmo diretório de outros ficheiros de configuração do MySQL. No PC, o caminho foi o seguinte: C:\Program Files\MySQL\MySQL Server 8.0. Dependendo de seu sistema operacional e da versão do MySQL, esse local pode estar em outro lugar. No Mac, usei /Users/blackadar/Documents/ como a pasta de destino. Testei colocar este ficheiro em lugares diferentes, apenas é necessário que o R possa localizá-lo quando o script for executado. Nomeie o ficheiro como **periodicos_resultados_pesquisa.cnf**. + +3. Atualize o script periodicos_resultados_pesquisa.R acima para conectar-se ao banco de dados usando o ficheiro de configuração. + +``` +library(RMariaDB) +# O método de conexão abaixo utiliza uma senha armazenada num ficheiro de configuração. + +# O R precisa de um caminho completo para encontrar o ficheiro de configuração. +rmariadb.settingsfile<-"C:/Program Files/MySQL/MySQL Server 8.0/periodicos_resultados_pesquisa.cnf" + +rmariadb.db<-"periodicos_resultados_pesquisa" +artigosDb<-dbConnect(RMariaDB::MariaDB(),default.file=rmariadb.settingsfile,group=rmariadb.db) + +# Lista a tabela. Isso confirma que estamos conectados ao banco de dados. +dbListTables(artigosDb) + +# Desconecta para limpar a conexão com o banco de dados. +dbDisconnect(artigosDb) +``` + +4. Execute seu script. + +No console, entre outras linhas, deverá ver novamente: + +``` +> dbListTables(artigosDb) +[1] "tbl_periodicos_resultados_pesquisa" +``` + +De maneira bem sucedida, a conexão com o banco de dados foi realizada utilizando um ficheiro de configuração. + +# Armazenando dados numa tabela com o SQL + +Nesta seção da lição, criaremos uma declaração no SQL para inserir uma linha de dados no banco de dados sobre esse [artigo de periódico](https://perma.cc/C8MR-WYV2). Iremos inserir primeiro o registro no MySQL Workbench e depois faremos isso no R. + +1. No MySQL Workbench, clique na imagem categorizada como SQL+ para criar uma nova aba para o SQL executar consultas (ou vá ao menu "File" e escolha a opção "New Query Tab"). + +2. Cole a declaração abaixo na janela de Query. Esta ação irá inserir um registro na tabela. + + ``` + INSERT INTO tbl_periodicos_resultados_pesquisa ( + titulo_artigo, + data_publicacao_artigo, + url_artigo, + termo_busca_usado) + VALUES('THE LOST LUSITANIA.', + '1915-05-21', + LEFT(RTRIM('http://newspapers.library.wales/view/4121281/4121288/94/'),99), + 'German+Submarine'); + ``` + +3. Clique na imagem de relâmpago/raio na aba do SQL para executar a declaração SQL. + +{% include figure.html filename="introducao-ao-mysql-e-r-14.png" caption="Inserindo um registro numa tabela usando MySQL Workbench" %} + +## Explicação da declaração INSERT + +| SQL | Significado | +| --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| INSERT INTO tbl_periodicos_resultados_pesquisa ( | Insere um registro na tabela nomeada tbl_periodicos_resultados_pesquisa | +| titulo_artigo, | nome do campo a ser preenchido por um valor | +| data_publicacao_artigo, | " | +| url_artigo, | " | +| termo_busca_usado) | " | +| VALUES('THE LOST LUSITANIA.', | O valor a ser inserido no campo titulo_artigo | +| '1915-05-21', | campo data_publicacao_artigo | +| LEFT(RTRIM('http://newspapers.library.wales/view/4121281/4121288/94/'),99), | campo url_artigo. Este campo é um VARCHAR(99), portanto tem um máximo de 99 caracteres. Inserir uma URL mais longa que 99 caracteres causaria um erro, portanto, duas funções são utilizadas para controlar isso. RTRIM() reduz espaços residuais à direita da URL. LEFT(value,99) retorna apenas os 99 caracteres mais à esquerda da URL reduzida. Esta URL é mais curta que isso, então essas funções estão aqui apenas como exemplo. | +| 'German+Submarine'); | campo termo_busca_usado | + +Opcional: Modifique a declaração INSERT acima e execute-a algumas vezes. Por exemplo: + +``` +INSERT INTO tbl_periodicos_resultados_pesquisa ( +titulo_artigo, +data_publicacao_artigo, +url_artigo, +termo_busca_usado) +VALUES('test insert.', +'1916-07-01', +LEFT(RTRIM('http://newspapers.library.wales/view/4121281/4121288/94/'),99), +'German+Submarine'); +``` + +## Consultando dados numa tabela com o SQL + +Nesta seção da lição, criaremos uma declaração no SQL para selecionar uma linha de dados do banco de dados que inserimos. Selecionaremos o primeiro registro no MySQL Workbench e depois faremos isso no R. + +1. Cole a declaração abaixo numa janela de query no MySQL Workbench. Isto irá selecionar registros da tabela. + + ``` + SELECT titulo_artigo FROM tbl_periodicos_resultados_pesquisa; + ``` + +2. Clique na imagem de relâmpago/raio na aba do SQL para executá-la. Deverá visualizar o título do artigo "THE LOST LUSITANIA." na grade de resultados. Ver abaixo. + +{% include figure.html filename="introducao-ao-mysql-e-r-15.png" caption="Selecionando registros de uma tabela usando MySQL Workbench" %} + +Opcional: Modifique a declaração SELECT acima alterando os campos selecionados e execute novamente. Adicione mais de um campo para a declaração SELECT e execute: + +``` +SELECT titulo_artigo, data_publicacao_artigo FROM tbl_periodicos_resultados_pesquisa; +``` + +## Armazenando dados numa tabela com SQL usando R + +Vamos fazer isso usando R! Abaixo se encontra uma versão expandida do R Script que usamos para nos conectar ao banco de dados. Para sermos concisos, os três primeiros comentários que tínhamos no R Script mostrado acima foram removidos. Não são mais necessários. + +Na linha 4 do script abaixo, lembre-se de modificar o caminho do rmariadb.settingsfile que corresponde à localização desse ficheiro em seu computador. + +``` +library(RMariaDB) +# O método de conexão abaixo utiliza uma senha armazenada num ficheiro de configuração. + +# O R precisa de um caminho completo para encontrar o ficheiro de configuração. +rmariadb.settingsfile<-"C:/Program Files/MySQL/MySQL Server 8.0/periodicos_resultados_pesquisa.cnf" + +rmariadb.db<-"periodicos_resultados_pesquisa" +artigosDb<-dbConnect(RMariaDB::MariaDB(),default.file=rmariadb.settingsfile,group=rmariadb.db) + +# Opcional. Liste a tabela. Isso confirma que nos conectamos ao banco de dados. +dbListTables(artigosDb) + +# Cria a declaração de query. +query<-"INSERT INTO tbl_periodicos_resultados_pesquisa ( +titulo_artigo, +data_publicacao_artigo, +url_artigo, +termo_busca_usado) +VALUES('THE LOST LUSITANIA.', +'1915-05-21', +LEFT(RTRIM('http://newspapers.library.wales/view/4121281/4121288/94/'),99), +'German+Submarine');" + +# Opcional. Exibe o query para o caso de ser necessário solucionar problemas. +print(query) + +# Executa o query no artigoDb que conectamos abaixo. +rsInsert <- dbSendQuery(artigosDb, query) + +# Limpa o resultado. +dbClearResult(rsInsert) + +# Desconecta para limpar a conexão com o banco de dados. +dbDisconnect(artigosDb) +``` + +No script acima, realizamos duas etapas para inserir um registro: + +1. Defina a declaração INSERT na linha com: query <- "INSERT INTO tbl_periodicos_resultados_pesquisa ( +2. Execute a declaração INSERT armazenada na variável da consulta com: rsInsert <- dbSendQuery(artigosDb, query) + +Execute o script acima no R Studio e depois execute uma declaração SELECT no MySQL Workbench. Consegue visualizar o novo registro adicionado? + +### Realize uma limpeza nos dados de teste + +Neste ponto é provável que haja mais de um registro com o título de artigo "THE LOST LUSITANIA.", o que é razoável para a testagem, mas não queremos dados duplicados. Iremos remover os dados de teste e começar novamente. Usando a janela de query no MySQL Workbench, execute a declaração SQL: + +``` +TRUNCATE tbl_periodicos_resultados_pesquisa; +``` + +No painel Action Output do MySQL Workbench deverá visualizar: + +``` +TRUNCATE tbl_periodicos_resultados_pesquisa; 0 row(s) affected 0.093 sec +``` + +Para praticar o que acabamos de fazer: + +1. Execute uma declaração SELECT novamente. Não deverá receber linhas de retorno. +2. Execute novamente o script em R acima para inserir um registro. +3. Realize uma declaração SELECT. Deverás visualizar uma linha de dados. + +### Modifique a declaração INSERT para usar variáveis + +Iremos inserir muitos dados na tabela usando o R, então mudaremos a declaração INSERT para usar variáveis. Veja no código abaixo o destaque *# Compila o query.* + +``` +library(RMariaDB) +# O método de conexão abaixo utiliza uma senha armazenada num ficheiro de configuração. + +# O R precisa de um caminho completo para encontrar o ficheiro de configuração. +rmariadb.settingsfile<-"C:/Program Files/MySQL/MySQL Server 8.0/periodicos_resultados_pesquisa.cnf" + +rmariadb.db<-"periodicos_resultados_pesquisa" +artigosDb<-dbConnect(RMariaDB::MariaDB(),default.file=rmariadb.settingsfile,group=rmariadb.db) + +# Opcional. Lista a tabela. Isso confirma que nos conectamos ao banco de dados. +dbListTables(artigosDb) + +# Compila o query. + +# Atribui variáveis. +entradaTitulo <- "THE LOST LUSITANIA." +entradaPublicacao <- "21 05 1916" +# Converte o valor da string para uma data para armazená-la no banco de dados. +entradaDataPublicacao <- as.Date(entradaPublicacao, "%d %M %Y") +entradaUrl <- "http://newspapers.library.wales/view/4121281/4121288/94/" +buscaSimplesTermos <- "German+Submarine" + +# Cria a declaração de query. +query<-paste( + "INSERT INTO tbl_periodicos_resultados_pesquisa ( + titulo_artigo, + data_publicacao_artigo, + url_artigo, + termo_busca_usado) + VALUES('",entradaTitulo,"', + '",entradaDataPublicacao,"', + LEFT(RTRIM('",entradaUrl,"'),99), + '",buscaSimplesTermos,"')", + sep = '' +) + +# Opcional. Exibe o query para o caso de ser necessário solucionar problemas. +print(query) + +# Executa o query no banco de dados artigosDb que conectamos acima. +rsInsert <- dbSendQuery(artigosDb, query) + +# Limpa o resultado. +dbClearResult(rsInsert) + +# Desconecta para limpar a conexão com o banco de dados. +dbDisconnect(artigosDb) +``` + +Vamos testar esse script: + +1. Execute uma declaração SELECT e observe as linhas que possui. +2. Execute o script em R acima para inserir outro registro. +3. Realize a declaração SELECT. Deverá visualizar uma linha adicional de dados. + +### Erros do SQL + +Vamos criar um simples erro no SQL para visualizar o que acontece. + +No R, modifique: + +``` +entradaTitulo <- "THE LOST LUSITANIA." +``` + +para + +``` +entradaTitulo <- "THE LOST LUSITANIA'S RUDDER." +``` + +e execute novamente o script. + +No console R, há um erro: + +``` +> rsInsert <- dbSendQuery(artigosDb, query) +Error in result_create(conn@ptr, statement, is_statement) : + You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'S RUDDER.', + '1916-05-21', + LEFT(RTRIM('http://newspapers.library.wales/view/4' at line 6 [1064] +``` + +É possível verificar, com uma declaração SELECT, se não há registro na tabela com um título de artigo denominado *THE LOST LUSITANIA'S RUDDER*. + +As aspas simples fazem parte da sintaxe do SQL e indicam uma entrada textual. Se estiverem no lugar errado, provocam um erro. Temos que lidar com casos nos quais há dados com aspas. O SQL aceita duas aspas numa declaração de inserção para representar aspas em dados(''). + +Lidaremos com as aspas utilizando uma função `gsub` para substituir aspas simples por aspas duplas, como mostrado abaixo. + +``` +entradaTitulo <- "THE LOST LUSITANIA'S RUDDER." +# altera aspas simples para aspas duplas +entradaTitulo <- gsub("'", "''", entradaTitulo) +``` + +Agora que a questão das aspas no título do artigo está resolvida, execute novamente o script e depois confira com uma declaração SELECT no MySQL Workbench. + +``` +SELECT * FROM periodicos_resultados_pesquisa.tbl_periodicos_resultados_pesquisa WHERE titulo_artigo = "THE LOST LUSITANIA'S RUDDER."; +``` + +Uma vez que o registro teste foi visualizado, digite TRUNCATE tbl_periodicos_resultados_pesquisa para remover esses dados de teste. + +# Armazenando um ficheiro de valores separados por vírgulas (.csv) no banco de dados MySQL + +Na próxima parte da lição, vamos realizar consultas na tabela do banco de dados. Nosso objetivo é obter dados suficientes na tabela para construir um gráfico. Para nos prepararmos para isso, carregaremos alguns dados de amostra de um ficheiro de valores separados por vírgulas (.csv). + +Faça o download dos ficheiros .csv para o seu diretório de trabalho do R. Esses ficheiros estão armazenados no GitHub, então faça o download da versão *Raw* dos ficheiros. + +1. [dados-amostra-jardim.csv](/assets/getting-started-with-mysql-using-r/dados-amostra-jardim.csv) Esta é uma lista de artigos de periódicos galeses publicados durante a Primeira Guerra Mundial que correspondem aos termos de busca "*allotment*"(loteamento) e "*garden*"(jardim). +2. [dados-amostra-submarino.csv](/assets/getting-started-with-mysql-using-r/dados-amostra-submarino.csv) Esta é uma lista de artigos de periódicos galeses publicados durante a Primeira Guerra Mundial que correspondem aos termos de busca "*German*"(alemão) e "*submarine*"(submarino). + +No R, execute a função read.csv() e depois visualize o data frame com os dados amostrais. + +``` +dadosAmostraJardim <- read.csv(file="dados-amostra-jardim.csv", header=TRUE, sep=",") +dadosAmostraJardim +``` + +Muitos dados serão visualizados, incluindo os que se encontram abaixo. Cheque a aba "Environment" (ambiente) na parte direita do RStudio. O Data Frame dadosAmostraJardim deve conter "1242 obs. of 4 variables". + +``` + titulo_artigo +1 -."e;'N'III GARDEN REQUISITES. +<...the result of the data frame results have been removed...> + data_publicacao_artigo url_artigo termo_busca_usado +1 1918-05-11 http://newspapers.library.wales/view/3581057/3581061/27/ AllotmentAndGarden +<...the result of the data frame results have been removed...> +``` + +Observe que nesses dados de amostra, os nomes dos campos estão incluídos no cabeçalho por conveniência: titulo_artigo, data_publicacao_artigo, url_artigo e termo_busca_usado. + +Como observado acima, nosso objetivo aqui é inserir os dados de amostra que estão armazenados no data frame dadosAmostraJardim na tabela MySQL periodicos_resultados_pesquisa. Podemos fazer isso de diferentes maneiras. Uma delas é repetir para cada linha de dado do data frame e executar um comando INSERT, como fizemos acima. Aqui, no entanto, usaremos um comando para inserir todas as linhas em dadosAmostraJardim de uma vez: *dbWriteTable*. Não execute essa declaração ainda, apenas a leia. + +``` +dbWriteTable(artigosDb, value = dadosAmostraJardim, row.names = FALSE, name = "tbl_periodicos_resultados_pesquisa", append = TRUE ) +``` + +| Função | Significado | +| -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| dbWriteTable(artigosDb, | Use a conexão do banco de dados MySQL artigosDb. | +| value = dadosAmostraJardim, | Insere os valores do data frame dadosAmostraJardim para a tabela. | +| row.names = FALSE, | Nenhum nome de linha foi especificado. | +| name = "tbl_periodicos_resultados_pesquisa", | Insere os valores de dadosAmostraJardim para a tabela tbl_periodicos_resultados_pesquisa | +| append = TRUE ) | Adiciona os valores ao que já existe na tabela. Se esse script rodar novamente, todas as linhas em dadosAmostraJardim serão adicionadas à mesma tabela novamente. | + +Ainda não estamos preparados para executar o comando dbWriteTable(). Primeiro precisamos nos conectar ao banco de dados. Aqui está o script para fazer isso, assim como para carregar o data frame dados-amostra-submarino.csv. Leia-o e execute-o. + +``` +library(RMariaDB) +rmariadb.settingsfile<-"/Program Files/MySQL/MySQL Server 8.0/periodicos_resultados_pesquisa.cnf" + +rmariadb.db<-"periodicos_resultados_pesquisa" +artigosDb<-dbConnect(RMariaDB::MariaDB(),default.file=rmariadb.settingsfile,group=rmariadb.db) + +# A função "setwd" define o directório de trabalho. Deve mudar o caminho desse directório para o directório onde guardou os ficheiros .csv. +setwd("C:/Users/User/Documents") + +# Realiza uma busca nos dados de amostra dos periódicos pelos termos "Allotment" e "Garden" +dadosAmostraJardim <- read.csv(file="dados-amostra-jardim.csv", header=TRUE, sep=",") + +# Uma coluna titulo_artigo na tabela do banco de dados pode armazenar valores até 99 caracteres. +# Esta declaração reduz qualquer título de artigo maior que 99 caracteres. +dadosAmostraJardim$titulo_artigo <- substr(dadosAmostraJardim$titulo_artigo,0,99) + +# Esta declaração formata data_publicacao_artigo para representar o tipo de dado DATETIME. +dadosAmostraJardim$data_publicacao_artigo <- paste(dadosAmostraJardim$data_publicacao_artigo," 00:00:00",sep="") + +dbWriteTable(artigosDb, value = dadosAmostraJardim, row.names = FALSE, name = "tbl_periodicos_resultados_pesquisa", append = TRUE ) + +# Realiza um busca nos dados de amostra dos periódicos pelos termos German+Submarine. +dadosAmostraSubmarino <- read.csv(file="dados-amostra-submarino.csv", header=TRUE, sep=",") + +dadosAmostraSubmarino$titulo_artigo <- substr(dadosAmostraSubmarino$titulo_artigo,0,99) +dadosAmostraSubmarino$data_publicacao_artigo <- paste(dadosAmostraSubmarino$data_publicacao_artigo," 00:00:00",sep="") + +dbWriteTable(artigosDb, value = dadosAmostraSubmarino, row.names = FALSE, name = "tbl_periodicos_resultados_pesquisa", append = TRUE ) + +# Desconecta para limpar a conexão com o banco de dados. +dbDisconnect(artigosDb) +``` + +Se o script for executado mais de uma vez, serão gerados registros duplicados. Se isso acontecer, apenas execute o comando TRUNCATE na tabela e execute o script novamente, mas apenas uma vez. É possível verificar se o número de registros é o correto. No MySQL Workbench, execute o seguinte na janela de Query: + +``` +SELECT COUNT(*) FROM tbl_periodicos_resultados_pesquisa; +``` + +A contagem deve retornar 2880 registros. 1242 de dadosAmostraJardim e 1638 de dadosAmostraSubmarino. + +# Selecionado dados de uma tabela com SQL usando R + +Nosso objetivo aqui é usar a tabela de artigos que importamos e criar um gráfico do número de artigos publicados nos *Welsh Newspapers* (jornais galeses) ao longo de cada mês da Primeira Guerra Mundial que corresponda aos termos de busca *allotment*(loteamento) e *garden* (jardim), e *German* (alemão) e *submarine*(submarino). + +O script abaixo consulta o banco de dados e produz o gráfico de linha abaixo. Leia o script e observe o que está acontecendo. Segue uma explicação do script. + +``` +library(RMariaDB) +rmariadb.settingsfile<-"/Program Files/MySQL/MySQL Server 8.0/periodicos_resultados_pesquisa.cnf" + +rmariadb.db<-"periodicos_resultados_pesquisa" +artigosDb<-dbConnect(RMariaDB::MariaDB(),default.file=rmariadb.settingsfile,group=rmariadb.db) + +termoBuscaUsado = "German+Submarine" +# Solicita uma contagem do número de artigos que correspondem ao termoBuscaUsado que foram publicados a cada mês. +query<-paste("SELECT ( COUNT(CONCAT(MONTH(data_publicacao_artigo), ' ',YEAR(data_publicacao_artigo)))) as 'count' + FROM tbl_periodicos_resultados_pesquisa + WHERE termo_busca_usado ='", termoBuscaUsado,"' + GROUP BY YEAR(data_publicacao_artigo),MONTH(data_publicacao_artigo) + ORDER BY YEAR(data_publicacao_artigo),MONTH(data_publicacao_artigo);",sep="") + +print(query) +rs = dbSendQuery(artigosDb,query) +dbRows<-dbFetch(rs) + +contagemArtigos<-c(as.integer(dbRows$count)) + +# Coloca os resultados da consulta numa série temporal. +qts1 = ts(contagemArtigos, frequency = 12, start = c(1914, 8)) +print(qts1) + +# Plota a série temporal qts1 dos dados com uma linha de espessura 3 na cor vermelha. +plot(qts1, + lwd=3, + col = "red", + xlab="Mês da Guerra", + ylab="Números de artigos de periódicos", + xlim=c(1914,1919), + ylim=c(0,150), + main=paste("Número de artigos nos jornais galeses (Welsh newspapers) que correspondem aos termos de busca listados.",sep=""), + sub="Legenda do termo de busca: Vermelho = German+Submarine. Verde = Allotment And Garden.") + +termoBuscaUsado="AllotmentAndGarden" + +# Solicita uma contagem do número de artigos que correspondem ao termoBuscaUsado que foram publicados a cada mês. +query<-paste("SELECT ( COUNT(CONCAT(MONTH(data_publicacao_artigo),' ',YEAR(data_publicacao_artigo)))) as 'count' FROM tbl_periodicos_resultados_pesquisa WHERE termo_busca_usado='",termoBuscaUsado,"' GROUP BY YEAR(data_publicacao_artigo),MONTH(data_publicacao_artigo) ORDER BY YEAR(data_publicacao_artigo),MONTH(data_publicacao_artigo);",sep="") +print(query) +rs = dbSendQuery(artigosDb,query) +dbRows<-dbFetch(rs) + +contagemArtigos<-c(as.integer(dbRows$count)) + +# Coloca os resultados da consulta numa série temporal. +qts2 = ts(contagemArtigos, frequency = 12, start = c(1914, 8)) + +# Adiciona esta linha com a série temporal qts2 à plotagem existente. +lines(qts2, lwd=3,col="darkgreen") + +# Limpa o resultado. +dbClearResult(rs) + +# Desconecta para limpar a conexão com o banco de dados. +dbDisconnect(artigosDb) +``` + +## Explicação do script de seleção de dados e criação do gráfico. + +O método que conecta o banco de dados é explicado [acima](#Conectando-a-um-banco-de-dados-com-uma-senha). + +Este script seleciona dois resultados de um conjunto de dados e cria um gráfico com esses dados. Um dos resultados é a combinação dos artigos de periódicos com a busca pelos termos "German+Submarine". Eles são consultados através da declaração SELECT: + +``` +SELECT ( + COUNT(CONCAT(MONTH(data_publicacao_artigo),' ',YEAR(data_publicacao_artigo)))) as 'count' + FROM tbl_periodicos_resultados_pesquisa + WHERE termo_busca_usado='",termoBuscaUsado,"' + GROUP BY YEAR(data_publicacao_artigo),MONTH(data_publicacao_artigo) + ORDER BY YEAR(data_publicacao_artigo),MONTH(data_publicacao_artigo); +``` + +| SQL | Significado | +| ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| SELECT ( | SELECT - Seleciona os dados que correspondem à condição na cláusula WHERE na tabela do banco de dados nomeado . | +| COUNT(CONCAT(MONTH(data_publicacao_artigo),' ',YEAR(data_publicacao_artigo)))) as 'count' | Fornece uma contagem do número de artigos publicados que compartilham o mesmo mês e ano de publicação. CONCAT representa a ação concatenar, que cria um único valor textual de dois ou mais valores textuais, nesse caso, o mês e o ano. | +| FROM tbl_periodicos_resultados_pesquisa | Este é o banco de dados a partir do qual estamos selecionando os dados. | +| GROUP BY YEAR(data_publicacao_artigo),MONTH(data_publicacao_artigo) | Esta declaração GROUP BY é importante para a contagem (COUNT) acima. Aqui os dados estão agrupados por mês e ano, para que seja possível contar todos os registros no grupo. | +| ORDER BY YEAR(data_publicacao_artigo),MONTH(data_publicacao_artigo); | Coloca os resultados ordenados por data, o que é útil já que queremos construir um gráfico por data. | + +As declarações abaixo executam a consulta e colocam o resultado *rs* num data frame *dbRows*: + +``` +rs = dbSendQuery(artigosDb,query) +dbRows<-dbFetch(rs) +``` + +Abaixo, o data frame *dbRows* é colocado numa série temporal com a função *ts()*, para que seja possível plotar para cada mês, iniciando de agosto de 1914. + +``` +# Coloca os resultados da consulta numa série temporal. +qts1 = ts(contagemArtigos, frequency = 12, start = c(1914, 8)) +``` + +Abaixo, os dados na série temporal *qts1* são plotados num gráfico: + +``` +plot(qts1, + lwd=3, + col = "red", + xlab="Mês da Guerra", + ylab="Números de artigos de periódicos", + xlim=c(1914,1919), + ylim=c(0,150), + main=paste("Número de artigos nos jornais galeses (Welsh newspapers) que correspondem aos termos de busca listados.",sep=""), + sub="Legenda do termo de busca: Vermelho = German+Submarine. Verde = Allotment And Garden.") +``` + +O que isso difere da parte do script que gera o gráfico dos artigos correspondentes à busca dos termos "Allotment And Garden"? Não muito, definitivamente. Apenas usamos a função *lines()* para plotar os resultados no mesmo gráfico que construímos acima. + +``` +lines(qts2, lwd=3,col="darkgreen") +``` + +### Resultados da seleção de dados e da criação do gráfico + +Aqui abaixo está o gráfico que deveria aparecer: + +{% include figure.html filename="introducao-ao-mysql-e-r-16.png" caption="Plotagem do número de artigos de periódicos publicados cada mês que correspondem aos termos de busca" %} + +# Indo mais longe com o MySQL + +Se deseja colocar um banco de dados num website, uma maneira de fazê-lo é usando MySQL e a linguagem PHP para construir as páginas do site. Um exemplo deste tipo de website é o que construí para [buscar edições do "the Equity newspaper"](https://perma.cc/237N-DD9E). O livro de Larry Ullman's, *PHP and MySQL for Dynamic Web Sites*, aborda como configurar e conectar um banco de dados usando MySQL e PHP de uma maneira resistente à hackers. + +Para exemplos do uso de SQL para ordenar e agrupar dados, assim com também realizar cálculos, veja: [MySQL by Examples for Beginners](http://web.archive.org/web/20171228130133/https://www.ntu.edu.sg/home/ehchua/programming/sql/MySQL_Beginner.html) ou MySQL [Examples of Common Queries](https://perma.cc/84HN-9DBL). + +# Conclusão + +Espero que tenha obtido o conhecimento para configurar uma tabela de banco de dados, conectá-lo e armazenar registros. Embora tenhamos abordado apenas uma pequena parte das diferentes maneiras de realizar consultas nos dados, espero também que saiba a técnica de uso das declarações SELECT para que possa utilizá-las em seus futuros projetos de história digital. + +# Créditos + +Finalizei esta lição graças ao suporte do [George Garth Graham Undergraduate Digital History Research Fellowship](https://perma.cc/S7PP-FY5U). + +Agradeço à Drª. Amanda Visconti pelo suporte e orientação ao longo da preparação desta lição. + +# Referências + +Ullman, L. 2005. *PHP and MySQL for Dynamic Web Sites, 2nd ed.* Berkeley, Calif: Peachpit. + +# Notas + +[^1]: Jason A. French, "Using R With MySQL Databases," blog (3 July 2014), [http://www.jason-french.com/blog/2014/07/03/using-r-with-mysql-databases/](https://perma.cc/5VYV-L5PG). + +[^2]: Taylor Arnold and Lauren Tilton, "Basic Text Processing in R," Programming Historian (27 March 2017), [tradução para português](/pt/licoes/processamento-basico-texto-r). + +[^3]: Taryn Dewar, "R Basics with Tabular Data," Programming Historian (05 September 2016), [tradução para português](/pt/licoes/nocoes-basicas-R-dados-tabulares). + +O script em R usado para recolher dados de amostra se encontra [aqui](https://perma.cc/87AE-LJRG). diff --git a/pt/licoes/processamento-basico-texto-r.md b/pt/licoes/processamento-basico-texto-r.md index bf5b55709a..08282f1da4 100644 --- a/pt/licoes/processamento-basico-texto-r.md +++ b/pt/licoes/processamento-basico-texto-r.md @@ -429,7 +429,8 @@ Para tal, vamos combinar a função `readLines` (ler linhas) para carregar o tex ```{r} -base_url <- "https://programminghistorian.org/assets/basic-text-processing-in-r" +base_url <- "https://github.com/programminghistorian/jekyll/tree/gh-pages/assets/basic-text-processing-in-r +" url <- sprintf("%s/sotu_text/236.txt", base_url) diff --git a/pt/pesquisa.md b/pt/pesquisa.md index 7c06ae3d77..b5cd27dec6 100755 --- a/pt/pesquisa.md +++ b/pt/pesquisa.md @@ -19,6 +19,7 @@ A equipe do projeto e membros da comunidade em geral estão envolvidos em vária ## Pesquisa publicada +* Matthew Lincoln, Sarah Melton, Jennifer Isasi, François Dominic Laramée, '[Relocating Complexity: The Programming Historian and Multilingual Static Site Generation](http://www.digitalhumanities.org/dhq/vol/16/2/000585/000585.html)', _Digital Humanities Quarterly_ 16, 2 (2022). * Jennifer Isasi e Antonio Rojas Castro, ‘[¿Sin equivalencia? Una reflexión sobre la traducción al español de recursos educativos abiertos](https://muse.jhu.edu/article/842253)’, _Hispania_, 104, no. 4 (2021), 613-624. * Adam Crymble e Maria José Afanador Llach, ‘The Globally Unequal Promise of Digital Tools for History: UK and Colombia Case Study’ in Adele Nye (ed.) _Teaching History for the Contemporary World_ (Springer, 2021), 85-98. * Daniel Alves, ['Ensinar Humanidades Digitais sem as Humanidades Digitais: um olhar a partir das licenciaturas em História'](https://novaresearch.unl.pt/files/32228034/Ensinar_Humanidades_Digitais.pdf), _Revista EducaOnline_, v. 15, n. 2 (2021). @@ -58,10 +59,12 @@ A equipe do projeto e membros da comunidade em geral estão envolvidos em vária ## Pósteres, Artigos em conferências & Palestras convidadas +* Matthias Gille Levenson, Sofia Papastamkou & Célian Ringwald, '_Programming Historian_: un lieu de collaborations et d'interactions multiples', [DHNord 2022](https://www.meshs.fr/page/dhnord2022.5): Travailler en humanités numériques: collaborations, complémentarités et tensions, Lille, França, (22 Junho 2022). * Adam Crymble, 'Local Needs for Global Digital Scholarship', _Quo Vadis_, UCL, Reino Unido (9 Junho 2022). * Matthias Gille Levenson & Gwenaëlle Patat, ‘_Programming Historian en français_ : Faire communauté pour le partage de ressources éducatives libres sur les méthodes numériques en sciences humaines et sociales francophones’, [Colloque Humanistica 2022: Association francophone des humanités numériques](https://hal.archives-ouvertes.fr/hal-03672420), Montreal, Canadá (Maio 2022). +* Eric Brasil, '[Criação, manutenção e divulgação de projetos de História em meios digitais: git, GitHub e o _Programming Historian_](https://doi.org/10.5281/zenodo.6566754)’ ([slides](https://ericbrasiln.github.io/hdfgv/), [vídeo](https://youtu.be/aJvjkSBETBw)), Escola de Cinências Sociais, Fundação Getúlio Vargas/Centro de Pesquisa e Documentação de História Contemporânea do Brasil, (20 May 2022). * Sofia Papastamkou, ‘Penser la pédagogie aux méthodes numériques au prisme de la reproductibilité: le cas du _Programming Historian_’, [Journées annuelles du réseau MATE-SHS: Recherche reproductible: regards croisés en sciences humaines et sociales](https://ja-mate2022.sciencesconf.org/resource/page/id/1), Paris, França, (17-18 Maio 2022). -* Eric Brasil, ‘[Criação, manutenção e divulgação de projetos de História em meios digitais: git, GitHub e o _Programming Historian_](https://cpdoc.fgv.br/eventos/20052022)’, Escola de Cinências Sociais, Fundação Getúlio Vargas/Centro de Pesquisa e Documentação de História Contemporânea do Brasil, (16 Maio 2022). +* Eric Brasil, ‘[Hemeroteca digital brasileira e a pesquisa histórica: reflexões sobre teoria e prática](https://doi.org/10.5281/zenodo.6568346)’ ([slides](https://ericbrasiln.github.io/hdufrn/), [vídeo](https://youtu.be/Uu3I9_a2knc)), Laboratório História e Memória da Educação - LAHMED da UFRN, (17 Maio 2022). * Adam Crymble, 'Building Methods with the Global South' Research Methodology Conference, Coventry, Reino Unido, (20 Abril 2022). * Adam Crymble, ‘[Trans-Atlantic Digital History and the Spatial Turn of Practice (as viewed from London)](https://ihrdighist.blogs.sas.ac.uk/2021/09/tuesday-29th-march-2022-dr-adam-crymble-ucl-trans-atlantic-digital-history/)’ Institute of Historical Research Digital History Seminar, London, Reino Unido, (29 Março 2022). * Jennifer Isasi, ‘El flujo editorial en _Programming Historian en español_’ Edición Digital de Textos, Máster Universitario en Humanidades Digitales, Universidad Internacional de La Rioja, Espanha,(2021-2022).