存储Tf-idf矩阵并更新熊猫中新文章上的现有矩阵

时间:2018-08-01 12:51:14

标签: python python-3.x pandas tf-idf tfidfvectorizer

我有一个熊猫数据框,其中列$interval.cancel(myInterval);text组成。给出为:-

news articles

我计算出商品的Tf-IDF值为:-

text
article1
article2
article3
article4

由于我的数据框不时更新。因此,假设在将of-if计算为matrix_1之后,我的数据框得到了更多文章的更新。像这样:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
matrix_1 = tfidf.fit_transform(df['text'])

由于我有数以百万计的文章,因此我想存储所有上一篇文章的tf-IDF矩阵,并使用新文章的tf-IDF分数对其进行更新。一次又一次地为所有文章运行of-IDF代码会占用大量内存。有什么办法可以执行此操作?

1 个答案:

答案 0 :(得分:0)

我还没有测试过这段代码,但是我认为这应该可行。

import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer

df = pd.DataFrame()
while True:
    if not len(df):
        # When you dataframe is populated for the very first time
        tfidf = TfidfVectorizer()
        matrix_1 = tfidf.fit_transform(df['text'].iloc[last_len:])
        last_len = len(df)
    else:
        # When you dataframe is populated again and again
        # If you have to use earlier fitted model
        matrix_1 = np.vstack(matrix_1, tfidf.transform(df['text'].iloc[last_len:]))
        # If you have to update tf-idf every time which is kinda doesn't make sense
        matrix_1 = np.vstack(matrix_1, tfidf.fit_transform(df['text'].iloc[last_len:]))
        last_len = len(df)

    # TO-DO Some break condition according to your case
    #####

如果两次数据框更新之间的持续时间长于您可以在matrix_1上使用pickle来存储中间结果的时间。

但是我感觉在不同的输入上反复使用tfidf.fit_transform(df['text'])并不会给您任何有意义的结果,或者可能是我误解了。干杯!