LIME не использует векторизованные слова для объяснения модели классификации - PullRequest
0 голосов
/ 06 февраля 2020

Я пробовал этот урок с текстовыми данными на моем родном языке - японском. https://marcotcr.github.io/lime/tutorials/Lime%20-%20multiclass.html

Я в основном следовал этому уроку, так как он был за исключением добавления токенизатора для разделения каждого предложения на словари.

Я пропустил некоторые слова с использованием регулярных выражений как слово, содержащее числа при токенизации.

Мой токенайзер:

import MeCab

def mecabing(text):

    jisho = '-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd'
    mecab = MeCab.Tagger(jisho)

    mecab.parse('')
    select_conditions = ['名詞'] #selecting only nouns

    node= mecab.parseToNode(text)
    mecab_list = []
    while node:

        word = node.surface
        pos = node.feature.split(",")
        #print(word, pos)
        node = node.next
        #test3.append(TaggedDocument(word, which))
        if pos[0] in select_conditions and pos[1] != '非自立':
            if bool(re.search(r'[0-9]', word)) == False: #skip a word containing numbers
                mecab_list.append(word)
    return(mecab_list)

И когда я нажимаю

vectorizer = sklearn.feature_extraction.text.TfidfVectorizer(analyzer=mecabing)
train_vectors = vectorizer.fit_transform(df["text"].values.astype('U'))
print(vectorizer.vocabulary_)

, я могу получить список слов с токенизацией и векторизацией правильно, который используется для обучения модели классификации sklearn.naive_bayes.MultinominalNB.

Я поместил эту обученную модель в lime.lime_text.LimeTextExplainer и показал результат.

exp = explainer.explain_instance(df["text"][idx], NBmodel.predict_proba, num_features=6, labels=[0, 2])
print ('\n'.join(map(str, exp.as_list(label=0))))

Но результат показывает больше, чем токенизированный словарь - иногда он содержит предложение.

Например, результат такой, как показано ниже.

('ファミ通を発行しているエンターブレインと同じビル', 0.006904584676500223)
('ボーン30', 0.006423075274125261)
('平均1500ポリゴン', 0.006027007490568979)
('半蔵門', 0.005345011950591051)
('PSP', 0.005324184348436766)
('キャラモデル', 0.0052622796379719755)

Верхнее предложение - это предложение, которое должно быть размечено на 5 слов, а также несколько слов. содержат в себе числа - предложение или слова с числами не могут быть найдены в vectorizer.vocabulary_.

Я не понимаю, почему это происходит. Любые советы будут оценены.

...