snowballstemmer

This package provides 36 stemmers for 34 languages generated from Snowball algorithms.

BSD-3-Clause 15 个版本 Python >=3.3
Snowball Developers <snowball-discuss@lists.tartarus.org>
安装
pip install snowballstemmer
poetry add snowballstemmer
pipenv install snowballstemmer
conda install snowballstemmer
描述

Snowball stemming library collection for Python

Python 3 (>= 3.3) is supported. We no longer support Python 2 as the Python developers stopped supporting it at the start of 2020. Snowball 2.1.0 was the last release to officially support Python 2; Snowball 3.0.1 was the last release which had the code to support Python 2, but we were no longer testing it.

What is Stemming?

Stemming maps different forms of the same word to a common "stem" - for example, the English stemmer maps connection, connections, connective, connected, and connecting to connect. So a search for connected would also find documents which only have the other forms.

This stem form is often a word itself, but this is not always the case as this is not a requirement for text search systems, which are the intended field of use. We also aim to conflate words with the same meaning, rather than all words with a common linguistic root (so awe and awful don't have the same stem), and over-stemming is more problematic than under-stemming so we tend not to stem in cases that are hard to resolve. If you want to always reduce words to a root form and/or get a root form which is itself a word then Snowball's stemming algorithms likely aren't the right answer.

How to use library

The stemming algorithms generally expect the input text to use composed accents (Unicode NFC or NFKC) and to have been folded to lower case already.

The snowballstemmer module has two functions.

The snowballstemmer.algorithms function returns a list of available algorithm names.

The snowballstemmer.stemmer function takes an algorithm name and returns a Stemmer object.

Stemmer objects have a Stemmer.stemWord(word) method and a Stemmer.stemWords(word[]) method.

.. code-block:: python

import snowballstemmer

stemmer = snowballstemmer.stemmer('english') print(stemmer.stemWords("We are the world".split()))

Generally you should create a stemmer object and reuse it rather than creating a fresh object for each word stemmed (since there's some cost to creating and destroying the object).

The stemmer code is re-entrant, but not thread-safe if the same stemmer object is used concurrently in different threads.

If you want to perform stemming concurrently in different threads, we suggest creating a new stemmer object for each thread. The alternative is to share stemmer objects between threads and protect access using a mutex or similar (e.g. threading.Lock in Python) but that's liable to slow your program down as threads can end up waiting for the lock.

Automatic Acceleration

PyStemmer <https://pypi.org/project/PyStemmer/>_ is a wrapper module for Snowball's libstemmer_c and should provide results 100% compatible to snowballstemmer.

PyStemmer is faster because it wraps generated C versions of the stemmers; snowballstemmer uses generate Python code and is slower but offers a pure Python solution.

If PyStemmer is installed, snowballstemmer.stemmer returns a PyStemmer Stemmer object which provides the same Stemmer.stemWord() and Stemmer.stemWords() methods.

Benchmark


This is a crude benchmark which measures the time for running each stemmer on
every word in its sample vocabulary (10,787,583 words over 26 languages).  It's
not a realistic test of normal use as a real application would do much more
than just stemming.  It's also skewed towards the stemmers which do more work
per word and towards those with larger sample vocabularies.

* Python 2.7 + **snowballstemmer** : 13m00s (15.0 * PyStemmer)
* Python 3.7 + **snowballstemmer** : 12m19s (14.2 * PyStemmer)
* PyPy 7.1.1 (Python 2.7.13) + **snowballstemmer** : 2m14s (2.6 * PyStemmer)
* PyPy 7.1.1 (Python 3.6.1) + **snowballstemmer** : 1m46s (2.0 * PyStemmer)
* Python 2.7 + **PyStemmer** : 52s

For reference the equivalent test for C runs in 9 seconds.

These results are for Snowball 2.0.0.  They're likely to evolve over time as
the code Snowball generates for both Python and C continues to improve (for
a much older test over a different set of stemmers using Python 2.7,
**snowballstemmer** was 30 times slower than **PyStemmer**, or 9 times slower
with **PyPy**).

The message to take away is that if you're stemming a lot of words you should
either install **PyStemmer** (which **snowballstemmer** will then automatically
use for you as described above) or use PyPy.

The TestApp example
-------------------

The ``testapp.py`` example program allows you to run any of the stemmers
on a sample vocabulary.

Usage::

   testapp.py <algorithm> "sentences ... "

.. code-block:: bash

   $ python testapp.py English "sentences... "
分类
Development Status :: 5 - Production/Stable Intended Audience :: Developers Natural Language :: Arabic Natural Language :: Armenian Natural Language :: Basque Natural Language :: Catalan Natural Language :: Czech Natural Language :: Danish Natural Language :: Dutch Natural Language :: English Natural Language :: Esperanto Natural Language :: Estonian Natural Language :: Finnish Natural Language :: French Natural Language :: German Natural Language :: Greek Natural Language :: Hindi Natural Language :: Hungarian Natural Language :: Indonesian Natural Language :: Irish Natural Language :: Italian Natural Language :: Lithuanian Natural Language :: Nepali Natural Language :: Norwegian Natural Language :: Persian Natural Language :: Polish Natural Language :: Portuguese Natural Language :: Romanian Natural Language :: Russian Natural Language :: Serbian Natural Language :: Spanish Natural Language :: Swedish Natural Language :: Tamil Natural Language :: Turkish Natural Language :: Yiddish Operating System :: OS Independent Programming Language :: Python Programming Language :: Python :: 3 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 Programming Language :: Python :: 3.13 Programming Language :: Python :: 3.14 Programming Language :: Python :: 3.3 Programming Language :: Python :: 3.4 Programming Language :: Python :: 3.5 Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: Implementation :: CPython Programming Language :: Python :: Implementation :: PyPy Topic :: Database Topic :: Internet :: WWW/HTTP :: Indexing/Search Topic :: Text Processing :: Indexing Topic :: Text Processing :: Linguistic
版本列表
3.1.1 2026-06-03
3.1.0 2026-05-24
3.0.1 2025-05-09
3.0.0.1 2025-05-08
3.0.0 2025-05-08
2.2.0 2021-11-16
2.1.0 2021-01-21
2.0.0 2019-10-03
1.9.1 2019-09-05
1.9.0 2019-06-26
1.2.1 2015-12-25
1.2.0 2014-07-16
1.1.0 2013-02-16
1.0.0 2013-02-15
0.1.0 2013-02-15