标签: tf-idf

使用Sql计算TF-IDF

我的数据库中有一个包含自由文本字段列的表.

我想知道每个单词出现在所有行上的频率,或者甚至可以为所有单词计算TF-IDF,其中我的文档是每行的字段值.

是否可以使用Sql查询来计算?如果没有或有更简单的方法,请指导我吗?

非常感谢,

乔恩

sql tf-idf sql-server-2008

6
推荐指数
1
解决办法
3898
查看次数

使用scikit-learn和hand计算的tf-idf矩阵值的差异

我正在玩scikit-learn找到tf-idf价值观.

我有一套documents像:

D1 = "The sky is blue."
D2 = "The sun is bright."
D3 = "The sun in the sky is bright."
Run Code Online (Sandbox Code Playgroud)

我想创建一个这样的矩阵:

   Docs      blue    bright       sky       sun
   D1 tf-idf 0.0000000 tf-idf 0.0000000
   D2 0.0000000 tf-idf 0.0000000 tf-idf
   D3 0.0000000 tf-idf tf-idf tf-idf
Run Code Online (Sandbox Code Playgroud)

所以,我的代码Python是:

import nltk
import string

from sklearn.feature_extraction.text import TfidfVectorizer
from nltk.corpus import stopwords

train_set = ["sky is blue", "sun is bright", "sun in the sky is bright"]
stop_words …
Run Code Online (Sandbox Code Playgroud)

python machine-learning matrix tf-idf

6
推荐指数
1
解决办法
1763
查看次数

用于标签预测的特征空间减少

我正在编写一个ML模块(python)来预测stackoverflow问题(标签+正文)的标签.我的语料库有大约500万个问题,每个问题都有标题,正文和标签.我正在将这个3:2分成训练和测试.我受到维度诅咒的困扰.


完成工作

  1. 预处理:删除标记,删除停用词,删除特殊字符以及一些零碎.存储到MySQL.这几乎使测试数据的大小减半.
  2. NGRAM协会:每个单字组和两字在标题和正文每个问题,我保持相关标签的列表.存入redis.这导致大约一百万个独特的unigrams和两千万个独特的双桅轮,每个都有相应的标签频率列表.防爆.

    "continuous integration": {"ci":42, "jenkins":15, "windows":1, "django":1, ....}
    
    Run Code Online (Sandbox Code Playgroud)

注意:这里有两个问题:a)并非所有的unigrams和bigrams都很重要,b)并非所有与ngram相关的标签都很重要,尽管这并不意味着频率为1的标签都是等效的或者可以随意删除.与给定ngram相关联的标签数量很容易达到成千上万 - 其中大多数不相关且无关紧要.

  1. tfidf:为了帮助选择要保留的ngram,我计算了每个unigram和bigram的整个语料库的tfidf分数,并将相应的idf值与相关标签一起存储.防爆.

    "continuous integration": {"ci":42, "jenkins":15, ...., "__idf__":7.2123}
    
    Run Code Online (Sandbox Code Playgroud)

    documentxfeature tfidf分数存储在sparse.csr_matrix中,我不知道如何才能利用它.(它由fit_transform()生成)


问题

  1. 如何使用此处理的数据来减小功能集的大小?我读过有关SVD和PCA的内容,但这些例子总是谈论一组文档和词汇.我不确定我的集合中的标签可以进入哪里.此外,我的数据存储方式(redis +稀疏矩阵),很难使用已经实现的模块(sklearn,nltk等)来执行此任务.
  2. 一旦功能集减少,我计划使用它的方式如下:

    • 预处理测试数据.
    • 找到unigrams和bigrams.
    • 对于存储在redis中的那些,找到相应的best-k标签
    • 对标题和正文应用某种权重
    • 除此之外,我还可以在文档中搜索确切的已知标记匹配.例如,如果标题/正文中出现"ruby-on-rails",那么它很可能也是一个相关标签.
    • 此外,对于以高概率预测的标签,我可能会利用标签图(带有标签的无向图,它们经常在它们之间具有加权边缘)来预测更多标签.

    关于如何改进这个有什么建议吗?分类器可以派上用场吗?


脚注

