Как вычислить tf-IDF, используя топ-100 вхождений в vocabluary?
Я использую данные, представленные в виде разреженной матрицы, где столбец содержит числовые значения для "article_Id", "word_id" и "count" следующим образом:
article_Id word_id count 0 1 3 1 1 1 10 1 2 1 12 8 3 1 17 1 4 1 23 8
Я представляю каждый документ векторами TF-IDF из 100 лучших координат. Затем я произвольно выбираю подмножество из 200 документов и вычисляю сходство этих 200 документов.
Далее, задача состоит в том, чтобы хранить tf-idf в размерной матрице 1000 x 100. Здесь 1000-это количество документов, а 100-это топ-100 наиболее часто встречающихся слов. Эти слова будут разными для каждого документа, поэтому мы должны выбрать 100 лучших слов из всего словаря (все документы вместе взятые) и вычислить tf-idf этих слов только для каждого документа.
Поскольку tf-idf рассчитывается отдельно для документов, я не могу получить его для топ-100 вхождений из всего словаря. Есть идеи?
Что я уже пробовал:
Вот как выглядит мой код прямо сейчас.
word_ids = [] article_ids = [] data = {} document_word_counters = [0] * 1000 word_articles = {} with open("C:/Users/Mehreen/Desktop/Dataset/20 newsgroups data/data50.csv","r") as f: for line in f.readlines(): line_arr = line.split(',') word_ids.append(int(line_arr[1])) if line_arr[1] not in word_articles: word_articles[line_arr[1]] = 1 else: word_articles [line_arr[1]] += 1 if line_arr[0] not in data: article_ids.append(int(line_arr[0])) data[line_arr[0]] = {} document_word_counters[int(line_arr[0]) - 1] = int(line_arr[2]) article = data[line_arr[0]] document_word_counters[int(line_arr[0]) - 1] += int(line_arr[2]) article[line_arr[1]] = int(line_arr[2])
Вот что я делаю, чтобы вычислить tf-idf.
word_ids = np.unique(word_ids).tolist() document_vectors = [] for article in article_ids: if str(article) in data: document_vector = [] article_data = data[str(article)] document_vector = [0] * len(word_ids) for key, value in article_data.items(): index = word_ids.index(int(key)) tf = value/ document_word_counters[article-1] idf = 1000 / word_articles[key] # print (' so its tf becomes %f and idf %f' %(tf,idf)) document_vector[index] = tf * idf document_vectors.append(np.sort(document_vector)[::-1]) tf_idf_matrices = [] for k in range(100): document_count = 0 tf_idf_matrix = [[0] * len(word_ids)] * 1000 for document_vector in document_vectors: tf_idf_matrix[document_count] = document_vector[:k] document_count+=1 tf_idf_matrices.append(tf_idf_matrix)
а позже случайная выборка может быть легко выбрана с помощью функции random.sample ().