MehreenTahir Ответов: 0

Как вычислить 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 ().

0 Ответов