2016-11-09 3 views
4
>> from nltk.stem import WordNetLemmatizer as lm1 
>> from nltk import WordNetLemmatizer as lm2 
>> from nltk.stem.wordnet import WordNetLemmatizer as lm3 

私にとっては、3つの方法はすべて同じ方法ですが、確認するだけで何か違うものを提供していますか?なぜNLTKライブラリにLemmatizersがありますか?

答えて

5

いいえ、違いはありません。すべて同じです。クラス(WordNetLemmatizer)はoriganlly nltk.stem.wordnetで書かれている

はそうあなたもそうNLTK __init__.py fileにインポートされfrom nltk.stem.wordnet import WordNetLemmatizer as lm3

あなたの操作を行うことができますので、なぜこれが起こっているeripによって修正したよう

from nltk.stem import WordNetLemmatizer as lm1 
from nltk import WordNetLemmatizer as lm2 
from nltk.stem.wordnet import WordNetLemmatizer as lm3 

lm1 == lm2 
>>> True 


lm2 == lm3 
>>> True 


lm1 == lm3 
>>> True 

ですできるかfrom nltk import WordNetLemmatizer as lm2

また、__init__.py nltk.stemモジュールにインポートされますので、from nltk.stem import WordNetLemmatizer as lm1

+3

最後の点は間違っています。 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

+0

Thanks @eripが答えを更新しました。 – harshil9968

1

回答:これらはすべて同じです。

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 

WordNetLemmatizerためNLTKでの輸入の構造は次のようになります。

\nltk 
    __init__.py 
    \stem. 
     __init__.py 
     wordnet.py  # This is where WordNetLemmatizer code resides. 

from nltk.stem.wordnet import WordNetLemmatizer 

をnltk.stemから:あなたが行うことができますのでWordNetLemmatizerは、nltk.stem.wordnet.pyhttps://github.com/nltk/nltk/blob/develop/nltk/stem/wordnet.py#L15にどこにある最低。 のinitの.py、我々はあなたが我々が見るnltk.__init__.pyから

from nltk.stem import WordNetLemmatizer 

を行うことができるようにnltk.stemは、WordNetLemmatizerにアクセスすることを可能にするhttps://github.com/nltk/nltk/blob/develop/nltk/stem/init.py#L30で上記のインポートを参照してください。

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 wn1nltk_dataでWordNetのファイルを開きますLazyCorpusLoaderオブジェクトであり、それはあなたがのsynsetにアクセスすることができます:https://github.com/nltk/nltk/blob/develop/nltk/corpus/init.py#L246

wn2nltk.corpus.wordnet.pyに常駐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のコーパスリーダーとは関係ありません。

関連する問題