66255
# 前提・実現したいこと

言語処理100本ノックの「[6章機械学習 51.
特徴量抽出](https://nlp100.github.io/ja/ch06.html)」の問題について、回答でどの部分を修正したらいいかわからないです。

Qiita記事「[言語処理100本ノック 2020 第6章:
機械学習の51](https://qiita.com/nymwa/items/774ca6c542c1eaff160d)」に掲載されていた回答のまま、jupyter
notebookでプログラムを実行しています。

# エラーメッセージ

モジュール`spacy`はインストールしましたが、

```

    Can't find model 'en'. 
    
```

とエラーが出て、何が問題でエラーが引き起こされているのか見当がつかない状態です。

```

    OSError                                   Traceback (most recent call last)
    <ipython-input-22-e9ad3573f268> in <module>
          4 import nltk
          5 
    ----> 6 nlp = spacy.load('en')
          7 stemmer = nltk.stem.snowball.SnowballStemmer(language='english')
          8 
    
    ~/.pyenv/versions/3.7.4/lib/python3.7/site-packages/spacy/__init__.py in load(name, **overrides)
         28     if depr_path not in (True, False, None):
         29         deprecation_warning(Warnings.W001.format(path=depr_path))
    ---> 30     return util.load_model(name, **overrides)
         31 
         32 
    
    ~/.pyenv/versions/3.7.4/lib/python3.7/site-packages/spacy/util.py in load_model(name, **overrides)
        167     elif hasattr(name, "exists"):  # Path or Path-like to model data
        168         return load_model_from_path(name, **overrides)
    --> 169     raise IOError(Errors.E050.format(name=name))
        170 
        171 
    
    OSError: [E050] Can't find model 'en'. 
    It doesn't seem to be a shortcut link, a Python package or a valid path to a data directory.
    
```

# コード

```

    #51 特徴量抽出
    import re
    import spacy
    import nltk
    
    nlp = spacy.load('en')
    stemmer = nltk.stem.snowball.SnowballStemmer(language='english')
    
    def tokenize(x):
        x = re.sub(r'\s+', ' ', x)
        x = nlp.make_doc(x) #nlp(x)は遅い tokenizer以外も走るので
        x = [stemmer.stem(doc.lemma_.lower()) for doc in x]
        return x
    
    tokenized_train = [[cat, tokenize(line)] for cat, line in train]
    tokenized_valid = [[cat, tokenize(line)] for cat, line in valid]
    tokenized_test = [[cat, tokenize(line)] for cat, line in test]
    
    # 出現頻度を数える
    counter = Counter([
        token
        for _, tokens in tokenized_train
        for token in tokens
    ])
    
    # 高頻度・低頻度の語を取り除く
    vocab = [
        token
        for token, freq in counter.most_common()
        if 2 < freq < 300
    ]
    
    len(vocab)
    
```

# 開発環境

jupyter notebook 6.0.3
CC BY-SA 4.0
2020-05-03T05:47:04.983
66233
2020-05-03T15:04:25.397
32568
question
python 機械学習 jupyter-notebook 自然言語処理
Pythonのモジュールを用いた特徴量抽出のためのプログラムでエラーが出る問題について
この記事が該当すると思われます。  
エラーメッセージのように、モデルデータが無いことが原因なのでしょう。

[spacy.load('en')が実行できない](https://teratail.com/questions/173701)  
Q:

> Jupyter notebookで下記のコードを実行すると、次のようなエラーがでます。
```

>     import spacy
>     en_nlp = spacy.load('en')
>  
>     OSError: [E050] Can't find model 'en'. It doesn't seem to be a shortcut
> link, a Python package or a valid path to a data directory.
>  
```

A:

> モデルのダウンロードが済んでないことが原因のエラーですね。  
>  このコマンドでモデルをダウンロードして再度同じコードを実行すればエラーが解消します。
```

>     python3 -m spacy download en
>  
```

>
> 参考: [GitHub - explosion/spaCy: Industrial-strength Natural Language
> Processing (NLP) with Python and Cython](https://github.com/explosion/spaCy)

* * *

> このコードで出来そうですね。
```

>     en_nlp = spacy.load('/path/to/en_core_web_sm-2.0.0')
>  
```

>
> <https://github.com/explosion/spaCy/issues/1663>

* * *

> パスもやってみてうまくいきませんでしたが、下記のぺージを参考にコマンドを入力したら上手くいきました！！！
>
> <https://github.com/explosion/spaCy/issues/1721>
CC BY-SA 4.0
2020-05-03T15:04:25.397
66255
2020-05-03T15:04:25.397
2020-06-17T08:14:45.997
-1
26370
66233
answer