将文本语料库转换为带有词汇ID和相应TF-IDF分数的文本文档

我有一个包含5个文档的文本语料库,每个文档之间用/n分隔。我希望为文档中的每个词提供一个ID,并计算其相应的tfidf分数。例如,假设我们有一个名为”corpus.txt”的文本语料库,如下所示:

“Stackover flow text vectorization scikitpython scipy sparse csr”在计算tfidf时使用

mylist =list("corpus.text")vectorizer= CountVectorizerx_counts = vectorizer_train.fit_transform(mylist) tfidf_transformer = TfidfTransformer()x_tfidf = tfidf_transformer.fit_transform(x_counts)

输出结果是

(0,12) 0.1234 #for 1st document(1,8) 0.3456  #for 2nd  document(1,4) 0.8976(2,15) 0.6754 #for third document(2,14) 0.2389(2,3) 0.7823(3,11) 0.9897 #for fourth document(3,13) 0.8213(3,5) 0.7722(3,6) 0.2211(4,7) 0.1100 # for fifth document(4,10) 0.6690(4,2) 0.0912(4,9) 0.2345(4,1) 0.1234

我将这个scipy.sparse.csr矩阵转换为列表的列表,以去除文档ID,只保留词汇ID及其相应的tfidf分数,使用以下方法:

m = x_tfidf.tocoo()mydata = {k: v for k, v in zip(m.col, m.data)} key_val_pairs = [str(k) + ":" + str(v) for k, v in mydata.items()] 

但问题是,我得到的输出中,词汇ID及其相应的tfidf分数按升序排列,并且没有与文档的任何引用。

例如,对于上述给定的语料库,我的当前输出(我已经使用json转储到文本文件中)看起来像这样:

1:0.12342:0.09123:0.78234:0.89765:0.77226:0.22117:0.11008:0.34569:0.234510:0.669011:0.989712:0.123413:0.821314:0.238915:0.6754

而我希望我的文本文件看起来如下所示:

12:0.12348:0.3456 4:0.897615:0.1234 14:0.2389 3:0.782311:0.9897 13:0.8213 5:0.7722 6:0.22117:0.1100 10:0.6690 2:0.0912 9:0.2345 1:0.1234

有什么办法可以实现吗?


回答:

我想这就是你需要的。这里corpus是一组文档的集合。

from sklearn.feature_extraction.text import TfidfVectorizercorpus = ["stack over flow stack over flow text vectorization scikit", "stack over flow"]vectorizer = TfidfVectorizer()x = vectorizer.fit_transform(corpus) # corpus是文档的集合print(vectorizer.vocabulary_) # 词汇项及其索引print(x) # 每个术语所属特定文档的tf-idf权重

这将打印:

{'vectorization': 5, 'text': 4, 'over': 1, 'flow': 0, 'stack': 3, 'scikit': 2}  (0, 2)    0.33195438857 # 第一份文档,词 = scikit  (0, 5)    0.33195438857 # 词 = vectorization  (0, 4)    0.33195438857 # 词 = text  (0, 0)    0.472376562969 # 词 = flow  (0, 1)    0.472376562969 # 词 = over  (0, 3)    0.472376562969 # 词 = stack  (1, 0)    0.57735026919 # 第二份文档  (1, 1)    0.57735026919  (1, 3)    0.57735026919

从这些信息中,你可以按以下方式以你希望的方式表示文档:

cx = x.tocoo()doc_id = -1for i,j,v in zip(cx.row, cx.col, cx.data):    if doc_id == -1:        print(str(j) + ':' + "{:.4f}".format(v), end=' ')    else:        if doc_id != i:            print()        print(str(j) + ':' + "{:.4f}".format(v), end=' ')    doc_id = i

这将打印:

2:0.3320 5:0.3320 4:0.3320 0:0.4724 1:0.4724 3:0.4724 0:0.5774 1:0.5774 3:0.5774

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注