Я использовал векторизацию td-idf для извлечения объектов в задаче классификации текста, и теперь я хочу найти определенные извлеченные объекты. Есть ли способ развить функциональность поиска, используя python или любой другой инструмент для этих извлеченных функций? Я использовал facebook fasttext для поддержки словаря и td-idf для извлечения функций. тогда объединение объектов используется в конвейере. Теперь я хочу найти эти объекты (специфичные для одного или всего вектора. Так есть ли возможность сделать это? Вот код, который я использовал для извлечения объектов. Спасибо
from nltk.tokenize import word_tokenize
alltext = pd.concat([training_set.scrape_text, test_set.scrape_text])
alltext.shape
rows = []
for row in alltext.values:
rows.append(word_tokenize(row))
model = gensim.models.FastText(rows, size=100, window=4, min_count=2, iter=10)
#NLP pipeline
import re
from nltk.stem import SnowballStemmer
from sklearn.feature_extraction.text import TfidfVectorizer
from collections import defaultdict
class TfidfEmbeddingVectorizer(object):
def __preprocess(self, row):
#print("TfidfEmbeddingVectorizer __preprocess begin")
cleanr = re.compile('<.*?>')
cleantext = re.sub(cleanr, ' ', str(row))
cleaned = cleantext.replace("\n"," ").strip()
alpha_sent = ""
for word in cleaned.split():
alpha_word = re.sub('[^a-z A-Z]+', ' ', word)
alpha_sent += self.stemmer.stem(alpha_word)
#alpha_sent += lemmatizer.lemmatize(alpha_word)
alpha_sent += " "
alpha_sent = alpha_sent.strip()
return alpha_sent
def __tokenize(self, row):
return word_tokenize(row)
def __init__(self, model):
self.model = model
self.model2weight = None
self.dim = model.vector_size
self.stemmer = SnowballStemmer("english")
def fit(self, X, y):
print("TfidfEmbeddingVectorizer fit begin")
tfidf = TfidfVectorizer(analyzer=lambda x: x)
preprocessed_X = []
for row in X:
preprocessed_X.append(self.__tokenize(self.__preprocess(row)))
preprocessed_X = np.array(preprocessed_X)
tfidf.fit(preprocessed_X)
max_idf = max(tfidf.idf_)
self.model2weight = defaultdict(
lambda: max_idf,
[(w, tfidf.idf_[i]) for w, i in tfidf.vocabulary_.items()])
print("TfidfEmbeddingVectorizer fit end")
return self
def transform(self, X):
preprocessed_X = []
for row in X:
preprocessed_X.append(self.__tokenize(self.__preprocess(row)))
preprocessed_X = np.array(preprocessed_X)
return np.array([
np.mean([self.model[w] * self.model2weight[w]
for w in words if w in self.model], axis=0)
for words in preprocessed_X
])
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.pipeline import Pipeline, FeatureUnion
from xgboost import XGBClassifier
from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier, GradientBoostingClassifier, VotingClassifier
pipeline = Pipeline([
('feats', FeatureUnion([
('vec', TfidfVectorizer(preprocessor=preprocessor,
tokenizer=word_tokenize,
analyzer='word',
lowercase=True,
strip_accents='unicode',
stop_words='english',
ngram_range=(1,2)
))
])),
('voting', VotingClassifier(estimators=[("rf1", RandomForestClassifier(n_jobs=1)),
("gb", GradientBoostingClassifier()),
("et", ExtraTreesClassifier(n_jobs=1)),
("xgb",XGBClassifier(nthread= 4, learning_rate=0.08, n_estimators=1000, max_depth=10))
],
voting='soft',
])