Sklearn TfIdfVectorizer удаляет документы, содержащие все стоп-слова - PullRequest
0 голосов
/ 07 марта 2019

Я использую sklearn TfIdfVectorizer для векторизации моего корпуса. В моем анализе есть некоторый документ, в котором все термины отфильтрованы из-за того, что он содержит все стоп-слова. Чтобы уменьшить проблему редкости и поскольку бессмысленно включать их в анализ, я бы хотел ее устранить.

В документе TfIdfVectorizer нет параметров, которые можно было бы установить для этого. Поэтому я думаю удалить это вручную, прежде чем передать корпус в векторизатор. Однако это может привести к потенциальной проблеме, заключающейся в том, что полученные мной стоп-слова не совпадают со списком, используемым векторизатором, поскольку я также использую опции min_df и max_df для фильтрации терминов.

Есть ли лучший способ добиться того, что я ищу (т.е. удалить / игнорировать документ, содержащий все стоп-слова)?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Вы можете:

  1. указать свои слова и затем, после TfidfVecorizer
  2. отфильтровать пустые строки

Следующий фрагмент кода показываетупрощенный пример, который должен направить вас в правильном направлении:

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["aa ab","aa ab ac"]
stop_words = ["aa","ab"]

tfidf = TfidfVectorizer(stop_words=stop_words)
corpus_tfidf = tfidf.fit_transform(corpus)
idx = np.array(corpus_tfidf.sum(axis=1)==0).ravel()
corpus_filtered = corpus_tfidf[~idx]

Не стесняйтесь задавать вопросы, если они у вас еще есть!

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

Итак, вы можете использовать это:

import nltk
from sklearn.feature_extraction.text import TfidfVectorizer

def tokenize(text):
    # first tokenize by sentence, then by word to ensure that punctuation is caught as it's own token
    tokens = [word for sent in nltk.sent_tokenize(text) for word in nltk.word_tokenize(sent)]
    filtered_tokens = []
    # filter out any tokens not containing letters (e.g., numeric tokens, raw punctuation)
    punctuations="?:!.,;'�۪"
    for token in tokens:
        if token in punctuations:
            tokens.remove(token)
        if re.search('[a-zA-Z0-9]', token):
            filtered_tokens.append(token)

    st = ' '.join(filtered_tokens)
    return st
tokenize(data)

tfidf_vectorizer = TfidfVectorizer(max_df=0.8,min_df=0.01,stop_words='english',
    use_idf=True,tokenizer=tokenize)

tfidf_matrix = tfidf_vectorizer.fit_transform(df['text'])
ids = np.array(tfidf_matrix.sum(axis=1)==0).ravel()
tfidf_filtered = tfidf_matrix[~ids]

Таким образом, вы можете удалить stopwords, empty rows и использовать min_df и max_df.

...