clips/pattern: a Python web mining module whose README opens with a warning
Web mining module for Python, with tools for scraping, natural language processing, machine learning, network analysis and visualization.
At a glance
- What is it?
- Pattern bundles web scraping, part-of-speech tagging, WordNet, a vector space model, KNN/SVM/Perceptron classifiers and graph centrality in one BSD-licensed package. Its own README now declares it archived and unmaintained, which changes who should consider it.
- Who is it for?
- Adopt pattern only for bounded, offline work where a bundled tagger, WordNet interface and small classifier in a single BSD-3-Clause package outweigh the absence of security patches: teaching, reproducing the 2012 JMLR paper, or a throwaway prototype. Do not adopt it for production pipelines that scrape live Google or Twitter endpoints, and do not expect issue triage, since the README states the repository is no longer maintained.
- Can I use it commercially?
- Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 41 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What pattern is, and who the bundled scope is aimed at
Pattern is a web mining module for Python that ships four tool groups in one package: data mining (web services for Google, Twitter and Wikipedia, a web crawler, an HTML DOM parser), natural language processing (part-of-speech taggers, n-gram search, sentiment analysis, WordNet), machine learning (vector space model, clustering, classification with KNN, SVM and Perceptron), and network analysis (graph centrality and visualization). The intended user is someone who wants a text pipeline end to end without assembling five libraries: fetch documents, parse them, tag them, turn them into vectors, classify or cluster, and graph the result. The README's own example is exactly that shape. Tweets containing #win or #fail are collected with Twitter(), tagged with pattern.en.tag, filtered to adjectives (pos == 'JJ'), counted into a dictionary, and fed to a KNN classifier that then labels 'sweet potato burger' and 'stupid autocorrect'. Nothing in that chain requires a second dependency. The package also carries non-English taggers for Dutch, German, Spanish, French and Italian, which is unusual for a single-module project and is the main reason a multilingual prototype might still reach for it.
The archived warning is the first thing in the README
Before any feature list, the README states: "This repository is no longer maintained." It continues that the project is archived and will not receive further updates, bug fixes, or security patches, and that issues and pull requests may not be reviewed, closing with "Use this software at your own risk." The repository metadata supplied here says Archived: no and lists a last push in 2026, so the hosting flag and the README text disagree; the README is the more conservative signal, and the only release listed is 3.7-beta from August 2022. Treat the documentation as frozen. The practical consequence is not that the code stops working. It is that anything pattern does over the network, and anything pattern does with a parser, has no upstream to fix it. A web mining library whose maintenance has stopped is a different proposition from a parser or a math library in the same state, because its inputs are controlled by third parties who change them without notice.
Installation, version ceiling and the sys.path fallback
The README gives three routes. From an unpacked download: cd pattern-3.6 followed by python setup.py install. From PyPI: pip install pattern. If neither works, it lists manual placement of the pattern folder next to your script, or into the site-packages directory for your interpreter (c:\python36\Lib\site-packages\ on Windows, /Library/Python/3.6/site-packages/ on Mac OS X, /usr/lib/python3.6/site-packages/ on Unix), or appending the module location to sys.path before importing, with this example: MODULE = '/users/tom/desktop/pattern' then import sys; if MODULE not in sys.path: sys.path.append(MODULE) then from pattern.en import parsetree. That last fallback is the honest one to plan for. The README states support for Python 2.7 and Python 3.6, and the install paths it names are all 3.6 paths, so the supported window is narrow and old. The version section says 3.6 while the release list shows a 3.7-beta, another small inconsistency in a document nobody is updating. The README does not describe a wheel, so expect the setup.py route on an interpreter that matches.
What is actually inside the package
The bundled dependencies section is the most useful part of the README for judging risk, because it tells you what you inherit. Pattern embeds the Brill tagger (Eric Brill) plus Brill taggers for Dutch, German, Spanish, French and Italian, with the Spanish tagger trained on Wikicorpus and the French one on Lefff. It includes English pluralization by Damian Conway, Spanish verb inflection by Fred Jehle, French verb inflection by Bob Salita, a spelling corrector by Peter Norvig, LIBSVM and LIBLINEAR for the SVM and linear classifiers, NetworkX centrality code by Hagberg, Schult and Swart, and a Graph JavaScript framework by Hellesoy and Hoover for visualization. Those are vendored copies, not declared dependencies resolved at install time. In a maintained project that would be a convenience; in an archived one it means the LIBSVM and LIBLINEAR code inside pattern will not track upstream fixes, and you cannot upgrade them by editing a requirements file. If your reason for choosing pattern is the classifier, understand that you are choosing a snapshot of LIBSVM rather than LIBSVM.
The web services module is the part most likely to break
The example calls Twitter().search('#win OR #fail', start=i, count=100) and iterates over tweet.text. That is a client against a specific service API as it existed when the code was written. The README lists Google, Twitter and Wikipedia under data mining, and none of those endpoints has stood still. There is no configuration in the supplied material for supplying your own credentials, no documented rate-limit handling, and no statement about what the library does when a response shape changes. The crawler and HTML DOM parser sit in the same module and have a different failure profile: they depend on markup rather than a JSON contract, so they tend to degrade rather than fail outright. For a project that is explicitly about web mining, the network-facing half is the half you should assume is stale. The NLP half, by contrast, runs against data files shipped in the package and does not care what any website does this month.
Where pattern is the wrong tool, and what to use instead
If you need current NLP, pattern is the wrong tool. spaCy is the obvious alternative and the difference is structural rather than a matter of accuracy claims: spaCy ships trained statistical models distributed separately from the library, so the pipeline can be updated without touching the code, and it is actively released. Pattern's taggers are Brill rule-based taggers frozen inside the package. The trade runs the other way too. With pattern you get one install and one import namespace covering tagging, WordNet, vectors, KNN/SVM/Perceptron and graph centrality, which is convenient for a classroom or a script that must run offline from a single directory. With spaCy you get a maintained pipeline plus a separate decision about vectors, classifiers and graphs, which usually means scikit-learn and NetworkX alongside it. If your work is classification over text with no live scraping, scikit-learn's own vectorizers and estimators are the more direct choice, and the README's adjective-count trick is a few lines to reproduce. Pattern's remaining edge is the combination: the multilingual Brill taggers and the WordNet interface in the same package as the classifier, with no model download step.
Licence, citation and upgrade cost
The source is BSD-3-Clause, with LICENSE.txt as the reference file, and the README also notes that the bundled data sets, algorithms and packages come from the named authors listed above. That is a permissive licence for the pattern code, but the bundled components are a mixed bag and the README does not give a per-component licence breakdown. If you redistribute pattern inside a product, read LICENSE.txt and check the terms attached to LIBSVM, LIBLINEAR and the tagger training data yourself; this is a factual gap in the supplied material, not a legal opinion. The academic reference is De Smedt, T., Daelemans, W. (2012), "Pattern for Python", Journal of Machine Learning Research, 13, 2031-2035, which is the right citation if you use it in published work. Upgrade cost is the clearest cost of all: there is no upgrade path. The last listed release is 3.7-beta from 2022, the README promises no bug fixes or security patches, and the supported interpreters are Python 2.7 and 3.6. Any migration you make will be away from pattern, not within it.
Editorial conclusion
Adopt pattern only for bounded, offline work where a bundled tagger, WordNet interface and small classifier in a single BSD-3-Clause package outweigh the absence of security patches: teaching, reproducing the 2012 JMLR paper, or a throwaway prototype. Do not adopt it for production pipelines that scrape live Google or Twitter endpoints, and do not expect issue triage, since the README states the repository is no longer maintained. Before committing, check whether pip install pattern produces a build that imports on your interpreter, confirm the Python 3.6 ceiling against your runtime, and decide what replaces the web services module if your data source changes its API.
Community notes