У меня есть фрейм данных pandas с предложениями, по которым я пытаюсь вычислить Tfidf:
df['sentence'] = ['buy donuts', 'buy donuts', 'buy donuts', 'buy donuts', 'buy donuts', 'buy donuts', 'buy donuts', 'buy donuts', 'buy donuts', 'buy donuts', 'purchase donuts', 'purchase donuts', 'purchase donuts', 'purchase donuts', 'purchase donuts', 'buy donut', 'buy a donut', 'buy 2 donuts', 'buy 2 donuts', 'buy 2 donuts', 'buy 12 donuts', 'buy 12 donuts', 'buy 12 donuts', 'purchase 2 donuts', 'purchase 12 donuts', 'i want to buy 2 donuts', 'i want to buy 12 donuts', 'i want to buy donuts', 'i want to buy some donuts', 'buy some donuts', 'buy two donuts', 'buy two donuts', 'buy two donuts', 'buy twelve donuts', 'buy twelve donuts', 'buy twelve donuts', 'purchase two donuts', 'purchase twelve donuts', 'i want to buy two donuts', 'i want to buy twelve donuts']
Сначала я лемматизирую эти предложения (код ниже), а затем передаю лемматизированный список в tfidfvectorizer Склеарна.
Тем не менее, я заметил странную аномалию, когда некоторые термины не включены в качестве функций, хотя min_df и max_df установлены в значения по умолчанию, чтобы включить все термины. Когда я запускаю get_feature_names (), каждый термин указывается как функция, кроме «i», «a» и «2»:
['12', 'buy', 'donut', 'purchase', 'some', 'to', 'twelve', 'two', 'want']
Я не удаляю стоп-слова. Для моих целей «2» очень выделяет, есть ли минимальная длина термина для объектов в tfidfvectorizer? Как я могу включить эти условия в функции?
nlp = spacy.load("en", disable=['ner'])
vect = TfidfVectorizer(binary=True)
## Load in data
df = pd.read_csv('buy donuts.csv', encoding='utf-8')
df.columns = df.columns.str.lower()
## Normalize sentences
df['sentence'] = df['sentence'].str.replace(r"[^\w\s']", '').str.lower().str.strip().replace('', np.nan)
df = df.dropna(subset=['unit name', 'sentence'])
## Get lemmas for tfidf
def lemmas(x):
docs = nlp(x)
sents_lemma = [token.lemma_ for token in docs]
return ' '.join(sents_lemma)
df['lemmas'] = df.index.map(df['sentence'].apply(lemmas))
## Get tfidf and calculate scores
tfidf = vect.fit_transform(df.lemmas.values.tolist())
scores = ((tfidf * tfidf.T).A).mean(axis=0)
print(vect.get_feature_names())