sklearn TfidfVectorizer: как сделать несколько слов, чтобы быть только частью биграммы в функциях - PullRequest
2 голосов
/ 14 марта 2019

Я хочу, чтобы при настройке TfidfVectorizer учитывались некоторые предопределенные слова, такие как "script", "rule",, которые будут использоваться только в биграммах.

Если у меня есть текст "Script include is a script that has rule which has a business rule"

для вышеприведенноготекст, если я использую

tfidf = TfidfVectorizer(ngram_range=(1,2),stop_words='english')

я должен получить

['script include','business rule','include','business']

Ответы [ 3 ]

2 голосов
/ 14 марта 2019
from sklearn.feature_extraction import text 
# Given a vocabulary returns a filtered vocab which
# contain only tokens in include_list and which are 
# not stop words
def filter_vocab(full_vocab, include_list):
    b_list = list()
    for x in full_vocab:
        add = False
        for t in x.split():
            if t in text.ENGLISH_STOP_WORDS:
                add = False
                break
            if t in include_list:
                add = True
        if add:
            b_list.append(x)
    return b_list

# Get all the ngrams (one can also use nltk.util.ngram)
ngrams = TfidfVectorizer(ngram_range=(1,2), norm=None, smooth_idf=False, use_idf=False)
X = ngrams.fit_transform(["Script include is a script that has rule which has a business rule"])
full_vocab = ngrams.get_feature_names()

# filter the full ngram based vocab
filtered_v = filter_vocab(full_vocab,["include", "business"])

# Get tfidf using the new filtere vocab
vectorizer = TfidfVectorizer(ngram_range=(1,2), vocabulary=filtered_v)
X = vectorizer.fit_transform(["Script include is a script that has rule which has a business rule"])
v = vectorizer.get_feature_names()
print (v)

Код прокомментирован, чтобы объяснить, что он делает

0 голосов
/ 15 марта 2019

В основном вы ищете для настройки создания n_grams на основе ваших специальных слов (я называю это как interested_words в функции).Я настроил функцию создания n_grams по умолчанию для вашей цели.

def custom_word_ngrams(tokens, stop_words=None, interested_words=None):
    """Turn tokens into a sequence of n-grams after stop words filtering"""

    original_tokens = tokens
    stop_wrds_inds = np.where(np.isin(tokens,stop_words))[0]
    intersted_wrds_inds = np.where(np.isin(tokens,interested_words))[0]

    tokens = [w for w in tokens if w not in stop_words+interested_words] 

    n_original_tokens = len(original_tokens)

    # bind method outside of loop to reduce overhead
    tokens_append = tokens.append
    space_join = " ".join

    for i in xrange(n_original_tokens - 1):
        if  not any(np.isin(stop_wrds_inds, [i,i+1])):
            tokens_append(space_join(original_tokens[i: i + 2]))

    return tokens

Теперь мы можем подключить эту функцию внутри обычного анализатора TfidfVectorizer следующим образом!

import numpy as np
from sklearn.externals.six.moves import xrange
from sklearn.feature_extraction.text import  TfidfVectorizer,CountVectorizer
from sklearn.feature_extraction import  text


def analyzer():
    base_vect = CountVectorizer()
    stop_words = list(text.ENGLISH_STOP_WORDS)
    preprocess = base_vect.build_preprocessor()
    tokenize = base_vect.build_tokenizer()

    return lambda doc: custom_word_ngrams(
        tokenize(preprocess(base_vect.decode(doc))), stop_words, ['script', 'rule']) 
    #feed your special words list here

vectorizer = TfidfVectorizer(analyzer=analyzer())
vectorizer.fit(["Script include is a script that has rule which has a business rule"])
vectorizer.get_feature_names()

['business', 'бизнес-правило ',' include ',' script include ']

0 голосов
/ 14 марта 2019

TfidfVectorizer позволяет вам предоставить свой собственный токенизатор, вы можете сделать что-то вроде ниже. Но вы потеряете информацию из других слов в словаре.

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["Script include is a script that has rule which has a business rule"]

vectorizer = TfidfVectorizer(ngram_range=(1,2),tokenizer=lambda corpus: [ "script", "rule"],stop_words='english')
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())
...