はじめに

deepblueインターン生の中山です。
最近、言語処理のパッケージでSudachiをColaboratory上で使おうと勉強していました。ところが、SudachiPyのチュートリアルの実行段階で躓いてしまい、どうしたものかと困っていました。試行錯誤の結果、問題なく動いたので、方法について簡単にご説明します。
対処法については、本記事の後半にあるので、対処法について知りたい方は後半まで移動してください。

Sudachiとは

Sudachiは日本語形態素解析器です。
Sudachiが具体的にできることは、「テキスト分割」「品詞付与」「正規化処理」の三つの操作です。Sudachiの詳細については、GitHubをご確認ください。本記事では、Python版のSudachiPyを取り扱います(GitHub)。

発生したエラー

まず、最初にpipでインストールをしたのですが、インストールは問題なく実行できました。

!pip install sudachipy sudachidict_core

# Collecting sudachipy
#   Downloading SudachiPy-0.5.2.tar.gz (70 kB)
#      |████████████████████████████████| 70 kB 2.9 MB/s 
# Collecting sudachidict_core
#   Downloading SudachiDict-core-20210802.tar.gz (9.1 kB)
# Collecting sortedcontainers~=2.1.0
#   Downloading sortedcontainers-2.1.0-py2.py3-none-any.whl (28 kB)
# Collecting dartsclone~=0.9.0
#   Downloading dartsclone-0.9.0-cp37-cp37m-manylinux1_x86_64.whl (473 kB)
#      |████████████████████████████████| 473 kB 18.3 MB/s 
# Requirement already satisfied: Cython in /usr/local/lib/python3.7/dist-packages (from dartsclone~=0.9.0->sudachipy) (0.29.24)
# Building wheels for collected packages: sudachipy, sudachidict-core
#   Building wheel for sudachipy (setup.py) ... done
#   Created wheel for sudachipy: filename=SudachiPy-0.5.2-cp37-cp37m-linux_x86_64.whl size=870411 sha256=aabbaf3efe3232ea15128049cea9365e8b3dfd0bf87e08c1e91f67ea49492b51
#   Stored in directory: /root/.cache/pip/wheels/43/72/0f/1c62895bde30566c65602f15ddbfa0b2bbc273f8c43c190a45
#   Building wheel for sudachidict-core (setup.py) ... done
#   Created wheel for sudachidict-core: filename=SudachiDict_core-20210802-py3-none-any.whl size=71418512 sha256=6e80b658191ca18a1876fa2fb9feac4813f8f16278d817f905166244d9f98705
#   Stored in directory: /root/.cache/pip/wheels/91/e8/21/e80d212743835d87bb5e7eca81b6abef6d8cb67a294007a837
# Successfully built sudachipy sudachidict-core
# Installing collected packages: sortedcontainers, dartsclone, sudachipy, sudachidict-core
#   Attempting uninstall: sortedcontainers
#     Found existing installation: sortedcontainers 2.4.0
#     Uninstalling sortedcontainers-2.4.0:
#       Successfully uninstalled sortedcontainers-2.4.0
# Successfully installed dartsclone-0.9.0 sortedcontainers-2.1.0 sudachidict-core-20210802 sudachipy-0.5.2

しかし、ここからが問題で、tokenizerをインポートできませんでした。

from sudachipy import tokenizer

# ---------------------------------------------------------------------------
# ContextualVersionConflict                 Traceback (most recent call last)
# <ipython-input-4-123a89901eb3> in <module>()
# ----> 1 from sudachipy import tokenizer

# ――――――――――――――4 frames――――――――――――――――――――
# /usr/local/lib/python3.7/dist-packages/pkg_resources/__init__.py in resolve(self, requirements, env, installer, replace_conflicting, extras)
#     775                 # Oops, the "best" so far conflicts with a dependency
#     776                 dependent_req = required_by[req]
# --> 777                 raise VersionConflict(dist, req).with_context(dependent_req)
#     778 
#     779             # push the new requirements onto the stack

# ContextualVersionConflict: (sortedcontainers 2.4.0 (/usr/local/lib/python3.7/dist-packages), Requirement.parse('sortedcontainers~=2.1.0'), {'sudachipy'})

最後の箇所より、ContextualVersionConflictエラーが表示されていることがわかります。日本語に直すと、「コンテクストバージョンの衝突」です。「sortedcontainersというパッケージに問題があり、sortedcontainers~=2.1.0にして欲しい」と言っています。私が試したことは以下の通りです。

試したこと1: 中身の確認

上記エラーのContextualVersionConflict: (sortedcontainers 2.4.0 (/usr/local/lib/python3.7/dist-packages), Requirement.parse('sortedcontainers~=2.1.0'), {'sudachipy'})から、sortedcontainersが問題だとわかりました。そこで、sortedcontainersのバージョンを確認しました。

!pip show sortedcontainers

# Name: sortedcontainers
# Version: 2.1.0
# Summary: Sorted Containers -- Sorted List, Sorted Dict, Sorted Set
# Home-page: http://www.grantjenks.com/docs/sortedcontainers/
# Author: Grant Jenks
# Author-email: contact@grantjenks.com
# License: Apache 2.0
# Location: /usr/local/lib/python3.7/dist-packages
# Requires:
# Required-by: SudachiPy, intervaltree, distributed

VersionもLocationも問題ないように見えたため、疑問に思いました。

試したこと2: アンインストールして再インストール

どこか間違っている箇所があるのかなと思い、一度削除してやり直すことにしました。

!pip uninstall sortedcontainers
!pip install sortedcontainers==2.1.0

# Found existing installation: sortedcontainers 2.1.0
# Uninstalling sortedcontainers-2.1.0:
#   Would remove:
#     /usr/local/lib/python3.7/dist-packages/sortedcontainers-2.1.0.dist-info/*
#     /usr/local/lib/python3.7/dist-packages/sortedcontainers/*
# Proceed (y/n)? y
#   Successfully uninstalled sortedcontainers-2.1.0
# Collecting sortedcontainers==2.1.0
#   Using cached sortedcontainers-2.1.0-py2.py3-none-any.whl (28 kB)
# Installing collected packages: sortedcontainers
# Successfully installed sortedcontainers-2.1.0

上記を実行してもなお、from sudachipy import tokenizerの実行時にエラーが出てしまいました。その後も、何度かランタイムを出荷時設定にリセットし、実行を試みたのですが、上手くできずに困っていました。最終的には、上手いことできたので、そのプロセスを下記に示します。

対処法

実際の対処法についてご説明します。あくまで一例なので、ご留意ください。記事執筆現在は2021年8月16日です。

Step.0|ランタイムを出荷時設定にリセット

これは、実行途中の場合限定ですが、ランタイムを出荷時設定にリセットします。ランタイム > ランタイムを出荷時設定にリセットから実行できます。最初から実行している方や、既にリセットされている場合は、気にしなくて大丈夫です。

Step.1|インストールの実行

今まで通り、sudachipysudachidict_coreをインストールします。versionを指定する必要はないです。

!pip install sudachipy sudachidict_core

Step.2|ランタイムを再実行

続いて、ランタイムを再実行します。ランタイム > ランタイムを再実行から操作ができます。

Step.3|インポートの実行

最後に、今まで通りのインポートをします。

from sudachipy import tokenizer

全くエラーが出ず、実行ができました。色々試したわりには、ランタイムを再実行するだけで良かったのかと思いました。

さいごに

これで、Sudachiのチュートリアル実行時のContextualVersionConflictエラーについての説明はおしまいです。簡単に対処できるにも拘らず、私の技術不足のせいで手間取ってしまいました。お困りの方がいたら是非試してみてください。