小编nad*_*dre的帖子

大型Numpy Scipy CSR矩阵,行式操作

我想迭代CSR矩阵的行并将每个元素除以行的总和,类似于此处:

numpy逐行划分

我的问题是我正在处理一个大矩阵:(96582,350138)

当从链接的帖子应用操作时,它会膨胀我的记忆,因为返回的矩阵是密集的.

所以这是我的第一次尝试:

for row in counts:
    row = row / row.sum()
Run Code Online (Sandbox Code Playgroud)

不幸的是,这根本不会影响矩阵,所以我想出了第二个想法来创建一个新的csr矩阵并使用vstack连接行:

from scipy import sparse
import time

start_time = curr_time = time.time()
mtx = sparse.csr_matrix((0, counts.shape[1]))
for i, row in enumerate(counts):
   prob_row = row / row.sum()
   mtx = sparse.vstack([mtx, prob_row])
   if i % 1000 == 0:
      delta_time = time.time() - curr_time
      total_time = time.time() - start_time
      curr_time = time.time()
      print('step: %i, total time: %i, delta_time: %i' % (i, total_time, delta_time))
Run Code Online (Sandbox Code Playgroud)

这很好用,但经过一些迭代后,它变得越来越慢:

step: 0, total time: 0, …
Run Code Online (Sandbox Code Playgroud)

python numpy sum scipy

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

带有不等大小列表的Tensorflow嵌入查找

嘿,我正在尝试使用嵌入将多标签分类数据投影到密集空间中。

这是一个玩具示例。假设我有四个类别,想将它们投影到2D空间中。此外,我得到了两个实例,第一个实例属于类别0,第二个实例属于类别1。

该代码将如下所示:

sess = tf.InteractiveSession()
embeddings =  tf.Variable(tf.random_uniform([4, 2], -1.0, 1.0))
sess.run(tf.global_variables_initializer())
y = tf.nn.embedding_lookup(embeddings, [0,1])
y.eval()
Run Code Online (Sandbox Code Playgroud)

并返回如下内容:

array([[ 0.93999457, -0.83051205],
       [-0.1699729 ,  0.73936272]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。现在想象一个实例属于两个类别。嵌入查找将返回两个向量,例如,我可以将它们减小:

y = tf.nn.embedding_lookup(embeddings, [[0,1],[1,2]]) # two categories
y_ = tf.reduce_mean(y, axis=1)
y_.eval()
Run Code Online (Sandbox Code Playgroud)

就像我期望的那样工作。现在,当我批次中的实例不属于相同数量的类别时,就会出现我的问题,例如:

y = tf.nn.embedding_lookup(embeddings, [[0,1],[1,2,3]]) # unequal sized lists
y_ = tf.reduce_mean(y, axis=1)
y_.eval()

ValueError: Argument must be a dense tensor: [[0, 1], [1, 2, 3]] - got shape [2], but wanted [2, 2].
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何想法吗?

categorical-data tensorflow embedding-lookup

5
推荐指数
0
解决办法
432
查看次数

TfIdfVectorizer:固定词汇的矢量化器如何处理新词?

我正在研究大约10万篇研究论文.我正在考虑三个领域:

  1. 纯文本
  2. 标题
  3. 抽象

我使用TfIdfVectorizer获取明文字段的TfIdf表示,并将由此产生的词汇反馈到标题和摘要的矢量化器中,以确保所有三个表示都在同一个词汇上工作.我的想法是,由于明文字段比其他两个字段大得多,它的词汇很可能涵盖其他字段中的所有字词.但是,如果情况并非如此,那么TfIdfVectorizer如何处理新的单词/代币呢?

这是我的代码示例:

vectorizer = TfidfVectorizer(min_df=2)
plaintexts_tfidf = vectorizer.fit_transform(plaintexts)
vocab = vectorizer.vocabulary_
# later in an another script after loading the vocab from disk
vectorizer = TfidfVectorizer(min_df=2, vocabulary=vocab)
titles_tfidf = vectorizer.fit_transform(titles)
Run Code Online (Sandbox Code Playgroud)

词汇有~90万字.

在矢量化期间,我没有遇到任何问题,但后来当我想使用sklearn.metrics.pairwise.cosine_similarity比较矢量化标题之间的相似性时,我遇到了这个错误:

>> titles_sim = cosine_similarity(titles_tfidf)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-237-5aa86fe892da> in <module>()
----> 1 titles_sim = cosine_similarity(titles)

/usr/local/lib/python3.5/dist-packages/sklearn/metrics/pairwise.py in cosine_similarity(X, Y, dense_output)
    916         Y_normalized = normalize(Y, copy=True)
    917 
--> 918     K = safe_sparse_dot(X_normalized, Y_normalized.T, dense_output=dense_output)
    919 
    920     return K

/usr/local/lib/python3.5/dist-packages/sklearn/utils/extmath.py in safe_sparse_dot(a, …
Run Code Online (Sandbox Code Playgroud)

python tf-idf cosine-similarity scikit-learn

4
推荐指数
1
解决办法
7071
查看次数