我有一台16核,16GB的RAM机器.redis-server(我将移动到另一台机器)存储在RAM中,大约为10GB.上面提到的所有任务(除了tfidf)都是使用ipython集群并行完成的.

python machine-learning feature-extraction tf-idf scikit-learn

6
推荐指数
1
解决办法
546
查看次数

使用sklearn计算两个不同列的单独tfidf分数

我正在尝试计算一组查询和每个查询的结果之间的相似度。我想使用tfidf分数和余弦相似度进行此操作。我遇到的问题是我无法弄清楚如何使用两列(在pandas数据框中)生成tfidf矩阵。我已经将两列连接起来,并且工作正常,但是使用起来很尴尬,因为它需要跟踪哪个查询属于哪个结果。我将如何一次计算两列的tfidf矩阵?我正在使用熊猫和sklearn。

以下是相关代码:

tf = TfidfVectorizer(analyzer='word', min_df = 0)
tfidf_matrix = tf.fit_transform(df_all['search_term'] + df_all['product_title']) # This line is the issue
feature_names = tf.get_feature_names() 
Run Code Online (Sandbox Code Playgroud)

我正在尝试将df_all ['search_term']和df_all ['product_title']作为参数传递给tf.fit_transform。这显然不起作用,因为它只是将字符串连接在一起,这使我无法将search_term与product_title进行比较。另外,也许有更好的方法来解决这个问题?

python tf-idf pandas scikit-learn

6
推荐指数
1
解决办法
2157
查看次数

ValueError:修剪后,没有剩余项。尝试较低的 min_df 或较高的 max_df

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer(max_df=0.95, max_features=200000,
                             min_df=.5, stop_words='english',
                             use_idf=True,sublinear_tf=True,tokenizer = tokenize_and_stem_body,ngram_range=(1,3))
tfidf_matrix_body = tfidf_vectorizer.fit_transform(totalvocab_stemmed_body)
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我错误

ValueError: After pruning, no terms remain. Try a lower min_df or a higher max_df.
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我解决相同的问题,并且我已将所有值 80 更改为 100 但问题仍然相同吗?

python feature-extraction tf-idf scikit-learn

6
推荐指数
1
解决办法
8901
查看次数

Pyspark - 对多个稀疏向量求和(CountVectorizer 输出)

我有一个包含约 30k 个独特文档的数据集,这些文档被标记,因为它们中有某个关键字。数据集中的一些关键字段是文档标题、文件大小、关键字和摘录(关键字周围 50 个字)。这些约 30k 个唯一文档中的每一个都有多个关键字,并且每个文档在数据集中每个关键字都有一行(因此,每个文档都有多行)。以下是原始数据集中关键字段的示例:

原始数据示例

我的目标是建立一个模型来标记某些事件(孩子们抱怨家庭作业等)的文档,因此我需要对关键字和摘录字段进行矢量化,然后将它们压缩,这样每个唯一文档就有一行。

仅使用关键字作为我要执行的操作的示例 - 我应用了 Tokenizer、StopWordsRemover 和 CountVectorizer,然后它们将输出一个带有计数矢量化结果的稀疏矩阵。一个稀疏向量可能类似于: sparseVector(158, {7: 1.0, 65: 1.0, 78: 2.0, 110: 1.0, 155: 3.0})

我想做两件事之一:

  1. 将稀疏向量转换为密集向量,然后我可以按 docID 分组并对每一列求和(一列 = 一个标记)
  2. 对稀疏向量直接求和(按 docID 分组)

为了让您了解我的意思 - 下图左侧是 CountVectorizer 输出的所需密集向量表示,左侧是我想要的最终数据集。

CountVectorizer 输出和所需数据集

python tf-idf apache-spark pyspark countvectorizer

6
推荐指数
1
解决办法
3448
查看次数

语料库大小较大或较小的 TF-IDF

“在大型语料库中使用 Tf-Idf 方法的本质是,所使用的语料库规模越大,术语的独特权重就越多。这是因为语料库中文档大小或文档长度的增加导致重复的概率较低。语料库中两个术语的权重值。也就是说,Tf-Idf 方案中的权重可以呈现权重的指纹。在小规模语料库中,Tf-Idf 可以\xe2\x80\x99t 发挥这种作用,因为存在巨大的潜力找到两个具有相同权重的术语,因为它们共享相同的源文档,并且在每个文档中的频率相同。通过在抄袭检测领域使用 Tf-Idf 加权方案,根据语料库的大小,此功能可以是对手和支持者。

