我的数据库中有一个包含自由文本字段列的表.
我想知道每个单词出现在所有行上的频率,或者甚至可以为所有单词计算TF-IDF,其中我的文档是每行的字段值.
是否可以使用Sql查询来计算?如果没有或有更简单的方法,请指导我吗?
非常感谢,
乔恩
我正在玩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) 我正在编写一个ML模块(python)来预测stackoverflow问题(标签+正文)的标签.我的语料库有大约500万个问题,每个问题都有标题,正文和标签.我正在将这个3: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相关联的标签数量很容易达到成千上万 - 其中大多数不相关且无关紧要.
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()生成)
一旦功能集减少,我计划使用它的方式如下:
关于如何改进这个有什么建议吗?分类器可以派上用场吗?
我有一台16核,16GB的RAM机器.redis-server(我将移动到另一台机器)存储在RAM中,大约为10GB.上面提到的所有任务(除了tfidf)都是使用ipython集群并行完成的.
python machine-learning feature-extraction tf-idf scikit-learn
我正在尝试计算一组查询和每个查询的结果之间的相似度。我想使用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进行比较。另外,也许有更好的方法来解决这个问题?
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 但问题仍然相同吗?
我有一个包含约 30k 个独特文档的数据集,这些文档被标记,因为它们中有某个关键字。数据集中的一些关键字段是文档标题、文件大小、关键字和摘录(关键字周围 50 个字)。这些约 30k 个唯一文档中的每一个都有多个关键字,并且每个文档在数据集中每个关键字都有一行(因此,每个文档都有多行)。以下是原始数据集中关键字段的示例:
我的目标是建立一个模型来标记某些事件(孩子们抱怨家庭作业等)的文档,因此我需要对关键字和摘录字段进行矢量化,然后将它们压缩,这样每个唯一文档就有一行。
仅使用关键字作为我要执行的操作的示例 - 我应用了 Tokenizer、StopWordsRemover 和 CountVectorizer,然后它们将输出一个带有计数矢量化结果的稀疏矩阵。一个稀疏向量可能类似于: sparseVector(158, {7: 1.0, 65: 1.0, 78: 2.0, 110: 1.0, 155: 3.0})
我想做两件事之一:
为了让您了解我的意思 - 下图左侧是 CountVectorizer 输出的所需密集向量表示,左侧是我想要的最终数据集。
“在大型语料库中使用 Tf-Idf 方法的本质是,所使用的语料库规模越大,术语的独特权重就越多。这是因为语料库中文档大小或文档长度的增加导致重复的概率较低。语料库中两个术语的权重值。也就是说,Tf-Idf 方案中的权重可以呈现权重的指纹。在小规模语料库中,Tf-Idf 可以\xe2\x80\x99t 发挥这种作用,因为存在巨大的潜力找到两个具有相同权重的术语,因为它们共享相同的源文档,并且在每个文档中的频率相同。通过在抄袭检测领域使用 Tf-Idf 加权方案,根据语料库的大小,此功能可以是对手和支持者。
\n这是我从 tf-idf 技术中推断出来的..这是真的吗?
\n有没有链接或者文档可以证明我的结论\xd8\x9f
\ngensim.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对象中单词的词频?
我的目标是输入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文档,我对该查询执行哪些操作,以便可以找到与文档的余弦相似度?
我使用 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) tf-idf ×10
python ×8
scikit-learn ×5
apache-spark ×1
dictionary ×1
frequency ×1
gensim ×1
matrix ×1
nltk ×1
pandas ×1
pyspark ×1
sql ×1