explosion / spaCy
- пятница, 21 октября 2016 г. в 03:18:21
Python
💫 Industrial-strength Natural Language Processing (NLP) with Python and Cython
spaCy is a library for advanced natural language processing in Python and Cython. See here for documentation and details. spaCy is built on the very latest research, but it isn't researchware. It was designed from day 1 to be used in real products. It's commercial open-source software, released under the MIT license.
GitHub Issue tracker | |
StackOverflow, Reddit usergroup, Gitter chat | |
Reddit usergroup, Gitter chat | |
contact@explosion.ai |
spaCy is compatible with 64-bit CPython 2.6+/3.3+ and runs on Unix/Linux, OS X and Windows. Source and binary packages are available via pip and conda. If there are no binary packages for your platform available please make sure that you have a working build enviroment set up. See notes on Ubuntu, OS X and Windows for details.
conda config --add channels spacy # only needed once
conda install spacy
When using pip it is generally recommended to install packages in a virtualenv to avoid modifying system state:
# make sure you are using a recent pip/virtualenv version
python -m pip install -U pip virtualenv
virtualenv .env
source .env/bin/activate
pip install spacy
Python packaging is awkward at the best of times, and it's particularly tricky with C extensions, built via Cython, requiring large data files. So, please report issues as you encounter them.
After installation you need to download a language model. Currently only models for
English and German, named en
and de
, are available.
python -m spacy.en.download
python -m spacy.de.download
sputnik --name spacy en_glove_cc_300_1m_vectors # For better word vectors
Then check whether the model was successfully installed:
python -c "import spacy; spacy.load('en'); print('OK')"
The download command fetches and installs about 500 MB of data which it installs
within the spacy
package directory.
To upgrade spaCy to the latest release:
conda update spacy
pip install -U spacy
Sometimes new releases require a new language model. Then you will have to upgrade to a new model, too. You can also force re-downloading and installing a new language model:
python -m spacy.en.download --force
The other way to install spaCy is to clone its GitHub repository and build it from source. That is the common way if you want to make changes to the code base.
You'll need to make sure that you have a development enviroment consisting of a Python distribution including header files, a compiler, pip, virtualenv and git installed. The compiler part is the trickiest. How to do that depends on your system. See notes on Ubuntu, OS X and Windows for details.
# make sure you are using recent pip/virtualenv versions
python -m pip install -U pip virtualenv
# find git install instructions at https://git-scm.com/downloads
git clone https://github.com/explosion/spaCy.git
cd spaCy
virtualenv .env && source .env/bin/activate
pip install -r requirements.txt
pip install -e .
Compared to regular install via pip and conda requirements.txt additionally installs developer dependencies such as cython.
Install system-level dependencies via apt-get
:
sudo apt-get install build-essential python-dev git
Install a recent version of XCode, including the so-called "Command Line Tools". OS X ships with Python and git preinstalled.
Install a version of Visual Studio Express or higher that matches the version that was used to compile your Python interpreter. For official distributions these are VS 2008 (Python 2.7), VS 2010 (Python 3.4) and VS 2015 (Python 3.5).
spaCy comes with an extensive test suite. First, find out where spaCy is installed:
python -c "import os; import spacy; print(os.path.dirname(spacy.__file__))"
Then run pytest
on that directory. The flags --vectors
, --slow
and --model
are optional and enable additional tests:
# make sure you are using recent pytest version
python -m pip install -U pytest
python -m pytest <spacy-directory> --vectors --model --slow
For the detailed documentation, check out the spaCy website.
Path
objects. You can now load resources over your network, or do similar trickery, by passing any object that supports the Path
protocol.Language.__init__
(and its subclasses English.__init__
and German.__init__
) has been renamed to path
.token.repvec
name has been removed..train()
method of Tagger and Parser has been renamed to .update()
GoldParse
class has a new __init__()
method. The old method has been preserved in GoldParse.from_annot_tuples()
.Parser
class have changed.get_package
and get_package_by_name
helper functions have been moved into a new module, spacy.deprecated
, in case you still need them while you update.get_lang_class
bug when GloVe vectors are used.doc.sents
raised IndexError on empty string.Lexeme
objects hashablenoun_chunks
detect root NPsThanks to @daylen, @RahulKulhari, @stared, @adamhadani, @izeye and @crawfordcomeaux for the pull requests!
Doc.has_vector
and Span.has_vector
properties.Span.sent
property.spaCy finally supports another language, in addition to English. We're lucky
to have Wolfgang Seeker on the team, and the new German model is just the
beginning. Now that there are multiple languages, you should consider loading
spaCy via the load()
function. This function also makes it easier to load extra
word vector data for English:
import spacy
en_nlp = spacy.load('en', vectors='en_glove_cc_300_1m_vectors')
de_nlp = spacy.load('de')
To support use of the load function, there are also two new helper functions:
spacy.get_lang_class
and spacy.set_lang_class
. Once the German model is
loaded, you can use it just like the English model:
doc = nlp(u'''Wikipedia ist ein Projekt zum Aufbau einer Enzyklopädie aus freien Inhalten, zu dem du mit deinem Wissen beitragen kannst. Seit Mai 2001 sind 1.936.257 Artikel in deutscher Sprache entstanden.''')
for sent in doc.sents:
print(sent.root.text, sent.root.n_lefts, sent.root.n_rights)
# (u'ist', 1, 2)
# (u'sind', 1, 3)
The German model provides tokenization, POS tagging, sentence boundary detection, syntactic dependency parsing, recognition of organisation, location and person entities, and word vector representations trained on a mix of open subtitles and Wikipedia data. It doesn't yet provide lemmatisation or morphological analysis, and it doesn't yet recognise numeric entities such as numbers and dates.
Bugfixes
Token.__str__
and Token.__unicode__
built-ins: they included a trailing space.This release offers improved support for replacing the word vectors used by spaCy. To install Stanford's GloVe vectors, trained on the Common Crawl, just run:
sputnik --name spacy install en_glove_cc_300_1m_vectors
To reduce memory usage and loading time, we've trimmed the vocabulary down to 1m entries.
This release also integrates all the code necessary for German parsing. A German model
will be released shortly. To assist in multi-lingual processing, we've added a load()
function. To load the English model with the GloVe vectors:
spacy.load('en', vectors='en_glove_cc_300_1m_vectors')
Fix incorrect use of header file, caused from problem with thinc
Small correction to right_edge calculation
Support multi-threading, via the .pipe
method. spaCy now releases the GIL around the
parser and entity recognizer, so systems that support OpenMP should be able to do
shared memory parallelism at close to full efficiency.
We've also greatly reduced loading time, and fixed a number of bugs.
Fix data version lock that affected v0.100.1
v0.100 included header files built on Linux that caused installation to fail on OSX. This should now be corrected. We also update the default data distribution, to include a small fix to the tokenizer.
Matcher
. This should work by default when using the
English.__call__
method of running the pipeline. If invoking Parser.__call__
directly to do NER,
you should call the Parser.add_label()
method to register your entity type.Span
.doc.merge()
to sometimes hangdoc.merge()
and span.merge()
methods, no longer invalidates existing Span
objects. This makes it much easier to merge multiple spans, e.g. to merge all named entities, or all base noun phrases. Thanks to @andreasgrv for help on this patch..rank
, is added to Token and Lexeme objects, giving the frequency rank of the word.__str__
methods for Python2--force
to over-write the data directory in download.pyMatcher
and doc.merge()
.merge
Matcher
Span
token.conjuncts`
Bug fixes to word vectors