\n

这是我从 tf-idf 技术中推断出来的..这是真的吗?

\n

有没有链接或者文档可以证明我的结论\xd8\x9f

\n

tf-idf

6
推荐指数
1
解决办法
1319
查看次数

gensim.corpora.Dictionary 是否保存了词频?

gensim.corpora.Dictionary 是否保存了词频?

gensim.corpora.Dictionary,可以获得单词的文档频率(即特定单词出现在多少文档中):

from nltk.corpus import brown
from gensim.corpora import Dictionary

documents = brown.sents()
brown_dict = Dictionary(documents)

# The 100th word in the dictionary: 'these'
print('The word "' + brown_dict[100] + '" appears in', brown_dict.dfs[100],'documents')
Run Code Online (Sandbox Code Playgroud)

[出去]:

The word "these" appears in 1213 documents
Run Code Online (Sandbox Code Playgroud)

还有一个filter_n_most_frequent(remove_n)函数可以删除第 n 个最常见的标记:

filter_n_most_frequent(remove_n) 过滤掉出现在文档中的“remove_n”最频繁的标记。

修剪后,缩小单词 id 中产生的间隙。

注意:由于间隔缩小,调用该函数前后,同一个词可能会有不同的词id!

filter_n_most_frequent函数是否根据文档频率或词频删除第 n 个最频繁的函数?

如果是后者,是否有某种方法可以访问gensim.corpora.Dictionary对象中单词的词频?

python dictionary frequency tf-idf gensim

6
推荐指数
1
解决办法
9876
查看次数

使用sklearn如何计算文档和查询之间的tf-idf余弦相似度?

我的目标是输入3个查询,并找出哪个查询与一组5个文档最相似。

到目前为止,我已经计算出tf-idf执行以下操作的文档:

from sklearn.feature_extraction.text import TfidfVectorizer

def get_term_frequency_inverse_data_frequency(documents):
    allDocs = []
    for document in documents:
        allDocs.append(nlp.clean_tf_idf_text(document))
    vectorizer = TfidfVectorizer()
    matrix = vectorizer.fit_transform(allDocs)
    return matrix

def get_tf_idf_query_similarity(documents, query):
    tfidf = get_term_frequency_inverse_data_frequency(documents)
Run Code Online (Sandbox Code Playgroud)

我现在遇到的问题是我拥有tf-idf文档,我对该查询执行哪些操作,以便可以找到与文档的余弦相似度?

python tf-idf cosine-similarity scikit-learn

6
推荐指数
1
解决办法
1368
查看次数

为什么 sklearn tf-idf 矢量器给停用词最高分?

我使用 sklearn 为 nltk 库中 Brown 语料库的每个类别实现了 Tf-idf。有 15 个类别,每个类别的最高分都分配给一个停用词。

默认参数是use_idf=True,所以我使用 idf 。语料库足够大,可以计算出正确的分数。所以,我不明白 - 为什么停用词被赋予高值?

import nltk, sklearn, numpy
import pandas as pd
from nltk.corpus import brown, stopwords
from sklearn.feature_extraction.text import TfidfVectorizer

nltk.download('brown')
nltk.download('stopwords')

corpus = []
for c in brown.categories():
  doc = ' '.join(brown.words(categories=c))
  corpus.append(doc)

thisvectorizer = TfidfVectorizer()
X = thisvectorizer.fit_transform(corpus)
tfidf_matrix = X.toarray()
features = thisvectorizer.get_feature_names_out()

for array in tfidf_matrix:
  tfidf_per_doc = list(zip(features, array))
  tfidf_per_doc.sort(key=lambda x: x[1], reverse=True)
  print(tfidf_per_doc[:3])
Run Code Online (Sandbox Code Playgroud)

结果是:

[('the', 0.6893251240111703), ('and', 0.31175508121108203), ('he', 0.24393467757919754)] …
Run Code Online (Sandbox Code Playgroud)

python nltk tf-idf scikit-learn tfidfvectorizer

6
推荐指数
1
解决办法
1064
查看次数