Skip to main content

PyPykko

PyPykko is a wrapper around pykko. It provides the basic analysis and generation API in an easily installable package. PyPykko can be installed without compiling anything (as the transducers are pre-compiled) or pulling in any native dependencies (such as hfst).

This package contains (slightly modified for kfst compatibility versions of) all the files in the tools directory of pykko as well as constants.py and file_tools.py from the scripts directory and utils.py from the scripts directory as scriptutils.py. It also provides the novel reinflect.py and extras.py. The function utils.analyze returns a NamedTuple as opposed to the unnamed tuple returned by upstream Pykko as of writing.

Installation

PyPykko is available on PyPI and can be installed with pip:

pip install pypykko

Usage

There are two main Python methods utils.analyze and generate.generate_wordform inherited from Pykko proper; besides these there is reinflect.reinflect that is perhaps a more suitable interface for general reinflection. There is also bolted-on alignment support in extras.analyze_with_compound_parts.

reinflect.reinflect

reinflect.reinflect tries to reinflect a word to the best of its ability. It can be instructed either with a model word or with a specific form. Further, it can be given the form the original word was in if known ahead of time and the part-of-speech of the word.

>>> from pypykko.reinflect import reinflect
>>> reinflect("mökkiammeemme", model="talossa")
{'mökkiammeessa'}
>>> reinflect("esijuosta", model="katselemme")
{'esijuoksemme'}
>>> reinflect("mökkiammeemme", new_form="+sg+nom")
{'mökkiamme'}
>>> reinflect("möhkö", new_form="+pl+ine+ko")
{'möhköissäkö'}
>>> reinflect("viinissä", model="talot")
{'viinet'}
>>> reinflect("viinissä", model="talot", orig_form="+sg+ine")
{'viinit'}
>>> reinflect("hömppäämme", model="juokset", pos="verb")
{'hömppäät'}
>>> reinflect("hömppäämme", model="juokset", pos="noun")
{'hömpät'}

utils.analyze and extras.analyze_with_compound_parts

utils.analyze should be used in most cases:

>>> from pypykko.utils import analyze
>>> analyze("hätkähtäneet")
[PykkoAnalysis(wordform='hätkähtäneet', source='Lexicon', lemma='hätkähtää', pos='verb', homonym='', info='', morphtags='+past+conneg+pl', weight=0.0),
 PykkoAnalysis(wordform='hätkähtäneet', source='Lexicon', lemma='hätkähtää', pos='verb', homonym='', info='', morphtags='+part_past+pl+nom', weight=0.0),
 PykkoAnalysis(wordform='hätkähtäneet', source='Lexicon', lemma='hätkähtänyt', pos='participle', homonym='', info=' ← verb:hätkähtää:+part_past', morphtags='+pl+nom', weight=0.0)]

The fields of the outcoming tuple are:

  • wordform: Surface form (input as it is given)
  • source: The source of the word: eg. Lexicon if it is a word known ahead of time, Guesser|Any for unknown words and Lexicon|Pfx for words analyzed as the compounds of known words.
  • lemma: The lemma form of the word; notably this can contain pipe symbols to delimit compound parts: ilma|luukku. Sometimes Finnish has infix inflection, and the compound parts can be separately inflected (eg. uudenvuoden -> uusi|vuosi).
  • pos: The part of speech of the word.
  • homonym: The homonym number of the word (can be empty). Eg. the word viini has two senses that have slightly different inflection: wine (viini -> viinin) and quiver (viini -> viinen). In cases where such homonyms exist but it is impossible to tell which form is presented (the nominative form viini here), we get both interpretations:
[PykkoAnalysis(wordform='viini', source='Lexicon', lemma='viini', pos='noun', homonym='1', info='', morphtags='+sg+nom', weight=0.0),
 PykkoAnalysis(wordform='viini', source='Lexicon', lemma='viini', pos='noun', homonym='2', info='', morphtags='+sg+nom', weight=0.0)]

In cases where the form is unambiguous (eg. viinen), we get only the homonym number that is relevant:

[PykkoAnalysis(wordform='viinen', source='Lexicon', lemma='viini', pos='noun', homonym='2', info='', morphtags='+sg+gen', weight=0.0)]

In cases where the homonym is different in different interpretations, we get annotated interpretations:

