Все они одинаковые.
inspect
полезный инструмент для проверки объектов совпадают ли
>>> import inspect
>>> from nltk.stem import WordNetLemmatizer as wnl1
>>> from nltk.stem.wordnet import WordNetLemmatizer as wnl2
>>> inspect.getfile(wnl1)
'/Library/Python/2.7/site-packages/nltk/stem/wordnet.pyc'
# They come from the same file:
>>> inspect.getfile(wnl1) == inspect.getfile(wnl2)
True
>>> print inspect.getdoc(wnl1)
WordNet Lemmatizer
Lemmatize using WordNet's built-in morphy function.
Returns the input word unchanged if it cannot be found in WordNet.
>>> from nltk.stem import WordNetLemmatizer
>>> wnl = WordNetLemmatizer()
>>> print(wnl.lemmatize('dogs'))
dog
>>> print(wnl.lemmatize('churches'))
church
>>> print(wnl.lemmatize('aardwolves'))
aardwolf
>>> print(wnl.lemmatize('abaci'))
abacus
>>> print(wnl.lemmatize('hardrock'))
hardrock
Вы можете проверить исходный код тоже:
>>> print inspect.getsource(wnl1)
class WordNetLemmatizer(object):
"""
WordNet Lemmatizer
Lemmatize using WordNet's built-in morphy function.
Returns the input word unchanged if it cannot be found in WordNet.
>>> from nltk.stem import WordNetLemmatizer
>>> wnl = WordNetLemmatizer()
>>> print(wnl.lemmatize('dogs'))
dog
>>> print(wnl.lemmatize('churches'))
church
>>> print(wnl.lemmatize('aardwolves'))
aardwolf
>>> print(wnl.lemmatize('abaci'))
abacus
>>> print(wnl.lemmatize('hardrock'))
hardrock
"""
def __init__(self):
pass
def lemmatize(self, word, pos=NOUN):
lemmas = wordnet._morphy(word, pos)
return min(lemmas, key=len) if lemmas else word
def __repr__(self):
return '<WordNetLemmatizer>'
# They have the same source code too:
>>> print inspect.getsource(wnl1) == inspect.getsource(wnl2)
True
Структура импорта в NLTK для WordNetLemmatizer
выглядит следующим образом:
\nltk
__init__.py
\stem.
__init__.py
wordnet.py # This is where WordNetLemmatizer code resides.
Мы начинаем с низкий, где WordNetLemmatizer
проживает в nltk.stem.wordnet.py
https://github.com/nltk/nltk/blob/develop/nltk/stem/wordnet.py#L15, так что вы можете сделать:
from nltk.stem.wordnet import WordNetLemmatizer
От nltk.stem. INIT .py, мы видим выше импорта на https://github.com/nltk/nltk/blob/develop/nltk/stem/init.py#L30, что позволяет получить доступ к nltk.stem
WordNetLemmatizer, так что вы можете сделать
from nltk.stem import WordNetLemmatizer
Из nltk.__init__.py
мы видим:
from nltk.stem import *
Это позволяет верхний уровень nltk
импорт для доступа ко всему, что есть у nltk.stem
. Таким образом, на самом верхнем уровне nltk
, мы можем сделать:
from nltk import WordNetLemmatizer
Одно замечание, хотя, это НЕ всегда так, что объекты/модули с тем же именем, относится к тому же объекту в NLTK , например:
>>> from nltk.corpus import wordnet as wn1
>>> from nltk.corpus.reader import wordnet as wn2
>>> wn1 == wn2
False
>>> wn1.synsets('dog')
[Synset('dog.n.01'), Synset('frump.n.01'), Synset('dog.n.03'), Synset('cad.n.01'), Synset('frank.n.02'), Synset('pawl.n.01'), Synset('andiron.n.01'), Synset('chase.v.01')]
>>> wn2.synsets('dog')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'synsets'
Первый WordNet wn1
является LazyCorpusLoader
объект, который будет открывать файлы WordNet в nltk_data
и позволяет получить доступ к synsets: https://github.com/nltk/nltk/blob/develop/nltk/corpus/init.py#L246
Второй wn2
является сам wordnet.py
файл, который находится в nltk.corpus.wordnet.py
: https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py
Это становится еще более сложным, когда:
>>> from nltk.corpus import wordnet as wn1
>>> from nltk.corpus.reader import wordnet as wn2
>>> from nltk.stem import wordnet as wn3
>>> wn3 == wn1
False
>>> wn3 == wn2
False
В случае wn3
это относится к файлу nltk.stem.wordnet.py
, который содержит WordNetLemmatizer
и не имеет ничего общего с объектом wordnet corpus или считывателем корпусов для wordnet.
Ваш последний пункт неверен. NLTK использует '__init __. Py', чтобы скрыть это. Не имеет никакого отношения к эффективности механизма импорта языка. См. [Здесь] (https://github.com/nltk/nltk/blob/develop/nltk/__init__.py#L137), [здесь] (https://github.com/nltk/nltk/blob/develop/ nltk/stem/__ init __. py # L30) и [здесь] (https://github.com/nltk/nltk/blob/develop/nltk/stem/wordnet.py#L15). – erip
Спасибо @erip обновил ответ. – harshil9968