diff --git a/biome.json b/biome.json index 65aa60d0..d33f3e03 100644 --- a/biome.json +++ b/biome.json @@ -24,6 +24,7 @@ "packages/obsidian-plugin/main.js", "pnpm-lock.yaml", "package-lock.json", + "playwright-report", "yarn.lock" ] }, diff --git a/harper-brill/trained_tagger_model.json b/harper-brill/trained_tagger_model.json index 598639d9..a3aa8b2a 100644 --- a/harper-brill/trained_tagger_model.json +++ b/harper-brill/trained_tagger_model.json @@ -30443,6 +30443,26 @@ } } } + }, + { + "from": "NOUN", + "to": "VERB", + "criteria": { + "Combined": { + "a": { + "WordIs": { + "relative": -1, + "word": "you" + } + }, + "b": { + "WordIs": { + "relative": 0, + "word": "plan" + } + } + } + } } ] } diff --git a/harper-core/dictionary.dict b/harper-core/dictionary.dict index efc514fa..ae85ec0c 100644 --- a/harper-core/dictionary.dict +++ b/harper-core/dictionary.dict @@ -17559,7 +17559,8 @@ clash/~NVGgdS clasp/~NVUGdS clasp's class/~NVJGgdS -classic/~JNgS +classic/~JNg +classics/09 classical/~JNgY classicism/~Ng classicist/~NgS @@ -20781,7 +20782,7 @@ descendant/~JNgS descendent/JN!@_ descender/N describable/Ji -describe/~VBZGd> +describe/~VBZGdS> describer/Ng description/~NSg descriptive/~JNpY @@ -22313,7 +22314,7 @@ easternmost/~J eastward/~NJS easy/~JNVU>Tp easygoing/J -eat/~VNZGBSn> +eat/~VZGBSn> eatable/JNSg eaten/~VJU eater/~Ng @@ -24101,7 +24102,7 @@ farewell/~NJVSg farina/~Ng farinaceous/J farm/~NVgd>ZGSz -farmer/~Ng +farmer/~NgS farmhand/NSg farmhouse/~NSg farming/~NJVg @@ -26031,7 +26032,7 @@ gee/~VNdS geeing/V geek/~NVgSdG geeky/J>T -geese/~N +geese/~N9 geezer/NgS geisha/~Ng09S # singular and plural, also has a plural in -s gel/~NVSg @@ -38558,7 +38559,7 @@ placard/NVSgdG placate/VdSGn placation/Ng placatory/J -place/~NVrESdLG +place/~NVESdLG place's placebo/~NSg placed/~VU @@ -41495,6 +41496,7 @@ repetitiousness/Ng repetitive/~JYp repetitiveness/Ng rephotograph/VdG +replace/VSdG replaceable/~JN replant/VNGSd replenish/~VLGdS @@ -43046,7 +43048,7 @@ screwy/Jp>T scribal/J scribble/VNgZGd>S scribbler/Ng -scribe/~NVeKiS +scribe/~NVKiS scribe's scrim/NVgS scrimmage/~NVgGdS @@ -47523,7 +47525,7 @@ teabag/NVS teacake/NSg teach/~VNZG>SBz teachable/JNU -teacher/~NgY +teacher/~NgYS teaching/~NVg teacup/NJgS teacupful/NgS @@ -52010,7 +52012,7 @@ wristband/NgS wristwatch/NgS writ/~NVg>BzSZG write/~VNS -writer/~Ng +writer/~NSg writhe/VNgGdS writing/~NVg written/~JVrU @@ -53252,4 +53254,4 @@ z-axis/Ng # And they will be reviewed # Word added using the `just addnoun` command will be added here -handedly \ No newline at end of file +handedly diff --git a/harper-core/src/linting/lint_group.rs b/harper-core/src/linting/lint_group.rs index 5f127d7e..f555adda 100644 --- a/harper-core/src/linting/lint_group.rs +++ b/harper-core/src/linting/lint_group.rs @@ -70,6 +70,7 @@ use super::out_of_date::OutOfDate; use super::oxymorons::Oxymorons; use super::phrasal_verb_as_compound_noun::PhrasalVerbAsCompoundNoun; use super::pique_interest::PiqueInterest; +use super::possessive_noun::PossessiveNoun; use super::possessive_your::PossessiveYour; use super::pronoun_contraction::PronounContraction; use super::pronoun_inflection_be::PronounInflectionBe; @@ -477,6 +478,9 @@ impl LintGroup { ); out.config.set_rule_enabled("SentenceCapitalization", true); + out.add("PossessiveNoun", PossessiveNoun::new(dictionary.clone())); + out.config.set_rule_enabled("PossessiveNoun", true); + out.add("Regionalisms", Regionalisms::new(dialect)); out.config.set_rule_enabled("Regionalisms", true); diff --git a/harper-core/src/linting/mod.rs b/harper-core/src/linting/mod.rs index d27de043..5a615938 100644 --- a/harper-core/src/linting/mod.rs +++ b/harper-core/src/linting/mod.rs @@ -78,6 +78,7 @@ mod oxymorons; mod phrasal_verb_as_compound_noun; mod phrase_corrections; mod pique_interest; +mod possessive_noun; mod possessive_your; mod pronoun_contraction; mod pronoun_inflection_be; @@ -176,6 +177,7 @@ pub use oxford_comma::OxfordComma; pub use oxymorons::Oxymorons; pub use phrasal_verb_as_compound_noun::PhrasalVerbAsCompoundNoun; pub use pique_interest::PiqueInterest; +pub use possessive_noun::PossessiveNoun; pub use possessive_your::PossessiveYour; pub use pronoun_contraction::PronounContraction; pub use pronoun_inflection_be::PronounInflectionBe; diff --git a/harper-core/src/linting/possessive_noun.rs b/harper-core/src/linting/possessive_noun.rs new file mode 100644 index 00000000..cc2a397b --- /dev/null +++ b/harper-core/src/linting/possessive_noun.rs @@ -0,0 +1,403 @@ +use harper_brill::UPOS; + +use crate::Dictionary; +use crate::Token; +use crate::expr::All; +use crate::expr::Expr; +use crate::expr::SequenceExpr; +use crate::patterns::UPOSSet; +use crate::patterns::WordSet; + +use super::{ExprLinter, Lint, LintKind, Suggestion}; + +pub struct PossessiveNoun { + expr: Box, + dict: D, +} + +impl PossessiveNoun +where + D: Dictionary, +{ + pub fn new(dict: D) -> Self { + let expr = SequenceExpr::default() + .then(UPOSSet::new(&[UPOS::DET, UPOS::PROPN])) + .t_ws() + .then(|tok: &Token, _: &[char]| { + tok.kind.is_plural_nominal() && !tok.kind.is_singular_nominal() + }) + .t_ws() + .then(UPOSSet::new(&[UPOS::NOUN, UPOS::PROPN])) + .then_optional(SequenceExpr::default().t_any().t_any()); + + let additional_req = SequenceExpr::default() + .t_any() + .t_any() + .t_any() + .t_any() + .then_noun(); + + let exceptions = SequenceExpr::default() + .t_any() + .t_any() + .if_not_then_step_one(WordSet::new(&["flags", "checks", "catches", "you"])) + .t_any() + .if_not_then_step_one(WordSet::new(&["form", "go"])); + + Self { + expr: Box::new(All::new(vec![ + Box::new(expr), + Box::new(additional_req), + Box::new(exceptions), + ])), + dict, + } + } +} + +impl ExprLinter for PossessiveNoun +where + D: Dictionary, +{ + fn expr(&self) -> &dyn Expr { + self.expr.as_ref() + } + + fn match_to_lint(&self, matched_tokens: &[Token], _source: &[char]) -> Option { + let last_kind = &matched_tokens.last()?.kind; + + if last_kind.is_upos(UPOS::ADV) { + return None; + } + + let first = matched_tokens.get(2)?; + + let span = first.span; + let plural = span.get_content_string(_source); + let singular = if plural.ends_with('s') { + &plural[..plural.len() - 1] + } else { + &plural + }; + + let replacement = format!("{singular}'s"); + + if !self.dict.contains_word_str(&replacement) { + return None; + } + + Some(Lint { + span, + lint_kind: LintKind::Miscellaneous, + suggestions: vec![Suggestion::ReplaceWith(replacement.chars().collect())], + message: self.description().to_string(), + priority: 10, + }) + } + + fn description(&self) -> &'static str { + "Use an apostrophe and `s` to form a noun’s possessive." + } +} + +#[cfg(test)] +mod tests { + use std::sync::Arc; + + use crate::FstDictionary; + use crate::linting::tests::{assert_lint_count, assert_suggestion_result}; + + use super::PossessiveNoun; + + fn test_linter() -> PossessiveNoun> { + PossessiveNoun::new(FstDictionary::curated()) + } + + /// Sourced from a Hacker News comment + #[test] + fn fixes_hn() { + assert_suggestion_result( + "Me and Jennifer went to have seen the ducks cousin.", + test_linter(), + "Me and Jennifer went to have seen the duck's cousin.", + ); + } + + #[test] + fn fixes_cats_tail() { + assert_suggestion_result( + "The cats tail is long.", + test_linter(), + "The cat's tail is long.", + ); + } + + #[test] + fn fixes_children_toys() { + assert_suggestion_result( + "The children toys were scattered.", + test_linter(), + "The children's toys were scattered.", + ); + } + + #[test] + fn fixes_teachers_lounge() { + assert_suggestion_result( + "Many schools have a teachers lounge.", + test_linter(), + "Many schools have a teacher's lounge.", + ); + } + + #[test] + fn fixes_ducks_park() { + assert_suggestion_result( + "Kids played in the ducks park.", + test_linter(), + "Kids played in the duck's park.", + ); + } + + #[test] + fn no_lint_for_already_possessive() { + assert_lint_count("The duck's cousin visited.", test_linter(), 0); + } + + #[test] + fn no_lint_for_alrreaady_possessive() { + assert_lint_count("The duck's cousin visited.", test_linter(), 0); + } + + #[test] + fn fixes_dogs_bone() { + assert_suggestion_result( + "The dogs bone is delicious.", + test_linter(), + "The dog's bone is delicious.", + ); + } + + #[test] + fn fixes_students_books() { + assert_suggestion_result( + "The students books are on the desk.", + test_linter(), + "The student's books are on the desk.", + ); + } + + #[test] + fn fixes_farmers_field() { + assert_suggestion_result( + "The farmers field looked beautiful.", + test_linter(), + "The farmer's field looked beautiful.", + ); + } + + #[test] + fn fixes_women_dress() { + assert_suggestion_result( + "The women dress was elegant.", + test_linter(), + "The women's dress was elegant.", + ); + } + + #[test] + fn fixes_birds_song() { + assert_suggestion_result( + "We heard the birds song.", + test_linter(), + "We heard the bird's song.", + ); + } + + #[test] + fn fixes_scientists_research() { + assert_suggestion_result( + "The scientists research was groundbreaking.", + test_linter(), + "The scientist's research was groundbreaking.", + ); + } + + #[test] + fn fixes_artists_gallery() { + assert_suggestion_result( + "The artists gallery is open.", + test_linter(), + "The artist's gallery is open.", + ); + } + + #[test] + fn no_lint_for_plural_noun() { + assert_lint_count("The ducks are swimming.", test_linter(), 0); + } + + #[test] + fn no_lint_for_proper_noun() { + assert_lint_count("John's car is red.", test_linter(), 0); + } + + #[test] + fn fixes_the_students_assignment() { + assert_suggestion_result( + "The students assignment was due yesterday.", + test_linter(), + "The student's assignment was due yesterday.", + ); + } + + #[test] + fn fixes_the_birds_flight() { + assert_suggestion_result( + "The birds flight was graceful.", + test_linter(), + "The bird's flight was graceful.", + ); + } + + #[test] + fn allows_the_city_lights() { + assert_lint_count( + "The city lights twinkled in the distance.", + test_linter(), + 0, + ); + } + + #[test] + fn fixes_the_farmers_crops() { + assert_suggestion_result( + "The farmers crops were bountiful this year.", + test_linter(), + "The farmer's crops were bountiful this year.", + ); + } + + #[test] + fn fixes_the_artists_inspiration() { + assert_suggestion_result( + "The artists inspiration came from nature.", + test_linter(), + "The artist's inspiration came from nature.", + ); + } + + #[test] + fn fixes_the_scientists_discovery() { + assert_suggestion_result( + "The scientists discovery revolutionized the field.", + test_linter(), + "The scientist's discovery revolutionized the field.", + ); + } + + #[test] + fn fixes_the_writers_novel() { + assert_suggestion_result( + "The writers novel was a bestseller.", + test_linter(), + "The writer's novel was a bestseller.", + ); + } + + #[test] + fn fixes_the_students_presentation() { + assert_suggestion_result( + "The students presentation was well-received.", + test_linter(), + "The student's presentation was well-received.", + ); + } + + #[test] + fn fixes_the_teams_victory() { + assert_suggestion_result( + "The teams victory was celebrated by the fans.", + test_linter(), + "The team's victory was celebrated by the fans.", + ); + } + + #[test] + fn fixes_the_museums_collection() { + assert_suggestion_result( + "The museums collection included many artifacts.", + test_linter(), + "The museum's collection included many artifacts.", + ); + } + + #[test] + fn no_lint_for_already_possessive_2() { + assert_lint_count("John's car is red.", test_linter(), 0); + } + + #[test] + fn no_lint_for_proper_noun_2() { + assert_lint_count("Mary went to the store.", test_linter(), 0); + } + + #[test] + fn fixes_the_doctors_office() { + assert_suggestion_result( + "The doctors office is on Main Street.", + test_linter(), + "The doctor's office is on Main Street.", + ); + } + + #[test] + fn fixes_the_neighbors_garden() { + assert_suggestion_result( + "The neighbors garden is beautiful.", + test_linter(), + "The neighbor's garden is beautiful.", + ); + } + + #[test] + fn fixes_the_architects_design() { + assert_suggestion_result( + "The architects design was innovative.", + test_linter(), + "The architect's design was innovative.", + ); + } + + #[test] + fn fixes_the_bakers_shop() { + assert_suggestion_result( + "The bakers shop is famous for its bread.", + test_linter(), + "The baker's shop is famous for its bread.", + ); + } + + #[test] + fn fixes_the_musics_performance() { + assert_suggestion_result( + "The musics performance was captivating.", + test_linter(), + "The music's performance was captivating.", + ); + } + + #[test] + fn fixes_the_flowers_scent() { + assert_suggestion_result( + "The flowers scent filled the room.", + test_linter(), + "The flower's scent filled the room.", + ); + } + + #[test] + fn allows_birds_hurried() { + assert_lint_count("The birds hurried off.", test_linter(), 0); + } +} diff --git a/harper-core/tests/test_sources/index.org b/harper-core/tests/test_sources/index.org index d94c37ba..f762c0b4 100644 --- a/harper-core/tests/test_sources/index.org +++ b/harper-core/tests/test_sources/index.org @@ -60,7 +60,7 @@ There are 2 additional ways to interact with Orgmode: 2. Through =Org= Lua global variable List of available actions: -- =:Org help= - Open this documentation in new tab, set working directory to the docs folder for the tab to allow browsing +- =:Org help= - Open this documentation in new tab, set working directory to the doc's folder for the tab to allow browsing - =:Org helpgrep= - Open search agenda view that allows searching through the documentation - =:Org agenda {type?}= - Open agenda view by the shortcut, for example =:Org agenda M= will open =tags_todo= view. When =type= is omitted, it opens up Agenda view. - =:Org capture {type?}= - Open capture template by the shortcut, for example =:Org capture t=. When =type= is omitted, it opens up Capture prompt. @@ -78,4 +78,4 @@ All of the commands above can be executed through the global Lua =Org= variable. - =Org.agenda()= - Opens =agenda= prompt - =Org.agenda.m()= - Opens =tags= view - =Org.capture()= - Opens capture prompt -- =Org.capture.t()= - Opens capture template for =t= shortcut \ No newline at end of file +- =Org.capture.t()= - Opens capture template for =t= shortcut diff --git a/harper-core/tests/text/linters/Alice's Adventures in Wonderland.snap.yml b/harper-core/tests/text/linters/Alice's Adventures in Wonderland.snap.yml index 13ebbaa7..ab5bac2a 100644 --- a/harper-core/tests/text/linters/Alice's Adventures in Wonderland.snap.yml +++ b/harper-core/tests/text/linters/Alice's Adventures in Wonderland.snap.yml @@ -2710,6 +2710,15 @@ Suggest: +Lint: Miscellaneous (10 priority) +Message: | + 2420 | “How the creatures order one about, and make one repeat lessons!” thought Alice; + | ^~~~~~~~~ Use an apostrophe and `s` to form a noun’s possessive. +Suggest: + - Replace with: “creature's” + + + Lint: Spelling (63 priority) Message: | 2425 | > “’Tis the voice of the Lobster; I heard him declare, “You have baked me too diff --git a/harper-core/tests/text/linters/Part-of-speech tagging.snap.yml b/harper-core/tests/text/linters/Part-of-speech tagging.snap.yml index faefb8a2..8b78584a 100644 --- a/harper-core/tests/text/linters/Part-of-speech tagging.snap.yml +++ b/harper-core/tests/text/linters/Part-of-speech tagging.snap.yml @@ -165,6 +165,16 @@ Suggest: +Lint: Miscellaneous (10 priority) +Message: | + 65 | the earlier Brown Corpus and LOB Corpus tag sets, though much smaller. In + 66 | Europe, tag sets from the Eagles Guidelines see wide use and include versions + | ^~~~~~ Use an apostrophe and `s` to form a noun’s possessive. +Suggest: + - Replace with: “Eagle's” + + + Lint: WordChoice (63 priority) Message: | 73 | cross-language differences. The tag sets for heavily inflected languages such as diff --git a/harper-core/tests/text/linters/Swear.snap.yml b/harper-core/tests/text/linters/Swear.snap.yml index e8ee7bb3..2a0045ec 100644 --- a/harper-core/tests/text/linters/Swear.snap.yml +++ b/harper-core/tests/text/linters/Swear.snap.yml @@ -1,3 +1,12 @@ +Lint: Miscellaneous (10 priority) +Message: | + 3 | This documents tests that different forms/variations of swears are tagged as such. + | ^~~~~~~~~ Use an apostrophe and `s` to form a noun’s possessive. +Suggest: + - Replace with: “document's” + + + Lint: Miscellaneous (63 priority) Message: | 7 | One turd, two turds. diff --git a/harper-core/tests/text/linters/The Great Gatsby.snap.yml b/harper-core/tests/text/linters/The Great Gatsby.snap.yml index c4401de9..5e15cf84 100644 --- a/harper-core/tests/text/linters/The Great Gatsby.snap.yml +++ b/harper-core/tests/text/linters/The Great Gatsby.snap.yml @@ -1859,6 +1859,16 @@ Message: | +Lint: Miscellaneous (10 priority) +Message: | + 1407 | celebrated tenor had sung in Italian, and a notorious contralto had sung in + 1408 | jazz, and between the numbers people were doing ‘‘stunts” all over the garden, + | ^~~~~~~ Use an apostrophe and `s` to form a noun’s possessive. +Suggest: + - Replace with: “number's” + + + Lint: Spelling (63 priority) Message: | 1413 | trembling a little to the stiff, tinny drip of the banjoes on the lawn. diff --git a/harper-core/tests/text/tagged/Alice's Adventures in Wonderland.md b/harper-core/tests/text/tagged/Alice's Adventures in Wonderland.md index 1aebd08e..93244c21 100644 --- a/harper-core/tests/text/tagged/Alice's Adventures in Wonderland.md +++ b/harper-core/tests/text/tagged/Alice's Adventures in Wonderland.md @@ -151,21 +151,21 @@ > wish you were down here with me ! There are no mice in the air , I’m afraid , but # NSg/V ISgPl+ NSg/V NSg/V/J/P NSg/J/R P NPr/ISg+ . + V NPr/P NSg/V NPr/J/P D+ NSg/V+ . W? J . NSg/C/P > you might catch a bat , and that’s very like a mouse , you know . But do cats eat -# ISgPl+ NSg/VX/J NSg/V D/P+ NSg/V+ . V/C NSg$ J/R NSg/V/J/C/P D/P+ NSg/V+ . ISgPl+ NSg/V+ . NSg/C/P NSg/VX NPl/V+ NSg/V +# ISgPl+ NSg/VX/J NSg/V D/P+ NSg/V+ . V/C NSg$ J/R NSg/V/J/C/P D/P+ NSg/V+ . ISgPl+ NSg/V+ . NSg/C/P NSg/VX NPl/V+ V > bats , I wonder ? ” And here Alice began to get rather sleepy , and went on saying # NPl/V . ISg+ NSg/V . . V/C NSg/J/R NPr+ V P NSg/V NPr/V/J NSg/J . V/C NSg/V J/P NSg/V -> to herself , in a dreamy sort of way , “ Do cats eat bats ? Do cats eat bats ? ” and -# P ISg+ . NPr/J/P D/P J NSg/V P NSg/J+ . . NSg/VX NPl/V+ NSg/V NPl/V . NSg/VX NPl/V+ NSg/V NPl/V . . V/C -> sometimes , “ Do bats eat cats ? ” for , you see , as she couldn’t answer either -# R . . NSg/VX NPl/V NSg/V NPl/V+ . . C/P . ISgPl+ NSg/V . NSg/R ISg+ V NSg/V+ I/C +> to herself , in a dreamy sort of way , “ Do cats eat bats ? Do cats eat bats ? ” and +# P ISg+ . NPr/J/P D/P J NSg/V P NSg/J+ . . NSg/VX NPl/V+ V NPl/V . NSg/VX NPl/V+ V NPl/V . . V/C +> sometimes , “ Do bats eat cats ? ” for , you see , as she couldn’t answer either +# R . . NSg/VX NPl/V V NPl/V+ . . C/P . ISgPl+ NSg/V . NSg/R ISg+ V NSg/V+ I/C > question , it didn’t much matter which way she put it . She felt that she was # NSg/V+ . NPr/ISg+ V NSg/I/J NSg/V/J I/C+ NSg/J+ ISg+ NSg/V NPr/ISg+ . ISg+ NSg/V/J NSg/I/C/Ddem ISg+ V > dozing off , and had just begun to dream that she was walking hand in hand with # V NSg/V/J/P . V/C V V/J V P NSg/V/J NSg/I/C/Ddem ISg+ V NSg/V/J NSg/V+ NPr/J/P NSg/V P > Dinah , and saying to her very earnestly , “ Now , Dinah , tell me the truth : did you # NPr . V/C NSg/V P ISg/D$+ J/R R . . NPr/V/J/C . NPr . NPr/V NPr/ISg+ D+ NSg/V+ . V ISgPl+ -> ever eat a bat ? ” when suddenly , thump ! thump ! down she came upon a heap of -# J NSg/V D/P+ NSg/V+ . . NSg/I/C R . NSg/V+ . NSg/V+ . NSg/V/J/P ISg+ NSg/V/P P D/P NSg/V P +> ever eat a bat ? ” when suddenly , thump ! thump ! down she came upon a heap of +# J V D/P+ NSg/V+ . . NSg/I/C R . NSg/V+ . NSg/V+ . NSg/V/J/P ISg+ NSg/V/P P D/P NSg/V P > sticks and dry leaves , and the fall was over . # NPl/V+ V/C NSg/V/J+ NPl/V+ . V/C D+ NSg/V+ V+ NSg/V/J/P . > @@ -340,10 +340,10 @@ # > Soon her eye fell on a little glass box that was lying under the table : she # J/R ISg/D$+ NSg/V NSg/V/J J/P D/P NPr/I/J NPr/V+ NSg/V+ NSg/I/C/Ddem+ V NSg/V/J NSg/J/P D+ NSg/V+ . ISg+ -> opened it , and found in it a very small cake , on which the words “ EAT ME ” were -# V/J NPr/ISg+ . V/C NSg/V NPr/J/P NPr/ISg+ D/P J/R NPr/V/J NSg/V . J/P I/C+ D+ NPl/V+ . NSg/V NPr/ISg+ . NSg/V -> beautifully marked in currants . “ Well , I’ll eat it , ” said Alice , “ and if it -# R V/J NPr/J/P NPl . . NSg/V/J . W? NSg/V NPr/ISg+ . . V/J NPr . . V/C NSg/C NPr/ISg+ +> opened it , and found in it a very small cake , on which the words “ EAT ME ” were +# V/J NPr/ISg+ . V/C NSg/V NPr/J/P NPr/ISg+ D/P J/R NPr/V/J NSg/V . J/P I/C+ D+ NPl/V+ . V NPr/ISg+ . NSg/V +> beautifully marked in currants . “ Well , I’ll eat it , ” said Alice , “ and if it +# R V/J NPr/J/P NPl . . NSg/V/J . W? V NPr/ISg+ . . V/J NPr . . V/C NSg/C NPr/ISg+ > makes me grow larger , I can reach the key ; and if it makes me grow smaller , I # NPl/V NPr/ISg V J . ISg+ NPr/VX NSg/V D NPr/V/J . V/C NSg/C NPr/ISg+ NPl/V NPr/ISg V J . ISg+ > can creep under the door ; so either way I’ll get into the garden , and I don’t @@ -358,8 +358,8 @@ # NSg/V ISg/D$+ NSg/V+ J/P D NSg/V/J P ISg/D$+ NPr/V/J+ P NSg/I/V I/C+ NSg/J+ NPr/ISg+ V NSg/V . V/C > she was quite surprised to find that she remained the same size : to be sure , # ISg+ V NSg V/J P NSg/V NSg/I/C/Ddem ISg+ V/J D+ I/J+ NSg/V+ . P NSg/VX J . -> this generally happens when one eats cake , but Alice had got so much into the -# I/Ddem+ R V NSg/I/C NSg/I/V/J NPl/V NSg/V+ . NSg/C/P NPr+ V V NSg/I/J/C NSg/I/J P D +> this generally happens when one eats cake , but Alice had got so much into the +# I/Ddem+ R V NSg/I/C NSg/I/V/J V NSg/V+ . NSg/C/P NPr+ V V NSg/I/J/C NSg/I/J P D > way of expecting nothing but out - of - the - way things to happen , that it seemed # NSg/J P V NSg/I/J+ NSg/C/P NSg/V/J/R/P . P . D . NSg/J NPl/V P V . NSg/I/C/Ddem NPr/ISg+ V/J > quite dull and stupid for life to go on in the common way . @@ -952,8 +952,8 @@ # R V/J . V/C V D NSg/V . V NSg/R J NSg/R ISg+ NSg/VX+ . > # -> The next thing was to eat the comfits : this caused some noise and confusion , as -# D+ NSg/J/P NSg/V V P NSg/V D NPl/V . I/Ddem+ V/J I/J/R+ NSg/V V/C NSg/V+ . NSg/R +> The next thing was to eat the comfits : this caused some noise and confusion , as +# D+ NSg/J/P NSg/V V P V D NPl/V . I/Ddem+ V/J I/J/R+ NSg/V V/C NSg/V+ . NSg/R > the large birds complained that they could not taste theirs , and the small ones # D+ NSg/J+ NPl/V+ V/J NSg/I/C/Ddem IPl+ NSg/VX NSg/C NSg/V/J I+ . V/C D+ NPr/V/J+ NPl/V+ > choked and had to be patted on the back . However , it was over at last , and they @@ -1078,8 +1078,8 @@ # NPr V/J R . C/P ISg+ V R NSg/V/J P NSg/V J/P ISg/D$+ NPr/V/J+ . . NSg$ > our cat . And she’s such a capital one for catching mice you can’t think ! And oh , # D$+ NSg/V/J+ . V/C W? NSg/I D/P NSg/J+ NSg/I/V/J C/P V NSg/V+ ISgPl+ VX NSg/V . V/C NPr/V . -> I wish you could see her after the birds ! Why , she’ll eat a little bird as soon -# ISg+ NSg/V ISgPl+ NSg/VX NSg/V ISg/D$+ J/P D+ NPl/V+ . NSg/V . W? NSg/V D/P NPr/I/J NPr/V/J+ NSg/R J/R +> I wish you could see her after the birds ! Why , she’ll eat a little bird as soon +# ISg+ NSg/V ISgPl+ NSg/VX NSg/V ISg/D$+ J/P D+ NPl/V+ . NSg/V . W? V D/P NPr/I/J NPr/V/J+ NSg/R J/R > as look at it ! ” # NSg/R NSg/V NSg/P NPr/ISg . . > @@ -1192,8 +1192,8 @@ # V+ . NPr/V . + V NPr/P+ NSg/V+ I/Ddem+ NSg/V/J P D+ NPl/V+ . NSg/V+ NPr/ISg . . NSg/C/P > nevertheless she uncorked it and put it to her lips . “ I know something # W? ISg+ V/J NPr/ISg+ V/C NSg/V NPr/ISg+ P ISg/D$+ NPl/V+ . . ISg+ NSg/V NSg/I/V/J+ -> interesting is sure to happen , ” she said to herself , “ whenever I eat or drink -# V/J VL J P V . . ISg+ V/J P ISg+ . . C ISg+ NSg/V NPr/C NSg/V+ +> interesting is sure to happen , ” she said to herself , “ whenever I eat or drink +# V/J VL J P V . . ISg+ V/J P ISg+ . . C ISg+ V NPr/C NSg/V+ > anything ; so I’ll just see what this bottle does . I do hope it’ll make me grow # NSg/I/V+ . NSg/I/J/C W? V/J NSg/V NSg/I+ I/Ddem+ NSg/V+ NPl/V+ . ISg+ NSg/VX NPr/V W? NSg/V NPr/ISg+ V > large again , for really I’m quite tired of being such a tiny little thing ! ” @@ -1465,7 +1465,7 @@ > Alice noticed with some surprise that the pebbles were all turning into little # NPr+ V/J P I/J/R+ NSg/V NSg/I/C/Ddem D+ NPl/V+ NSg/V NSg/I/J/C NSg/V P NPr/I/J > cakes as they lay on the floor , and a bright idea came into her head . “ If I eat -# NPl/V+ NSg/R IPl+ NSg/V/J J/P D+ NSg/V+ . V/C D/P NPr/V/J NSg NSg/V/P P ISg/D$+ NPr/V/J+ . . NSg/C ISg+ NSg/V +# NPl/V+ NSg/R IPl+ NSg/V/J J/P D+ NSg/V+ . V/C D/P NPr/V/J NSg NSg/V/P P ISg/D$+ NPr/V/J+ . . NSg/C ISg+ V > one of these cakes , ” she thought , “ it’s sure to make some change in my size ; and # NSg/I/V/J P I/Ddem+ NPl/V+ . . ISg+ NSg/V . . W? J P NSg/V I/J/R NSg/V+ NPr/J/P D$+ NSg/V+ . V/C > as it can’t possibly make me larger , it must make me smaller , I suppose . ” @@ -1514,8 +1514,8 @@ # D/P NSg/V/J NSg/I/V+ . V/C ISg+ V/J NSg/V/J P NSg/V P NPr/ISg+ . NSg/C/P ISg+ V R > frightened all the time at the thought that it might be hungry , in which case it # V/J NSg/I/J/C D NSg/V/J NSg/P D NSg/V NSg/I/C/Ddem NPr/ISg+ NSg/VX/J NSg/VX J . NPr/J/P I/C+ NPr/V+ NPr/ISg+ -> would be very likely to eat her up in spite of all her coaxing . -# NSg/VX NSg/VX J/R NSg/J P NSg/V ISg/D$+ NSg/V/J/P NPr/J/P NSg/V/P P NSg/I/J/C ISg/D$+ NSg/V/J . +> would be very likely to eat her up in spite of all her coaxing . +# NSg/VX NSg/VX J/R NSg/J P V ISg/D$+ NSg/V/J/P NPr/J/P NSg/V/P P NSg/I/J/C ISg/D$+ NSg/V/J . > # > Hardly knowing what she did , she picked up a little bit of stick , and held it @@ -1560,8 +1560,8 @@ # NSg/VX V/J NSg/V+ NPr/ISg+ NPl/V+ J/R NSg/I/J . NSg/C . NSg/C W? J/R/C NSg/V D NPr/V/J NSg/V P > do it ! Oh dear ! I’d nearly forgotten that I’ve got to grow up again ! Let me # NSg/VX NPr/ISg+ . NPr/V NSg/V/J . W? R NSg/V/J NSg/I/C/Ddem W? V P V NSg/V/J/P P . NSg/V NPr/ISg+ -> see — how is it to be managed ? I suppose I ought to eat or drink something or -# NSg/V . NSg/C VL NPr/ISg+ P NSg/VX V/J . ISg+ V ISg+ NSg/I/VX P NSg/V NPr/C NSg/V+ NSg/I/V/J NPr/C +> see — how is it to be managed ? I suppose I ought to eat or drink something or +# NSg/V . NSg/C VL NPr/ISg+ P NSg/VX V/J . ISg+ V ISg+ NSg/I/VX P V NPr/C NSg/V+ NSg/I/V/J NPr/C > other ; but the great question is , what ? ” # NSg/V/J . NSg/C/P D+ NSg/J+ NSg/V+ VL . NSg/I . . > @@ -1570,8 +1570,8 @@ # D+ NSg/J NSg/V R V . NSg/I . NPr+ V/J NSg/I/J/C NSg/V/J/P ISg/D$+ NSg/P D+ > flowers and the blades of grass , but she did not see anything that looked like # NPrPl/V+ V/C D NPl/V P NPr/V+ . NSg/C/P ISg+ V NSg/C NSg/V NSg/I/V+ NSg/I/C/Ddem+ V/J NSg/V/J/C/P -> the right thing to eat or drink under the circumstances . There was a large -# D+ NPr/V/J+ NSg/V P NSg/V NPr/C NSg/V+ NSg/J/P D+ NPl/V+ . + V D/P NSg/J +> the right thing to eat or drink under the circumstances . There was a large +# D+ NPr/V/J+ NSg/V P V NPr/C NSg/V+ NSg/J/P D+ NPl/V+ . + V D/P NSg/J > mushroom growing near her , about the same height as herself ; and when she had # NSg/V/J NSg/V NSg/V/J/P ISg/D$+ . J/P D+ I/J+ NSg+ NSg/R ISg+ . V/C NSg/I/C ISg+ V > looked under it , and on both sides of it , and behind it , it occurred to her that @@ -1918,8 +1918,8 @@ # ISg+ V D/P NPr/V/J NSg/V/J V/J NSg/J/P I/Ddem+ J/R NSg/J+ NSg/V+ . NSg/C/P ISg+ NSg/V/J NSg/I/C/Ddem > there was no time to be lost , as she was shrinking rapidly ; so she set to work # + V NPr/P NSg/V/J+ P NSg/VX V/J . NSg/R ISg+ V V R . NSg/I/J/C ISg+ NPr/V/J P NSg/V -> at once to eat some of the other bit . Her chin was pressed so closely against -# NSg/P NSg/C P NSg/V I/J/R P D+ NSg/V/J+ NSg/V+ . ISg/D$+ NPr/V+ V V/J NSg/I/J/C R C/P +> at once to eat some of the other bit . Her chin was pressed so closely against +# NSg/P NSg/C P V I/J/R P D+ NSg/V/J+ NSg/V+ . ISg/D$+ NPr/V+ V V/J NSg/I/J/C R C/P > her foot , that there was hardly room to open her mouth ; but she did it at last , # ISg/D$+ NSg/V+ . NSg/I/C/Ddem + V R NSg/V/J P NSg/V/J ISg/D$+ NSg/V+ . NSg/C/P ISg+ V NPr/ISg NSg/P NSg/V/J . > and managed to swallow a morsel of the lefthand bit . @@ -2048,8 +2048,8 @@ # > “ I have tasted eggs , certainly , ” said Alice , who was a very truthful child ; “ but # . ISg+ NSg/VX V/J NPl/V . R . . V/J NPr+ . NPr/I+ V D/P J/R J NSg/V . . NSg/C/P -> little girls eat eggs quite as much as serpents do , you know . ” -# NPr/I/J NPl/V+ NSg/V NPl/V+ NSg NSg/R NSg/I/J NSg/R NPl/V NSg/VX . ISgPl+ NSg/V+ . . +> little girls eat eggs quite as much as serpents do , you know . ” +# NPr/I/J NPl/V+ V NPl/V+ NSg NSg/R NSg/I/J NSg/R NPl/V NSg/VX . ISgPl+ NSg/V+ . . > # > “ I don’t believe it , ” said the Pigeon ; “ but if they do , why then they’re a kind @@ -2808,8 +2808,8 @@ # > “ Not the same thing a bit ! ” said the Hatter . “ You might just as well say that ‘ I # . NSg/C D I/J NSg/V+ D/P+ NSg/V+ . . V/J D+ NSg/V . . ISgPl+ NSg/VX/J V/J NSg/R NSg/V/J NSg/V NSg/I/C/Ddem+ Unlintable ISg+ -> see what I eat ’ is the same thing as ‘ I eat what I see ’ ! ” -# NSg/V NSg/I+ ISg+ NSg/V . VL D I/J NSg/V+ NSg/R Unlintable ISg+ NSg/V NSg/I+ ISg+ NSg/V . . . +> see what I eat ’ is the same thing as ‘ I eat what I see ’ ! ” +# NSg/V NSg/I+ ISg+ V . VL D I/J NSg/V+ NSg/R Unlintable ISg+ V NSg/I+ ISg+ NSg/V . . . > # > “ You might just as well say , ” added the March Hare , “ that ‘ I like what I get ’ is @@ -4429,7 +4429,7 @@ > # > “ Hadn’t time , ” said the Gryphon : “ I went to the Classics master , though . He was -# . V NSg/V/J . . V/J D ? . . ISg+ NSg/V P D+ NPl+ NPr/V/J+ . V/C . NPr/ISg+ V +# . V NSg/V/J . . V/J D ? . . ISg+ NSg/V P D+ NSgPl+ NPr/V/J+ . V/C . NPr/ISg+ V > an old crab , he was . ” # D/P NSg/J NSg/V . NPr/ISg+ V+ . . > diff --git a/harper-core/tests/text/tagged/Computer science.md b/harper-core/tests/text/tagged/Computer science.md index 081ecfcd..65fde78a 100644 --- a/harper-core/tests/text/tagged/Computer science.md +++ b/harper-core/tests/text/tagged/Computer science.md @@ -33,7 +33,7 @@ > the generation of images . Programming language theory considers different ways # D NSg P NPl/V+ . NSg/V+ NSg/V+ NSg+ V NSg/J NPl > to describe computational processes , and database theory concerns the management -# P NSg/V J+ NPl/V+ . V/C NSg/V+ NSg+ NSg/V+ D NSg +# P V J+ NPl/V+ . V/C NSg/V+ NSg+ NSg/V+ D NSg > of repositories of data . Human – computer interaction investigates the interfaces # P NPl P NSg+ . NSg/V/J . NSg/V+ NSg+ V D NPl/V > through which humans and computers interact , and software engineering focuses on @@ -43,7 +43,7 @@ > systems , networks and embedded systems investigate the principles and design # NPl . NPl/V+ V/C V/J NPl+ V D NPl/V V/C NSg/V+ > behind complex systems . Computer architecture describes the construction of -# NSg/J/P NSg/V/J+ NPl+ . NSg/V+ NSg+ NPl/V D NSg P +# NSg/J/P NSg/V/J+ NPl+ . NSg/V+ NSg+ V D NSg P > computer components and computer - operated equipment . Artificial intelligence and # NSg/V+ NPl V/C NSg/V+ . V/J NSg . J NSg V/C > machine learning aim to synthesize goal - orientated processes such as diff --git a/harper-core/tests/text/tagged/Difficult sentences.md b/harper-core/tests/text/tagged/Difficult sentences.md index 9ca561bc..9b487299 100644 --- a/harper-core/tests/text/tagged/Difficult sentences.md +++ b/harper-core/tests/text/tagged/Difficult sentences.md @@ -464,8 +464,8 @@ # > Suddenly a strange man walked in . # R D/P NSg/V/J NPr/V/J V/J+ NPr/J/P . -> Would you like that to take away or eat in ? -# NSg/VX ISgPl+ NSg/V/J/C/P NSg/I/C/Ddem+ P NSg/V V/J NPr/C NSg/V NPr/J/P . +> Would you like that to take away or eat in ? +# NSg/VX ISgPl+ NSg/V/J/C/P NSg/I/C/Ddem+ P NSg/V V/J NPr/C V NPr/J/P . > He ran to the edge of the swimming pool and dived in . # NPr/ISg+ NSg/V P D NSg/V P D+ NSg/V+ NSg/V+ V/C V/J+ NPr/J/P . > They flew in from London last night . diff --git a/harper-core/tests/text/tagged/Part-of-speech tagging.md b/harper-core/tests/text/tagged/Part-of-speech tagging.md index af2a3351..e651dd15 100644 --- a/harper-core/tests/text/tagged/Part-of-speech tagging.md +++ b/harper-core/tests/text/tagged/Part-of-speech tagging.md @@ -374,8 +374,8 @@ # NSg/V NPl/V+ NPr/J/P NSg/V+ NSg/V . V/C NSg/V NSg/V/J . P . NSg/V NPl+ IPl+ . > For example , statistics readily reveal that " the " , " a " , and " an " occur in # C/P NSg/V+ . NPl/V+ R NSg/V NSg/I/C/Ddem+ . D . . . D/P . . V/C . D/P . V NPr/J/P -> similar contexts , while " eat " occurs in very different ones . With sufficient -# NSg/J+ NPl/V+ . NSg/V/C/P . NSg/V . V NPr/J/P J/R NSg/J+ NPl/V+ . P J+ +> similar contexts , while " eat " occurs in very different ones . With sufficient +# NSg/J+ NPl/V+ . NSg/V/C/P . V . V NPr/J/P J/R NSg/J+ NPl/V+ . P J+ > iteration , similarity classes of words emerge that are remarkably similar to # NSg . NSg NPl/V P NPl/V+ NSg/V NSg/I/C/Ddem+ V R NSg/J P > those human linguists would expect ; and the differences themselves sometimes diff --git a/harper-core/tests/text/tagged/The Great Gatsby.md b/harper-core/tests/text/tagged/The Great Gatsby.md index 5064e3ee..a1d221df 100644 --- a/harper-core/tests/text/tagged/The Great Gatsby.md +++ b/harper-core/tests/text/tagged/The Great Gatsby.md @@ -1010,8 +1010,8 @@ # D/P+ NSg+ ISg+ V/J NPr/V/J R P D NSg/V/J P ISg/D$+ NSg+ . > # -> “ I suppose she talks , and — eats , and everything . ” -# . ISg+ V ISg+ NPl/V+ . V/C . NPl/V . V/C NSg/I/V+ . . +> “ I suppose she talks , and — eats , and everything . ” +# . ISg+ V ISg+ NPl/V+ . V/C . V . V/C NSg/I/V+ . . > # > “ Oh , yes . ” She looked at me absently . “ Listen , Nick ; let me tell you what I said @@ -4254,8 +4254,8 @@ # V/J/P+ . V/J P NPl/V+ V/J/P NPr/V/J/C+ NSg/J . ISg+ VX V NSg/I/J/C NPr/V/J NSg/R ISg+ V/J D+ > night they shot Rosy Rosenthal there . It was six of us at the table , and Rosy # NSg/V+ IPl+ NSg/V/J+ NSg/V/J+ NPr+ W? . NPr/ISg+ V NSg P NPr/IPl+ NSg/P D+ NSg/V+ . V/C NSg/V/J -> had eat and drunk a lot all evening . When it was almost morning the waiter came -# V NSg/V V/C NSg/V/J D/P+ NPr/V+ NSg/I/J/C NSg/V+ . NSg/I/C NPr/ISg+ V NSg NSg/V D+ NSg/V+ NSg/V/P +> had eat and drunk a lot all evening . When it was almost morning the waiter came +# V V V/C NSg/V/J D/P+ NPr/V+ NSg/I/J/C NSg/V+ . NSg/I/C NPr/ISg+ V NSg NSg/V D+ NSg/V+ NSg/V/P > up to him with a funny look and says somebody wants to speak to him outside . # NSg/V/J/P P ISg P D/P NSg/J NSg/V+ V/C NPl/V NSg/I+ NPl/V P NSg/V P ISg+ NSg/V/J/P+ . > ‘ All right , ’ says Rosy , and begins to get up , and I pulled him down in his @@ -4322,8 +4322,8 @@ # > A succulent hash arrived , and Mr . Wolfshiem , forgetting the more sentimental # D/P NSg/J NSg/V V/J . V/C NSg+ . ? . NSg/V D NPr/I/V/J J -> atmosphere of the old Metropole , began to eat with ferocious delicacy . His eyes , -# NSg P D+ NSg/J+ ? . V P NSg/V P J NSg+ . ISg/D$+ NPl/V+ . +> atmosphere of the old Metropole , began to eat with ferocious delicacy . His eyes , +# NSg P D+ NSg/J+ ? . V P V P J NSg+ . ISg/D$+ NPl/V+ . > meanwhile , roved very slowly all around the room — he completed the arc by turning # NSg . V/J J/R R NSg/I/J/C J/P D+ NSg/V/J+ . NPr/ISg+ V/J D+ NPr/V/J+ NSg/J/P NSg/V > to inspect the people directly behind . I think that , except for my presence , he @@ -4552,8 +4552,8 @@ # > “ How’ve you been , anyhow ? ” demanded Tom of me . “ How’d you happen to come up this # . ? ISgPl+ NSg/V . J . . V/J NPr/V P NPr/ISg+ . . W? ISgPl+ V P NSg/V/P NSg/V/J/P I/Ddem+ -> far to eat ? ” -# NSg/V/J P NSg/V . . +> far to eat ? ” +# NSg/V/J P V . . > # > “ I’ve been having lunch with Mr . Gatsby . ” @@ -5502,8 +5502,8 @@ # J/P NSg/V/J/P+ D/P+ NSg+ . D+ NPr/V+ V P . V/C D NSg$ NSg/V/J V/J > Gatsby’s drive with the raw material for his servants ’ dinner — I felt sure he # NSg$ NSg/V P D NSg/V/J NSg/V/J C/P ISg/D$+ NPl/V+ . NSg/V+ . ISg+ NSg/V/J J NPr/ISg+ -> wouldn’t eat a spoonful . A maid began opening the upper windows of his house , -# VX NSg/V D/P+ NSg+ . D/P+ NSg+ V NSg/V/J D NSg/J NPrPl/V P ISg/D$+ NPr/V+ . +> wouldn’t eat a spoonful . A maid began opening the upper windows of his house , +# VX V D/P+ NSg+ . D/P+ NSg+ V NSg/V/J D NSg/J NPrPl/V P ISg/D$+ NPr/V+ . > appeared momentarily in each , and , leaning from the large central bay , spat # V/J R NPr/J/P D . V/C . NSg/V P D NSg/J NPr/J+ NSg/V/J+ . NSg/V > meditatively into the garden . It was time I went back . While the rain continued @@ -6594,8 +6594,8 @@ # > Tom appeared from his oblivion as we were sitting down to supper together . “ Do # NPr/V+ V/J P ISg/D$+ NSg/V+ NSg/R IPl+ NSg/V NSg/V/J NSg/V/J/P P NSg/V/J+ J . . NSg/VX -> you mind if I eat with some people over here ? ” he said . “ A fellow’s getting off -# ISgPl+ NSg/V+ NSg/C ISg+ NSg/V P I/J/R NSg/V+ NSg/V/J/P NSg/J/R . . NPr/ISg+ V/J+ . . D/P NSg$ NSg/V NSg/V/J/P +> you mind if I eat with some people over here ? ” he said . “ A fellow’s getting off +# ISgPl+ NSg/V+ NSg/C ISg+ V P I/J/R NSg/V+ NSg/V/J/P NSg/J/R . . NPr/ISg+ V/J+ . . D/P NSg$ NSg/V NSg/V/J/P > some funny stuff . ” # I/J/R+ NSg/J+ NSg/V+ . . > @@ -9637,7 +9637,7 @@ > # > “ I can’t describe to you how surprised I was to find out I loved her , old sport . -# . ISg+ VX NSg/V P ISgPl+ NSg/C V/J ISg+ V P NSg/V NSg/V/J/R/P ISg+ V/J ISg/D$+ . NSg/J+ NSg/V+ . +# . ISg+ VX V P ISgPl+ NSg/C V/J ISg+ V P NSg/V NSg/V/J/R/P ISg+ V/J ISg/D$+ . NSg/J+ NSg/V+ . > I even hoped for a while that she’d throw me over , but she didn’t , because she # ISg+ NSg/V/J V/J C/P D/P+ NSg/V/C/P+ NSg/I/C/Ddem+ W? NSg/V NPr/ISg+ NSg/V/J/P . NSg/C/P ISg+ V . C/P ISg+ > was in love with me too . She thought I knew a lot because I knew different @@ -10340,8 +10340,8 @@ # > His movements — he was on foot all the time — were afterward traced to Port # ISg/D$+ NPl . NPr/ISg+ V J/P NSg/V+ NSg/I/J/C D+ NSg/V/J+ . NSg/V R/Am V/J P NPr/V/J -> Roosevelt and then to Gad’s Hill , where he bought a sandwich that he didn’t eat , -# NPr+ V/C NSg/J/C P ? NPr/V+ . NSg/C NPr/ISg+ NSg/V D/P+ NSg/V/J+ NSg/I/C/Ddem+ NPr/ISg+ V NSg/V . +> Roosevelt and then to Gad’s Hill , where he bought a sandwich that he didn’t eat , +# NPr+ V/C NSg/J/C P ? NPr/V+ . NSg/C NPr/ISg+ NSg/V D/P+ NSg/V/J+ NSg/I/C/Ddem+ NPr/ISg+ V V . > and a cup of coffee . He must have been tired and walking slowly , for he didn’t # V/C D/P NSg/V P NSg/V/J+ . NPr/ISg+ NSg/V NSg/VX NSg/V V/J V/C NSg/V/J R . C/P NPr/ISg+ V > reach Gad’s Hill until noon . Thus far there was no difficulty in accounting for @@ -10718,10 +10718,10 @@ # NPl/V+ NPr/ISg+ V P NSg/V NSg/I/J/C R NSg/P ISg/D$+ V/J NPr/V/J/Am NPr/V+ NSg/I/C/Ddem+ ISg+ V > difficulty in getting off his coat . He was on the point of collapse , so I took # NSg+ NPr/J/P NSg/V NSg/V/J/P ISg/D$+ NSg/V+ . NPr/ISg+ V J/P D NSg/V P NSg/V+ . NSg/I/J/C ISg+ V -> him into the music room and made him sit down while I sent for something to eat . -# ISg+ P D+ NSg/V/J+ NSg/V/J+ V/C NSg/V ISg+ NSg/V NSg/V/J/P NSg/V/C/P ISg+ NSg/V C/P NSg/I/V/J+ P+ NSg/V . -> But he wouldn’t eat , and the glass of milk spilled from his trembling hand . -# NSg/C/P NPr/ISg+ VX NSg/V . V/C D NPr/V P NSg/V+ V/J P ISg/D$+ V NSg/V+ . +> him into the music room and made him sit down while I sent for something to eat . +# ISg+ P D+ NSg/V/J+ NSg/V/J+ V/C NSg/V ISg+ NSg/V NSg/V/J/P NSg/V/C/P ISg+ NSg/V C/P NSg/I/V/J+ P+ V . +> But he wouldn’t eat , and the glass of milk spilled from his trembling hand . +# NSg/C/P NPr/ISg+ VX V . V/C D NPr/V P NSg/V+ V/J P ISg/D$+ V NSg/V+ . > # > “ I saw it in the Chicago newspaper , ” he said . “ It was all in the Chicago @@ -11012,8 +11012,8 @@ # V P NSg/V J/P V ISg/D$+ NSg/V/J+ C/P NPr/ISg+ V NSg/V I/J/R+ NSg/J+ NPl/V+ . > First time I saw him was when he come into Winebrenner’s poolroom at Forty - third # NSg/V/J NSg/V/J+ ISg+ NSg/V ISg+ V NSg/I/C NPr/ISg+ NSg/V/P P ? NSg NSg/P NSg/J . NSg/V/J -> Street and asked for a job . He hadn’t eat anything for a couple of days . ‘ Come -# NSg/V/J V/C V/J C/P D/P+ NPr/V+ . NPr/ISg+ V NSg/V NSg/I/V C/P D/P NSg/V/J P NPl+ . Unlintable NSg/V/P +> Street and asked for a job . He hadn’t eat anything for a couple of days . ‘ Come +# NSg/V/J V/C V/J C/P D/P+ NPr/V+ . NPr/ISg+ V V NSg/I/V C/P D/P NSg/V/J P NPl+ . Unlintable NSg/V/P > on have some lunch with me , ’ I sid . He ate more than four dollars ’ worth of food # J/P NSg/VX I/J/R NSg/V+ P NPr/ISg+ . . ISg+ NPr+ . NPr/ISg+ NSg/V NPr/I/V/J C/P NSg NPl+ . NSg/V/J P NSg+ > in half an hour . ”