Вы можете сделать это так:
import numpy as np
import pandas as pd
import scipy.sparse
N = 40000
M = 1000000
df = pd.DataFrame(np.random.randint(0, N, size=(M, 4)), columns=list('ABCD'))
v = df['D'].values
sp = scipy.sparse.coo_matrix((np.ones_like(v), (np.arange(len(v)), v)), shape=[len(v), N])
print(sp.shape)
# (1000000, 40000)
print(sp.getnnz())
# 1000000
Проверьте nltk инструментарий, записанный в Python. Это имеет очень функциональный стеммер.
Другой опцией для стемминга был бы WordNet, наряду с одними из его API. Некоторая основная информация о стемминге и лемматизации, включая описание алгоритма стемминга Портера, может быть найдена онлайн во Введении в Информационный поиск.
Lucene имеет стеммер в, я верю (и IIRC, он позволяет Вам использовать свой собственный, если Вы хотите).
Править: Просто проверенный, и Lucence относится к сайту Снежка, который является библиотекой стемминга открытого исходного кода насколько я могу сказать.