[PykkoAnalysis(wordform='viinin', source='Lexicon', lemma='viini', pos='noun', homonym='2', info='', morphtags='+pl+ins', weight=0.0),
 PykkoAnalysis(wordform='viinin', source='Lexicon', lemma='viini', pos='noun', homonym='1', info='', morphtags='+sg+gen', weight=0.0)]
  • info: Either a register annotation or information on a derivation, eg:
>>> analyze("höpsöillä")
[PykkoAnalysis(wordform='höpsöillä', source='Lexicon', lemma='höpsö', pos='noun', homonym='', info='⟨coll⟩', morphtags='+pl+ade', weight=0.0), PykkoAnalysis(wordform='höpsöillä', source='Lexicon', lemma='höpsö', pos='adjective', homonym='', info='⟨coll⟩', morphtags='+pl+ade', weight=0.0)]
>>> analyze("kulkenut")
[PykkoAnalysis(wordform='kulkenut', source='Lexicon', lemma='kulkea', pos='verb', homonym='', info='', morphtags='+past+conneg+sg', weight=0.0), PykkoAnalysis(wordform='kulkenut', source='Lexicon', lemma='kulkea', pos='verb', homonym='', info='', morphtags='+part_past+sg+nom', weight=0.0), PykkoAnalysis(wordform='kulkenut', source='Lexicon', lemma='kulkenut', pos='participle', homonym='', info=' ← verb:kulkea:+part_past', morphtags='+sg+nom', weight=0.0)]
  • morphtags: Morphological tags that name the inflectional form.
  • weight: The weight of this analysis per the FST. Generally, lower weights are more probable.

extras.analyze\_with\_compound\_parts is of use when it is useful to know the exact inflected forms of the compound parts of a word. Eg. when looking at "isonvarpaan", one might want to not only know that it is the compound of "iso" and "varvas" but also that they are in the forms "ison" and "varpaan". extras.anlyze\_with\_compound\_parts returns the character ranges matching compound parts.

>>> analyze_with_compound_parts("isonvarpaan")
[RangedPykkoAnalysis(wordform='isonvarpaan', source='Lexicon', lemma='iso|varvas', pos='noun', homonym='', info='', morphtags='+sg+gen', weight=0.0, ranges=(range(0, 4), range(4, 11)))]

generate.generate_wordform

generate\_wordform is a simple-to-use api to inflect in-lexicon words.

>>> from pypykko.generate import generate_wordform
>>> generate_wordform("höpönassu", "noun", '+pl+abe+ko')
{'höpönassuittako'}

License

PyPykko is licensed under the MIT license like Pykko itself, as it is mostly constituted of Pykko's files with minor modifications. See the LICENSE file for details. Note that kfst (and kfst-rs) have less permissive licenses.

Files from Pykko itself are modified from the version in commit 95f3d51f0e94a1e88ab7c750f2bedcb6b3fd5edd. The compiled transducers are from the same commit.

Metadata

Release files for pypykko 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pypykko 0.3.0
File Size Uploaded Provenance Actions
pypykko-0.3.0.tar.gz 8.0 MB Without provenance Details for pypykko-0.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pypykko 0.3.0
File Interpreter ABI Platform Actions
pypykko-0.3.0-py3-none-any.whl Python 3 none any Details for pypykko-0.3.0-py3-none-any.whl

Total release size: 16.0 MB

Release files / pypykko-0.3.0.tar.gz

Download URL pypykko-0.3.0.tar.gz
Size 8.0 MB
Tags Source
SHA-256 checksum
How to use checksums
b7216a1226a050f11988fe71b835f981961d5b66cec68e45e2609e2e81cebce5
BLAKE2b-256 checksum
How to use checksums
f084936aafc7b59575140c76b41bc61ba07f0919463b3d991f91292dd26d0f81
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.5

Release files / pypykko-0.3.0-py3-none-any.whl

Download URL pypykko-0.3.0-py3-none-any.whl
Size 8.0 MB
Tags Python 3
SHA-256 checksum
How to use checksums
d8e53445287f38d072ca857c43fac324c08892c32c32ad1d5a12ab5f54a33de4
BLAKE2b-256 checksum
How to use checksums
0b96534d4e0464a0866e5f8ef0321cb1f712e4efbc0b4bc72cf94c02c9b78764
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.5

Security for pypykko 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page