Включая категорические особенности наряду с текстом в словесном подходе - Python

Мои данные имеют сочетание текстовых и категориальных особенностей. Это выглядит как:

cr_id   description                  business type                       status
    1   More robust system required secured loan    system  rejected
    2   More robust system required secured loan    system  rejected
    3   grant access to all products    mortgage    system  rejected
    4   EDAP Scenario   secured loan    regulatory           accepted
    5   grant access to all products    secured loan    regulatory  accepted

Теперь в столбце описания я применяю подход word2vec. В результате я получаю обученный вектор из 300 столбцов. Теперь мой вопрос: как включить в модель и категориальные особенности? Я имею в виду, как объединить вывод word2vec и однозначно закодированных векторов, поскольку они имеют разную форму. Код, используемый для формирования wordvec:

def review_to_wordlist(review, remove_stopwords=False):
    """
    Convert a review to a list of words. Removal of stop words is optional.
    """
    # remove non-letters
    review_text = re.sub("[^a-zA-Z]"," ", review)

    # convert to lower case and split at whitespace
    words = review_text.lower().split()

    # remove stop words (false by default)
    if remove_stopwords:
        stops = set(stopwords.words("english"))
        words = [w for w in words if not w in stops]

    return words

def review_to_sentences(review, tokenizer, remove_stopwords=False):
    """
    Split review into list of sentences where each sentence is a list of words.
    Removal of stop words is optional.
    """
    # use the NLTK tokenizer to split the paragraph into sentences
    raw_sentences = tokenizer.tokenize(review.strip())

    # each sentence is furthermore split into words
    sentences = []    
    for raw_sentence in raw_sentences:
        # If a sentence is empty, skip it
        if len(raw_sentence) > 0:
            sentences.append(review_to_wordlist(raw_sentence, remove_stopwords))

    return sentences

train_sentences = []  # Initialize an empty list of sentences
for review in data['description']:
    train_sentences += review_to_sentences(review, tokenizer)

model_name = 'train_model'
# Set values for various word2vec parameters
num_features = 300    # Word vector dimensionality                      
min_word_count = 3   # Minimum word count                        
num_workers = 3       # Number of threads to run in parallel
context = 10          # Context window size
downsampling = 1e-3   # Downsample setting for frequent words
print 1
if not os.path.exists(model_name): 
    # Initialize and train the model (this will take some time)
    model = word2vec.Word2Vec(train_sentences, workers=num_workers, \
                size=num_features, min_count = min_word_count, \
                window = context, sample = downsampling)
    print 10
    # If you don't plan to train the model any further, calling 
    # init_sims will make the model much more memory-efficient.
    model.init_sims(replace=True)

    # It can be helpful to create a meaningful model name and 
    # save the model for later use. You can load it later using Word2Vec.load()
    model.save(model_name)
else:
    print 11
#     model = Word2Vec.load(model_name)
    model=KeyedVectors.load(model_name)

def make_feature_vec(words, model, num_features):
    """
    Average the word vectors for a set of words
    """
    feature_vec = np.zeros((num_features,),dtype="float32")  # pre-initialize (for speed)
    nwords = 0
    index2word_set = set(model.wv.index2word)  # words known to the model

    for word in words:
        if word in index2word_set: 
            nwords = nwords + 1.
            feature_vec = np.add(feature_vec,model[word])

    feature_vec = np.divide(feature_vec, nwords)
    return feature_vec


def get_avg_feature_vecs(reviews, model, num_features):
    """
    Calculate average feature vectors for all reviews
    """
    counter = 0
    review_feature_vecs = np.zeros((len(reviews),num_features), dtype='float32')  # pre-initialize (for speed)

    for review in reviews:
        review_feature_vecs[counter] = make_feature_vec(review, model, num_features)
        counter = counter + 1
    return review_feature_vecs

clean_train_reviews = []
for review in data['description']:
    clean_train_reviews.append(review_to_wordlist(review, remove_stopwords=True))
trainDataVecs = get_avg_feature_vecs(clean_train_reviews, model, num_features)

Теперь я могу использовать эти обученные данные для любого классификатора для прогнозирования статуса. Теперь, как указано выше, я запутался, как включить / добавить категориальные особенности, такие как type, с trainingDataVecs, поскольку они имеют разные формы.

Изменить: Как требуется, чтобы лучше понять проблему, trainDatavecs выглядит следующим образом:

array([[-0.02591809, -0.04678563, -0.0401891 , ..., -0.00907444,
        -0.02070936, -0.02332937],
       [ 0.00098296, -0.00293253,  0.04667222, ...,  0.00685261,
        -0.01234391, -0.03822058],
       [ 0.01843361, -0.01345504, -0.01359649, ..., -0.04710409,
         0.04892955,  0.02135875],
       ...,
       [ 0.0304883 ,  0.08515919,  0.01928426, ..., -0.00903708,
        -0.00333895,  0.07550056],
       [ 0.01843361, -0.01345504, -0.01359649, ..., -0.04710409,
         0.04892955,  0.02135875],
       [ 0.01843361, -0.01345504, -0.01359649, ..., -0.04710409,
         0.04892955,  0.02135875]], dtype=float32)

Его размеры (40, 300) и входные данные обучения имеют размерность (40,5). 300 столбцов идут из числа аргументов функции.

1 ответ

Похоже trainDataVecs это просто numpy матрица. Вы можете создать макеты и попробовать объединить их.

dummies = pd.get_dummies(df['business type']).iloc[:, 1:] # take n-1 columns
dummies = dummies.as_matrix()
X = np.concatenate((trainDataVecs, dummies), axis=1)
  1. Dummify колонны

  2. Создайте numpy матрица

  3. Объединить их по столбцам axis

Замечания:

Там может быть проблема измерения. Пожалуйста, напишите, как trainDataVecs будет выглядеть в этом случае, и я могу обновить, чтобы отразить.

Другие вопросы по тегам