Я использую данные, представленные в виде разреженной матрицы, где столбец содержит числовые значения для "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 ().