У меня есть пять текстовых документов в каталоге, которые уже кластеризованы на основе их содержимого и названы так: cluster1.txt, cluster2.txt и т. Д., Так что они функционируют как мой корпус. В противном случае у них нет никаких ярлыков, они просто названы как таковые. Моя задача - сгруппировать новый текстовый документ с новыми предложениями, но не с целым документом в целом, вместо этого я должен сгруппировать каждое предложение в один из этих 5 кластеров или классов, а также составить путаницу с показателем отзыва и точности, чтобы показать насколько похожи предложения на кластеры.
Сначала я попытался сделать это с помощью kNN, а затем kmeans, но я думаю, что мои логики c имеют недостатки, так как это не проблема кластеризации, это классификация проблема, верно? Ну, по крайней мере, я попытался предварительно обработать текст (удалив стоп-слова, лемматизировать, использовать нижний регистр, разбить на лексемы), а затем я вычислил termfrequency с помощью countvectorizer, а затем tf-idf. У меня вроде есть проблемы с логи c с этой проблемой.
Во всяком случае, это то, что я пытался до сих пор, но теперь я вроде застрял, любая помощь приветствуется
import glob
import os
file_list = glob.glob(os.path.join(os.getcwd(), 'C:/Users/ds191033/FH/Praktikum/Testdaten/Clusters', "*.txt"))
corpus = []
for file_path in file_list:
with open(file_path, encoding="utf8") as f_input:
corpus.append(f_input.read())
stopwords = nltk.corpus.stopwords.words('german')
wpt = nltk.WordPunctTokenizer()
stop_words = nltk.corpus.stopwords.words('german')
lem = WordNetLemmatizer()
def normalize_document(doc):
# lower case and remove special characters\whitespaces
doc = re.sub(r'[^a-zA-Z\s]', '', doc, re.I|re.A)
doc = doc.lower()
tokens = wpt.tokenize(doc)
# filter stopwords out of document
filtered_tokens = [token for token in tokens if token not in stop_words]
#lemmatize
for w in filtered_tokens:
lemmatized_tokens = [lem.lemmatize(t) for t in filtered_tokens]
# re-create document from filtered tokens
doc = ' '.join(lemmatized_tokens)
return doc
normalize_corpus = np.vectorize(normalize_document)
norm_corpus = normalize_corpus(corpus)
norm_corpus
cv = CountVectorizer(min_df=0., max_df=1.)
cv_matrix = cv.fit_transform(norm_corpus)
cv_matrix = cv_matrix.toarray()
cv_matrix
# get all unique words in the corpus
vocab = cv.get_feature_names()
# show document feature vectors
pd.DataFrame(cv_matrix, columns=vocab)
from sklearn.feature_extraction.text import TfidfVectorizer
tv = TfidfVectorizer(min_df=0., max_df=1., use_idf=True)
tv_matrix = tv.fit_transform(norm_corpus)
tv_matrix = tv_matrix.toarray()
vocab = tv.get_feature_names()
pd.DataFrame(np.round(tv_matrix, 2), columns=vocab)