Как вычислить tf-IDF, используя топ 100 вхождений в словаре? - PullRequest
0 голосов
/ 22 марта 2020

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

...