Многоуровневая классификация / кластеризация текста в python с помощью tf-idf - PullRequest
0 голосов
/ 28 января 2020

У меня есть пять текстовых документов в каталоге, которые уже кластеризованы на основе их содержимого и названы так: 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...