[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md)

[![Build Status](https://travis-ci.org/atteo/evo-inflector.svg)](https://travis-ci.org/atteo/evo-inflector)
[![Coverage Status](https://img.shields.io/coveralls/atteo/evo-inflector.svg)](https://coveralls.io/r/atteo/evo-inflector)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.atteo/evo-inflector/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.atteo/evo-inflector)

About
=====

Evo Inflector implements English pluralization algorithm based on ["Damian Conway's"](https://en.wikipedia.org/wiki/Damian_Conway) paper ["An Algorithmic Approach to English Pluralization"](http://www.csse.monash.edu.au/~damian/papers/HTML/Plurals.html).

There are more or less half a million downloads of Evo Inflector from Maven Central each month.
It is used by many high profile projects like [Spring and JetBrains](https://mvnrepository.com/artifact/org.atteo/evo-inflector/usages) and [tons of smaller projects](https://github.com/atteo/evo-inflector/network/dependents).

Usage
=====

The usage is pretty simple:

```java
English.plural("word") == "words"
```

Additionaly you can use provide a required count to select singular or plural form automatically:

```java
English.plural("foot", 1)) == "foot"
English.plural("foot", 2)) == "feet"
```


Features
========
The algorithm tries to preserve the capitalization of the original word, for instance:

```java
English.plural("NightWolf") == "NightWolves"
```

Limitations:
============

* The algorithm cannot reliably detect uncountable words. It will pluralize them anyway.
* There are words which have the same singular form and multiple plural forms, ex:
die (plural dies) - The cubical part of a pedestal; a plinth.
die (plural dice) - An isohedral polyhedron, usually a cube

Tests
=====

As part of the unit tests the results of the algorithm are compared with data from Wiktionary.

There are (2021-07-10) 276574 single word english nouns in the English Wiktionary of which:
- 69.26971% (191582) are countable nouns,
- 27.56839% (76247) are uncountable nouns,
- for 2.8863885% (7983) nouns plural is unknown,
- for 0.27551398% (762) nouns plural is not attested.

Evo Inflector returns correct answer for:
- 96.24286% (184384) of all countable nouns, see [this report](reports/incorrect-countable.md),
- but only for 8.56296% (6529) of uncountable nouns.

In overall it returns correct answer for 69.02782% (190913) of all nouns.

Changes
=======

1.3
- fix ulum -> ula rule
- return empty string for empty string input
- improve preservation of letter capitalization
- make tests up-to-date with change in Wiktionary

1.2.2
- fix pluralization of todo

1.2
- compile with Java 1.6 for better compatibility
- -s -> -ses, for instance pancreas -> pancrases
- -ulum -> -ula, for instance baculum -> bacula
- some minor optimizations
- better testing with Wiktionary dump

1.1
- fix for -us ending words, like virus

1.0.1
- add inflection with count

1.0 Initial revision

License
=======

Evo Inflector is available under [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0).

Download
========

You can download the library from [here](http://search.maven.org/remotecontent?filepath=org/atteo/evo-inflector/1.3/evo-inflector-1.3.jar) or use the following Maven dependency:

```xml
<dependency>
    <groupId>org.atteo</groupId>
    <artifactId>evo-inflector</artifactId>
    <version>1.3</version>
</dependency>
```
or the Gradle dependency:

```groovy
compile group: 'org.atteo', name: 'evo-inflector', version: '1.2.2'
```