feat(core): write linter to detect erroneous use of plurality (#1486)

Co-authored-by: hippietrail <hippietrail@users.noreply.github.com>
This commit is contained in:
Elijah Potter 2025-07-04 08:37:57 -06:00 committed by GitHub
parent bb84be8310
commit 7c338eb6fe
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 542 additions and 72 deletions

View file

@ -24,6 +24,7 @@
"packages/obsidian-plugin/main.js",
"pnpm-lock.yaml",
"package-lock.json",
"playwright-report",
"yarn.lock"
]
},

View file

@ -30443,6 +30443,26 @@
}
}
}
},
{
"from": "NOUN",
"to": "VERB",
"criteria": {
"Combined": {
"a": {
"WordIs": {
"relative": -1,
"word": "you"
}
},
"b": {
"WordIs": {
"relative": 0,
"word": "plan"
}
}
}
}
}
]
}

View file

@ -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
handedly

View file

@ -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);

View file

@ -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;

View file

@ -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<D> {
expr: Box<dyn Expr>,
dict: D,
}
impl<D> PossessiveNoun<D>
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<D> ExprLinter for PossessiveNoun<D>
where
D: Dictionary,
{
fn expr(&self) -> &dyn Expr {
self.expr.as_ref()
}
fn match_to_lint(&self, matched_tokens: &[Token], _source: &[char]) -> Option<Lint> {
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 nouns 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<Arc<FstDictionary>> {
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);
}
}

View file

@ -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
- =Org.capture.t()= - Opens capture template for =t= shortcut

View file

@ -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 nouns 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

View file

@ -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 nouns possessive.
Suggest:
- Replace with: “Eagle's”
Lint: WordChoice (63 priority)
Message: |
73 | cross-language differences. The tag sets for heavily inflected languages such as

View file

@ -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 nouns possessive.
Suggest:
- Replace with: “document's”
Lint: Miscellaneous (63 priority)
Message: |
7 | One turd, two turds.

View file

@ -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 nouns 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.

View file

@ -151,21 +151,21 @@
> wish you were down here with me ! There are no mice in the air , Im 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 thats 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 couldnt 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 couldnt 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 didnt 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 , Ill 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 , Ill 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 Ill get into the garden , and I dont
@ -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 shes such a capital one for catching mice you cant 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 , shell 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 , shell 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 Ill just see what this bottle does . I do hope itll 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 Im 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 , “ its 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 cant 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 ! Id nearly forgotten that Ive 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 dont believe it , ” said the Pigeon ; “ but if they do , why then theyre 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 @@
>
#
> “ Hadnt 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+ . .
>

View file

@ -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

View file

@ -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 .

View file

@ -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

View file

@ -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 @@
#
> “ Howve you been , anyhow ? ” demanded Tom of me . “ Howd 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 . .
>
#
> “ Ive 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
> Gatsbys 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+
> wouldnt 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+ .
> wouldnt 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 fellows 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 fellows 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 cant 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 shed throw me over , but she didnt , 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 Gads Hill , where he bought a sandwich that he didnt 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 Gads Hill , where he bought a sandwich that he didnt 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 didnt
# 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 Gads 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 wouldnt 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 wouldnt 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 Winebrenners 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 hadnt 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 hadnt 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 . ”