标签归档:natural-language-processing

Stanford-tensorflow-tutorials-此存储库包含斯坦福课程的代码示例


斯坦福-TensorFlow-教程

此存储库包含课程CS 20:深度学习研究的TensorFlow的代码示例。
它将随着课程的进展而更新。
详细的教学大纲和课堂讲稿可以在这里找到。here
对于本课程,我使用python3.6和TensorFlow 1.4.1

前一年课程的代码和备注请参见文件夹2017和网站https://web.stanford.edu/class/cs20si/2017

有关安装说明和依赖项列表,请参阅此存储库的安装文件夹

Nltk-NLTK源

自然语言工具包(NLTK)


NLTK–自然语言工具包–是一套开源的Python模块、数据集和教程,支持自然语言处理方面的研究和开发。NLTK需要Python版本3.5、3.6、3.7、3.8或3.9

有关文档,请访问nltk.org

贡献

你想为NLTK的发展做贡献吗?太棒了!请阅读CONTRIBUTING.md有关更多详细信息,请参阅

另请参阅how to contribute to NLTK

捐赠

你觉得这个工具包有帮助吗?请使用NLTK主页上的链接通过PayPal向项目捐款来支持NLTK开发

引用

如果您发表使用NLTK的作品,请引用NLTK书,如下所示:

Bird, Steven, Edward Loper and Ewan Klein (2009).
Natural Language Processing with Python.  O'Reilly Media Inc.

版权所有

版权所有(C)2001-2021年NLTK项目

有关许可证信息,请参阅LICENSE.txt

AUTHORS.md包含对NLTK做出贡献的每个人的列表

重新分布

  • NLTK源代码是在Apache2.0许可下分发的
  • NLTK文档在知识共享署名-非商业性-无衍生作品3.0美国许可下分发
  • NLTK语料库是根据自述文件中给出的条款为每个语料库提供的;所有语料库都可以再分发,并可用于非商业用途
  • 根据这些许可证的规定,NLTK可以自由再分发

tf.nn.embedding_lookup函数有什么作用?

问题:tf.nn.embedding_lookup函数有什么作用?

tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None)

我不了解此功能的职责。像查找表吗?用哪种方法返回每个ID对应的参数(以ID为单位)?

例如,在skip-gram模型中,如果使用tf.nn.embedding_lookup(embeddings, train_inputs),则为每个train_input找到对应的嵌入?

tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None)

I cannot understand the duty of this function. Is it like a lookup table? Which means to return the parameters corresponding to each id (in ids)?

For instance, in the skip-gram model if we use tf.nn.embedding_lookup(embeddings, train_inputs), then for each train_input it finds the correspond embedding?


回答 0

embedding_lookup函数检索params张量的行。该行为类似于对numpy中的数组使用索引。例如

matrix = np.random.random([1024, 64])  # 64-dimensional embeddings
ids = np.array([0, 5, 17, 33])
print matrix[ids]  # prints a matrix of shape [4, 64] 

params参数也可以是张量的列表,在这种情况下,ids将在张量之间分配。例如,给定的3张量列表[2, 64],默认行为是,他们将代表ids[0, 3][1, 4][2, 5]

partition_strategy控制ids列表中的分布方式。当矩阵可能太大而无法合为一体时,分区对于较大规模的问题很有用。

embedding_lookup function retrieves rows of the params tensor. The behavior is similar to using indexing with arrays in numpy. E.g.

matrix = np.random.random([1024, 64])  # 64-dimensional embeddings
ids = np.array([0, 5, 17, 33])
print matrix[ids]  # prints a matrix of shape [4, 64] 

params argument can be also a list of tensors in which case the ids will be distributed among the tensors. For example, given a list of 3 tensors [2, 64], the default behavior is that they will represent ids: [0, 3], [1, 4], [2, 5].

partition_strategy controls the way how the ids are distributed among the list. The partitioning is useful for larger scale problems when the matrix might be too large to keep in one piece.


回答 1

是的,在您明白这一点之前,很难理解此功能。

最简单的形式类似于tf.gather。它params根据所指定的索引返回的元素ids

例如(假设您在里面tf.InteractiveSession()

params = tf.constant([10,20,30,40])
ids = tf.constant([0,1,2,3])
print tf.nn.embedding_lookup(params,ids).eval()

将返回[10 20 30 40],因为params的第一个元素(索引0)为,params 10的第二个元素(索引1)为20,依此类推。

同样,

params = tf.constant([10,20,30,40])
ids = tf.constant([1,1,3])
print tf.nn.embedding_lookup(params,ids).eval()

会回来的[20 20 40]

embedding_lookup比这更。该params参数可以是张量列表,而不是单个张量。

params1 = tf.constant([1,2])
params2 = tf.constant([10,20])
ids = tf.constant([2,0,2,1,2,3])
result = tf.nn.embedding_lookup([params1, params2], ids)

在这种情况下,ids根据分区策略,在中指定的索引对应于张量的元素,其中默认分区策略为’mod’。

在’mod’策略中,索引0对应于列表中第一个张量的第一个元素。索引1对应于第二张量的第一元素。索引2对应于第三张量的第一个元素,依此类推。假设params是张量的列表,对于所有索引,简单地index 对应第(i + 1)张量的第一个元素。i0..(n-1)n

现在,索引n不能对应于张量n + 1,因为列表params仅包含n张量。因此index n对应于第一个张量的第二个元素。类似地,index n+1对应于第二张量的第二个元素,依此类推。

因此,在代码中

params1 = tf.constant([1,2])
params2 = tf.constant([10,20])
ids = tf.constant([2,0,2,1,2,3])
result = tf.nn.embedding_lookup([params1, params2], ids)

下标0对应于第一个张量的第一个元素:1

索引1对应于第二张量的第一个元素:10

索引2对应于第一个张量的第二个元素:2

索引3对应于第二张量的第二个元素:20

因此,结果将是:

[ 2  1  2 10  2 20]

Yes, this function is hard to understand, until you get the point.

In its simplest form, it is similar to tf.gather. It returns the elements of params according to the indexes specified by ids.

For example (assuming you are inside tf.InteractiveSession())

params = tf.constant([10,20,30,40])
ids = tf.constant([0,1,2,3])
print tf.nn.embedding_lookup(params,ids).eval()

would return [10 20 30 40], because the first element (index 0) of params is 10, the second element of params (index 1) is 20, etc.

Similarly,

params = tf.constant([10,20,30,40])
ids = tf.constant([1,1,3])
print tf.nn.embedding_lookup(params,ids).eval()

would return [20 20 40].

But embedding_lookup is more than that. The params argument can be a list of tensors, rather than a single tensor.

params1 = tf.constant([1,2])
params2 = tf.constant([10,20])
ids = tf.constant([2,0,2,1,2,3])
result = tf.nn.embedding_lookup([params1, params2], ids)

In such a case, the indexes, specified in ids, correspond to elements of tensors according to a partition strategy, where the default partition strategy is ‘mod’.

In the ‘mod’ strategy, index 0 corresponds to the first element of the first tensor in the list. Index 1 corresponds to the first element of the second tensor. Index 2 corresponds to the first element of the third tensor, and so on. Simply index i corresponds to the first element of the (i+1)th tensor , for all the indexes 0..(n-1), assuming params is a list of n tensors.

Now, index n cannot correspond to tensor n+1, because the list params contains only n tensors. So index n corresponds to the second element of the first tensor. Similarly, index n+1 corresponds to the second element of the second tensor, etc.

So, in the code

params1 = tf.constant([1,2])
params2 = tf.constant([10,20])
ids = tf.constant([2,0,2,1,2,3])
result = tf.nn.embedding_lookup([params1, params2], ids)

index 0 corresponds to the first element of the first tensor: 1

index 1 corresponds to the first element of the second tensor: 10

index 2 corresponds to the second element of the first tensor: 2

index 3 corresponds to the second element of the second tensor: 20

Thus, the result would be:

[ 2  1  2 10  2 20]

回答 2

是的,该tf.nn.embedding_lookup()函数的目的是在嵌入矩阵中执行查找并返回单词的嵌入(或简单地说是矢量表示)。

一个简单的嵌入矩阵(形状vocabulary_size x embedding_dimension:)如下所示。(即每个单词将由一个数字向量表示;因此,名称为word2vec


嵌入矩阵

the 0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862
like 0.36808 0.20834 -0.22319 0.046283 0.20098 0.27515 -0.77127 -0.76804
between 0.7503 0.71623 -0.27033 0.20059 -0.17008 0.68568 -0.061672 -0.054638
did 0.042523 -0.21172 0.044739 -0.19248 0.26224 0.0043991 -0.88195 0.55184
just 0.17698 0.065221 0.28548 -0.4243 0.7499 -0.14892 -0.66786 0.11788
national -1.1105 0.94945 -0.17078 0.93037 -0.2477 -0.70633 -0.8649 -0.56118
day 0.11626 0.53897 -0.39514 -0.26027 0.57706 -0.79198 -0.88374 0.30119
country -0.13531 0.15485 -0.07309 0.034013 -0.054457 -0.20541 -0.60086 -0.22407
under 0.13721 -0.295 -0.05916 -0.59235 0.02301 0.21884 -0.34254 -0.70213
such 0.61012 0.33512 -0.53499 0.36139 -0.39866 0.70627 -0.18699 -0.77246
second -0.29809 0.28069 0.087102 0.54455 0.70003 0.44778 -0.72565 0.62309 

我分裂上述嵌入基质并装载仅vocab,这将是我们的词汇并在相应的向量emb阵列。

vocab = ['the','like','between','did','just','national','day','country','under','such','second']

emb = np.array([[0.418, 0.24968, -0.41242, 0.1217, 0.34527, -0.044457, -0.49688, -0.17862],
   [0.36808, 0.20834, -0.22319, 0.046283, 0.20098, 0.27515, -0.77127, -0.76804],
   [0.7503, 0.71623, -0.27033, 0.20059, -0.17008, 0.68568, -0.061672, -0.054638],
   [0.042523, -0.21172, 0.044739, -0.19248, 0.26224, 0.0043991, -0.88195, 0.55184],
   [0.17698, 0.065221, 0.28548, -0.4243, 0.7499, -0.14892, -0.66786, 0.11788],
   [-1.1105, 0.94945, -0.17078, 0.93037, -0.2477, -0.70633, -0.8649, -0.56118],
   [0.11626, 0.53897, -0.39514, -0.26027, 0.57706, -0.79198, -0.88374, 0.30119],
   [-0.13531, 0.15485, -0.07309, 0.034013, -0.054457, -0.20541, -0.60086, -0.22407],
   [ 0.13721, -0.295, -0.05916, -0.59235, 0.02301, 0.21884, -0.34254, -0.70213],
   [ 0.61012, 0.33512, -0.53499, 0.36139, -0.39866, 0.70627, -0.18699, -0.77246 ],
   [ -0.29809, 0.28069, 0.087102, 0.54455, 0.70003, 0.44778, -0.72565, 0.62309 ]])


emb.shape
# (11, 8)

在TensorFlow中嵌入查找

现在,我们将看到如何对某些任意输入语句执行嵌入查找

In [54]: from collections import OrderedDict

# embedding as TF tensor (for now constant; could be tf.Variable() during training)
In [55]: tf_embedding = tf.constant(emb, dtype=tf.float32)

# input for which we need the embedding
In [56]: input_str = "like the country"

# build index based on our `vocabulary`
In [57]: word_to_idx = OrderedDict({w:vocab.index(w) for w in input_str.split() if w in vocab})

# lookup in embedding matrix & return the vectors for the input words
In [58]: tf.nn.embedding_lookup(tf_embedding, list(word_to_idx.values())).eval()
Out[58]: 
array([[ 0.36807999,  0.20834   , -0.22318999,  0.046283  ,  0.20097999,
         0.27515   , -0.77126998, -0.76804   ],
       [ 0.41800001,  0.24968   , -0.41242   ,  0.1217    ,  0.34527001,
        -0.044457  , -0.49687999, -0.17862   ],
       [-0.13530999,  0.15485001, -0.07309   ,  0.034013  , -0.054457  ,
        -0.20541   , -0.60086   , -0.22407   ]], dtype=float32)

注意我们是怎么得到的嵌入使用从我们原来的嵌入矩阵(文字)的话指数在我们的词汇。

通常,此类嵌入查找是由第一层(称为“ 嵌入层”)执行的,然后将这些嵌入传递到RNN / LSTM / GRU层以进行进一步处理。


旁注:通常,词汇表还将具有特殊unk标记。因此,如果词汇表中不存在来自我们输入句子的标记,则将unk在嵌入矩阵中查找与之相对应的索引。


PS注意,embedding_dimension是一个超参数是一个具有调整他们的应用程序,但受欢迎的车型,如Word2Vec手套使用300维向量表示每个字。

奖励阅读 word2vec跳过语法模型

Yes, the purpose of tf.nn.embedding_lookup() function is to perform a lookup in the embedding matrix and return the embeddings (or in simple terms the vector representation) of words.

A simple embedding matrix (of shape: vocabulary_size x embedding_dimension) would look like below. (i.e. each word will be represented by a vector of numbers; hence the name word2vec)


Embedding Matrix

the 0.418 0.24968 -0.41242 0.1217 0.34527 -0.044457 -0.49688 -0.17862
like 0.36808 0.20834 -0.22319 0.046283 0.20098 0.27515 -0.77127 -0.76804
between 0.7503 0.71623 -0.27033 0.20059 -0.17008 0.68568 -0.061672 -0.054638
did 0.042523 -0.21172 0.044739 -0.19248 0.26224 0.0043991 -0.88195 0.55184
just 0.17698 0.065221 0.28548 -0.4243 0.7499 -0.14892 -0.66786 0.11788
national -1.1105 0.94945 -0.17078 0.93037 -0.2477 -0.70633 -0.8649 -0.56118
day 0.11626 0.53897 -0.39514 -0.26027 0.57706 -0.79198 -0.88374 0.30119
country -0.13531 0.15485 -0.07309 0.034013 -0.054457 -0.20541 -0.60086 -0.22407
under 0.13721 -0.295 -0.05916 -0.59235 0.02301 0.21884 -0.34254 -0.70213
such 0.61012 0.33512 -0.53499 0.36139 -0.39866 0.70627 -0.18699 -0.77246
second -0.29809 0.28069 0.087102 0.54455 0.70003 0.44778 -0.72565 0.62309 

I split the above embedding matrix and loaded only the words in vocab which will be our vocabulary and the corresponding vectors in emb array.

vocab = ['the','like','between','did','just','national','day','country','under','such','second']

emb = np.array([[0.418, 0.24968, -0.41242, 0.1217, 0.34527, -0.044457, -0.49688, -0.17862],
   [0.36808, 0.20834, -0.22319, 0.046283, 0.20098, 0.27515, -0.77127, -0.76804],
   [0.7503, 0.71623, -0.27033, 0.20059, -0.17008, 0.68568, -0.061672, -0.054638],
   [0.042523, -0.21172, 0.044739, -0.19248, 0.26224, 0.0043991, -0.88195, 0.55184],
   [0.17698, 0.065221, 0.28548, -0.4243, 0.7499, -0.14892, -0.66786, 0.11788],
   [-1.1105, 0.94945, -0.17078, 0.93037, -0.2477, -0.70633, -0.8649, -0.56118],
   [0.11626, 0.53897, -0.39514, -0.26027, 0.57706, -0.79198, -0.88374, 0.30119],
   [-0.13531, 0.15485, -0.07309, 0.034013, -0.054457, -0.20541, -0.60086, -0.22407],
   [ 0.13721, -0.295, -0.05916, -0.59235, 0.02301, 0.21884, -0.34254, -0.70213],
   [ 0.61012, 0.33512, -0.53499, 0.36139, -0.39866, 0.70627, -0.18699, -0.77246 ],
   [ -0.29809, 0.28069, 0.087102, 0.54455, 0.70003, 0.44778, -0.72565, 0.62309 ]])


emb.shape
# (11, 8)

Embedding Lookup in TensorFlow

Now we will see how can we perform embedding lookup for some arbitrary input sentence.

In [54]: from collections import OrderedDict

# embedding as TF tensor (for now constant; could be tf.Variable() during training)
In [55]: tf_embedding = tf.constant(emb, dtype=tf.float32)

# input for which we need the embedding
In [56]: input_str = "like the country"

# build index based on our `vocabulary`
In [57]: word_to_idx = OrderedDict({w:vocab.index(w) for w in input_str.split() if w in vocab})

# lookup in embedding matrix & return the vectors for the input words
In [58]: tf.nn.embedding_lookup(tf_embedding, list(word_to_idx.values())).eval()
Out[58]: 
array([[ 0.36807999,  0.20834   , -0.22318999,  0.046283  ,  0.20097999,
         0.27515   , -0.77126998, -0.76804   ],
       [ 0.41800001,  0.24968   , -0.41242   ,  0.1217    ,  0.34527001,
        -0.044457  , -0.49687999, -0.17862   ],
       [-0.13530999,  0.15485001, -0.07309   ,  0.034013  , -0.054457  ,
        -0.20541   , -0.60086   , -0.22407   ]], dtype=float32)

Observe how we got the embeddings from our original embedding matrix (with words) using the indices of words in our vocabulary.

Usually, such an embedding lookup is performed by the first layer (called Embedding layer) which then passes these embeddings to RNN/LSTM/GRU layers for further processing.


Side Note: Usually the vocabulary will also have a special unk token. So, if a token from our input sentence is not present in our vocabulary, then the index corresponding to unk will be looked up in the embedding matrix.


P.S. Note that embedding_dimension is a hyperparameter that one has to tune for their application but popular models like Word2Vec and GloVe uses 300 dimension vector for representing each word.

Bonus Reading word2vec skip-gram model


回答 3

这是描述嵌入查找过程的图像。



简而言之,它获取由ID列表指定的嵌入层的相应行,并将其作为张量提供。它是通过以下过程实现的。

  1. 定义一个占位符 lookup_ids = tf.placeholder([10])
  2. 定义嵌入层 embeddings = tf.Variable([100,10],...)
  3. 定义张量流操作 embed_lookup = tf.embedding_lookup(embeddings, lookup_ids)
  4. 通过运行获取结果 lookup = session.run(embed_lookup, feed_dict={lookup_ids:[95,4,14]})

Here’s an image depicting the process of embedding lookup.



Concisely, it gets the corresponding rows of a embedding layer, specified by a list of IDs and provide that as a tensor. It is achieved through the following process.

  1. Define a placeholder lookup_ids = tf.placeholder([10])
  2. Define a embedding layer embeddings = tf.Variable([100,10],...)
  3. Define the tensorflow operation embed_lookup = tf.embedding_lookup(embeddings, lookup_ids)
  4. Get the results by running lookup = session.run(embed_lookup, feed_dict={lookup_ids:[95,4,14]})

回答 4

当参数张量为高维时,id仅指最大维。也许对大多数人来说这很明显,但是我必须运行以下代码来理解这一点:

embeddings = tf.constant([[[1,1],[2,2],[3,3],[4,4]],[[11,11],[12,12],[13,13],[14,14]],
                          [[21,21],[22,22],[23,23],[24,24]]])
ids=tf.constant([0,2,1])
embed = tf.nn.embedding_lookup(embeddings, ids, partition_strategy='div')

with tf.Session() as session:
    result = session.run(embed)
    print (result)

只是尝试“ div”策略,对于一个张量,这没有什么区别。

这是输出:

[[[ 1  1]
  [ 2  2]
  [ 3  3]
  [ 4  4]]

 [[21 21]
  [22 22]
  [23 23]
  [24 24]]

 [[11 11]
  [12 12]
  [13 13]
  [14 14]]]

When the params tensor is in high dimensions, the ids only refers to top dimension. Maybe it’s obvious to most of people but I have to run the following code to understand that:

embeddings = tf.constant([[[1,1],[2,2],[3,3],[4,4]],[[11,11],[12,12],[13,13],[14,14]],
                          [[21,21],[22,22],[23,23],[24,24]]])
ids=tf.constant([0,2,1])
embed = tf.nn.embedding_lookup(embeddings, ids, partition_strategy='div')

with tf.Session() as session:
    result = session.run(embed)
    print (result)

Just trying the ‘div’ strategy and for one tensor, it makes no difference.

Here is the output:

[[[ 1  1]
  [ 2  2]
  [ 3  3]
  [ 4  4]]

 [[21 21]
  [22 22]
  [23 23]
  [24 24]]

 [[11 11]
  [12 12]
  [13 13]
  [14 14]]]

回答 5

另一种查看方式是,假设您将张量展平为一维数组,然后执行查找。

(例如)Tensor0 = [1,2,3],Tensor1 = [4,5,6],Tensor2 = [7,8,9]

展平的张量将如下[1,4,7,2,5,8,3,6,9]

现在,当您执行[0,3,4,1,7]的查找时,将会产生[1,2,5,4,6]

(i,e)例如,如果lookup值为7,而我们有3个张量(或具有3行的张量),

7/3 :(提醒为1,商为2)因此将显示Tensor1的第二个元素,即6

Another way to look at it is , assume that you flatten out the tensors to one dimensional array, and then you are performing a lookup

(eg) Tensor0=[1,2,3], Tensor1=[4,5,6], Tensor2=[7,8,9]

The flattened out tensor will be as follows [1,4,7,2,5,8,3,6,9]

Now when you do a lookup of [0,3,4,1,7] it will yeild [1,2,5,4,6]

(i,e) if lookup value is 7 for example , and we have 3 tensors (or a tensor with 3 rows) then,

7 / 3 : (Reminder is 1, Quotient is 2) So 2nd element of Tensor1 will be shown, which is 6


回答 6

由于我也对此功能感兴趣,因此我将给我两分钱。

我在2D情况下看到它的方式就像矩阵乘法(很容易推广到其他维度)。

考虑一个带有N个符号的词汇表。然后,您可以将符号x表示为尺寸为Nx1的矢量,并进行一次热编码。

但是,您不希望将此符号表示为Nx1的矢量,而是表示为尺寸为Mx1的y

因此,要将x转换为y,可以使用和嵌入尺寸为MxN的矩阵E

y = E x

本质上,这就是tf.nn.embedding_lookup(params,ids,…)所做的事情,细微的差别是ids只是一个数字,代表1在热编码矢量x中的位置1 。

Since I was also intrigued by this function, I’ll give my two cents.

The way I see it in the 2D case is just as a matrix multiplication (it’s easy to generalize to other dimensions).

Consider a vocabulary with N symbols. Then, you can represent a symbol x as a vector of dimensions Nx1, one-hot-encoded.

But you want a representation of this symbol not as a vector of Nx1, but as one with dimensions Mx1, called y.

So, to transform x into y, you can use and embedding matrix E, with dimensions MxN:

y = E x.

This is essentially what tf.nn.embedding_lookup(params, ids, …) is doing, with the nuance that ids are just one number that represents the position of the 1 in the one-hot-encoded vector x.


回答 7

添加到Asher Stern的答案中, params被解释为大嵌入张量的划分。它可以是表示完整嵌入张量的单个张量,也可以是X形张量的列表,除了第一维以外,它们均具有相同的形状,表示分片嵌入张量。

tf.nn.embedding_lookup考虑到嵌入(参数)会很大这一事实来编写函数。因此我们需要partition_strategy

Adding to Asher Stern’s answer, params is interpreted as a partitioning of a large embedding tensor. It can be a single tensor representing the complete embedding tensor, or a list of X tensors all of same shape except for the first dimension, representing sharded embedding tensors.

The function tf.nn.embedding_lookup is written considering the fact that embedding (params) will be large. Therefore we need partition_strategy.


Pattern-用于Python的Web挖掘模块,包含抓取、自然语言处理、机器学习、网络分析和可视化工具

Pattern是Python的Web挖掘模块。它具有用于以下方面的工具:
  • 数据挖掘:Web服务(Google、Twitter、Wikipedia)、Web爬虫、HTML DOM解析器
  • 自然语言处理:词性标记、n元语法搜索、情感分析、WordNet
  • 机器学习:向量空间模型、聚类、分类(KNN、SVM、感知器)
  • 网络分析:图形中心性与可视化

它有很好的文档记录,通过350多个单元测试进行了彻底的测试,并附带了50多个示例。源代码是按照BSD授权的

示例

此示例使用Python3对从Twitter挖掘的形容词训练分类器。首先,收集包含#WIN或#FAIL标签的tweet。例如:“20美元今天给一位可爱的小老太太小费#赢了”然后解析词性标签,只保留形容词。每条推文都被转换为向量,即形容词→计数项的字典,标记为WINFAIL分类器使用向量来学习哪些其他tweet看起来更像WIN或者更像是FAIL

from pattern.web import Twitter
from pattern.en import tag
from pattern.vector import KNN, count

twitter, knn = Twitter(), KNN()

for i in range(1, 3):
    for tweet in twitter.search('#win OR #fail', start=i, count=100):
        s = tweet.text.lower()
        p = '#win' in s and 'WIN' or 'FAIL'
        v = tag(s)
        v = [word for word, pos in v if pos == 'JJ'] # JJ = adjective
        v = count(v) # {'sweet': 1}
        if v:
            knn.train(v, type=p)

print(knn.classify('sweet potato burger'))
print(knn.classify('stupid autocorrect'))

安装

模式支持Python2.7和Python3.6。要安装Pattern以使其在您的所有脚本中都可用,请解压缩下载并从命令行执行以下操作:

cd pattern-3.6
python setup.py install

如果您有pip,您可以从PyPI repository

pip install pattern

如果上述方法都不起作用,您可以通过三种方式使Python了解该模块:

  • 将模式文件夹放在与脚本相同的文件夹中
  • 将模式文件夹放在模块的标准位置,以便所有脚本都可以使用:
    • c:\python36\Lib\site-packages\(Windows)、
    • /Library/Python/3.6/site-packages/(Mac OS X)、
    • /usr/lib/python3.6/site-packages/(UNIX)
  • 将模块的位置添加到sys.path在您的脚本中,在导入之前:
MODULE = '/users/tom/desktop/pattern'
import sys; if MODULE not in sys.path: sys.path.append(MODULE)
from pattern.en import parsetree

文档

有关文档和示例,请参阅user documentation

版本

3.6

许可证

BSD,请参见LICENSE.txt有关更多详细信息,请参阅

参考文献

De Smedt,T.,Daelemans,W.(2012)。Python的模式。机器学习研究杂志,13,2031-2035

贡献力量

源代码托管在GitHub上,欢迎投稿或捐赠

捆绑的依赖项

Pattern与以下数据集、算法和Python包捆绑在一起:

  • 布里尔标记器,Eric Brill
  • 用于荷兰语的布里尔标记器、杰伦·格尔岑(Jeroen Geertzen)
  • 用于德语的Brill标记器,Gerold Schneider&Martin Volk
  • 西班牙语的布里尔标记器,在Wikicorpus上进行培训(Samuel Reese&Gema Boleda等人)
  • 法语的布里尔标记器,关于Lefff的培训(Benoüt Sagot&Lionel Clément等人)
  • 适用于意大利语的布里尔标记器,从维基词典中挖掘
  • 英语复数,Damian Conway
  • 西班牙语动词词尾变化,Fred Jehle
  • 法语动词词尾变化、鲍勃·萨利塔(Bob Salita)
  • Graph JavaScript框架,Aslak Hellesoy&Dave Hoover
  • LIBSVM、张志忠、林志仁
  • LIBLINEAR、范荣恩等人
  • 网络X中心性供稿:Aric Hagberg,Dan Schult&Pieter Swart
  • 拼写校正器、彼得·诺维格(Peter Norvig)

确认

作者:

投稿人(按时间顺序):

  • 弗雷德里克·德·布莱泽
  • 杰森·维纳
  • 丹尼尔·弗里森
  • 杰伦·格尔岑
  • 托马斯·克伦贝兹
  • 肯·威廉姆斯
  • 彼得里斯·埃林斯(Peteris Erins)
  • 拉杰什·奈尔
  • F·德·斯梅德
  • RadimŘehůřek
  • 汤姆·洛雷多
  • 约翰·德博维斯
  • 托马斯·西里奥
  • 杰罗德·施耐德
  • 马丁·沃尔克
  • 塞缪尔·约瑟夫
  • 舒班舒·米什拉(Shubhanshu Mishra)
  • 罗伯特·埃尔韦尔
  • 弗雷德·杰尔
  • Antoine Mazières+Fabelier.org
  • Rémi de Zoeten+closealert t.nl
  • 肯尼思·科赫(Kenneth Koch)
  • 延斯·格里沃拉
  • 法比奥·马菲亚
  • 史蒂文·洛里亚
  • 科林·莫尔特(Colin Molter)+tevizz.com
  • 彼得·布尔
  • 毛里齐奥·桑巴蒂
  • 旦福
  • 塞尔瓦托·迪·迪奥
  • 文森特·范·阿施
  • 弗雷德里克·埃尔韦特

TextBlob-简单、Python式的文本处理–情感分析、词性标记、名词短语提取、翻译等等

主页:https://textblob.readthedocs.io/

TextBlob是一个Python(2和3)库,用于处理文本数据。它提供了一个简单的API,用于深入研究常见的自然语言处理(NLP)任务,如词性标记、名词短语提取、情感分析、分类、翻译等

 

from textblob import TextBlob

text = '''
The titular threat of The Blob has always struck me as the ultimate movie
monster: an insatiably hungry, amoeba-like mass able to penetrate
virtually any safeguard, capable of--as a doomed doctor chillingly
describes it--"assimilating flesh on contact.
Snide comparisons to gelatin be damned, it's a concept with the most
devastating of potential consequences, not unlike the grey goo scenario
proposed by technological theorists fearful of
artificial intelligence run rampant.
'''

blob = TextBlob(text)
blob.tags           # [('The', 'DT'), ('titular', 'JJ'),
                    #  ('threat', 'NN'), ('of', 'IN'), ...]

blob.noun_phrases   # WordList(['titular threat', 'blob',
                    #            'ultimate movie monster',
                    #            'amoeba-like mass', ...])

for sentence in blob.sentences:
    print(sentence.sentiment.polarity)
# 0.060
# -0.341

TextBlob站在NLTKpattern,并且两者都玩得很好

功能

  • 名词短语提取
  • 词性标注
  • 情绪分析
  • 分类(朴素贝叶斯、决策树)
  • 标记化(将文本拆分成单词和句子)
  • 词频和词频
  • 解析
  • N元语法
  • 词形变化(复数和单数)与词汇化
  • 拼写更正
  • 通过扩展添加新模型或语言
  • Wordnet集成

现在就去拿吧

$ pip install -U textblob
$ python -m textblob.download_corpora

示例

查看更多示例,请参阅Quickstart guide

文档

有关完整文档,请访问https://textblob.readthedocs.io/

要求

  • Python>=2.7或>=3.5

项目链接

许可证

麻省理工学院有执照。请参阅捆绑的LICENSE有关更多详细信息,请提交文件

Ciphey-⚡在不知道密钥或密码的情况下自动解密加密、解码编码和破解散列⚡

使用自然语言处理和人工智能的全自动解密/解码/破解工具,以及一些常识

🤔这是什么?

输入加密文本,取回解密文本

“哪种类型的加密?”

这就是问题所在。你不知道,你只知道它可能是加密的。西菲会帮你想办法的

西菲可以在3秒或更短的时间内解决大部分问题。

Ciphey的目标是成为自动化大量解密和解码的工具,例如多基编码、经典密码、散列或更高级的密码术

如果您对密码学了解不多,或者您想在自己处理密文之前快速检查密文,Ciphey适合您

技术部分Ciphey使用定制的人工智能模块(自动搜索),并带有密码检测接口用来近似加密的东西。然后是定制的、可定制的自然语言处理语言检查器界面,它可以检测给定文本何时变为明文。

这里没有神经网络或臃肿的人工智能。我们只用最快最少的东西

而这只是冰山一角。有关完整的技术说明,请查看我们的documentation

✨功能

  • 支持50+加密/编码例如二进制、莫尔斯电码和Base64。经典密码,如凯撒密码、仿射密码和维吉内尔密码。以及现代加密,如重复密钥异或等。For the full list, click here
  • 带有增强搜索的定制人工智能(AuSearch),用于回答“使用了什么加密?”从而导致解密所需的时间不到3秒
  • 定制的自然语言处理模块Ciphey可以确定某些内容是否是明文。无论明文是JSON、CTF标志还是英语,Ciphey都可以在几毫秒内得到它
  • 多语言支持目前,只有德语和英语(带有AU、UK、CAN、USA变体)
  • 支持加密和哈希而像CyberChef Magic这样的替代品是做不到的
  • C++ core惊人的速度

🔭Ciphey vs CyberChef

🔁base64编码42次

名字 ⚡西菲⚡ 🐢网络厨师🐢
GIF
时间 2秒 6秒
设置
  • 对文件运行密码
  • 将正则表达式参数设置为“{”
  • 您需要知道要递归多少次
  • 你要知道一直到现在都是Base64
  • 您需要加载CyberChef(它是一个臃肿的JS应用程序)
  • 对CyberChef有足够的了解来创建这个渠道
  • 把火柴倒过来

注意事项gif可能会在不同的时间加载,因此一个gif的加载速度可能明显快于另一个gif。
关于魔术的注解CyberChef与Ciphey最相似的功能是Magic。Magic在此输入上立即失效并崩溃。我们迫使CyberChef竞争的唯一方法是手动定义它

我们还测试了CyberChef和Ciphey6 GB文件西菲破解了它5分54秒CyberChef还没开始就崩溃了

📊Ciphey vs Katana vs CyberChef Magic

名字 ⚡西菲⚡ 🗡️片名🗡️ 🐢网络厨师魔术🐢
高级语言检查器
支持加密
以反乌托邦主题命名的发行🌃
支持哈希
易于设置
我能猜出什么东西是用什么加密的
由黑客为黑客创建

🎬快速入门

如果您在安装Ciphey时遇到问题,read this.

‼️重要链接(文档、安装指南、不一致支持)

安装指南 文档 不和谐 Docker图像(来自REMnux)
📖Installation Guide 📚Documentation 🦜Discord 🐋Docker Documentation

🏃‍♀️运行Ciphey

有3种方法可以运行Ciphey

  1. 文件输入ciphey -f encrypted.txt
  2. 不合格的输入ciphey -- "Encrypted input"
  3. 正常方式ciphey -t "Encrypted input"

要消除进度条、概率表和所有噪音,请使用静音模式

ciphey -t "encrypted text here" -q

有关参数的完整列表,请运行ciphey --help

⚗️正在导入Ciphey

您可以导入Ciphey的Main并在您自己的程序和代码中使用它。from Ciphey.__main__ import main

🎪贡献者

Ciphey是由Bee2008年,并于2019年复兴。如果没有西菲,它就不会有今天的地位Cyclic3-UOL网络安全协会主席

西菲被复活并重新创造了Cyber Security Society用于CTF。如果你来利物浦,可以考虑做个演讲或赞助我们的活动。给我们发电子邮件到cybersecurity@society.liverpoolguild.org了解更多信息🤠

主要学分感谢George H研究出如何使用适当的算法来加快搜索过程特别感谢varghalladesign用来设计徽标。看看他们的其他设计作品吧!

🐕‍🦺Contributing

不要害怕贡献自己的力量!我们有很多很多你可以做的事情来帮助我们。每一个都贴上标签,并用例子很容易解释。如果你想做贡献却被困住了,那么标签@bee-san✨

或者,加入不和谐组并在那里发送消息(链接到contrib file)或作为徽章出现在本自述文件的顶部

请阅读contributing file有关如何投稿的确切详细信息,请参阅✨

通过这样做,您的名字将被添加到下面的自述文件中,并成为一个不断发展的项目的一部分!

💰财政捐赠者

这笔捐款不仅将用于资助Ciphey及其作者的未来,还将用于资助利物浦大学的网络安全协会

GitHub不支持“赞助这个项目,我们会平均分配资金”,所以选择一个链接,我们会自己解决🥰

✨贡献者

感谢这些优秀的人们(emoji key):


cyclic3

🎨🚧💻🤔

Brandon

🎨🚧💻🤔

michalani

💻

ashb07

💻

Shardion

🐛

Bryan

🌍📖

Lukas Gabriel

💻🐛🌍🤔

Darshan

🐛

SkeletalDemise

💻

Christian Clauss

💻🐛

Machinexa2

🖋

Anant Verma

💻🐛

XVXTOR

📖

Itamikame

💻

MikeMerz

💻

Jacob Galam

💻🐛

TuxTheXplorer

🌍

Itamai

💻🐛

Filipe

🌍

Malathi

💻

Jack

🌍

Younes

🌍

Marnick Vandecauter

🌍

Michael V

💻

chuinzer

🌍

blackcat-917

🌍📖

Åsmund Brekke

💻

Sashreek Shankar

💻

cryptobadger

💻🐛

elf

💻

Roger Yu

💻

dysleixa

💻

Mohammad Zulfikar

📖

此项目遵循all-contributors规格。欢迎任何形式的投稿!

SpaCy-基于Python语言的💫工业级自然语言处理

Spacy:工业实力NLP

Spacy是一个图书馆,用于高级自然语言处理在Python和Cython中。它建立在最新的研究基础上,从第一天起就被设计用于真正的产品中

Spacy伴随着pretrained pipelines,并且当前支持标记化和培训60多种语言它的特点是最先进的速度和神经网络模型用于标记、解析命名实体识别文本分类更重要的是,通过预先培训实现多任务学习变形金刚像伯特一样,也是一个随时准备生产的training system以及轻松的模型打包、部署和工作流管理。Spacy是在麻省理工学院许可下发布的商业开源软件

💫现在发布3.0版!
Check out the release notes here.

📖文档

文档
⭐️spaCy 101 对Spacy来说是新手吗?这是你需要知道的一切!
📚Usage Guides 如何使用Spacy及其功能
🚀New in v3.0 新功能、向后不兼容性和迁移指南
🪐Project Templates 您可以克隆、修改和运行端到端工作流
🎛API Reference Spacy的API的详细参考资料
📦Models 为Spacy下载经过培训的管道
🌌Universe 来自Spacy生态系统的插件、扩展、演示和书籍
👩‍🏫Online Course 在这个免费的交互式在线课程中学习Spacy
📺Videos 我们的YouTube频道提供视频教程、讲座等
🛠Changelog 更改和版本历史记录
💝Contribute 如何为Spacy项目和代码库做出贡献

💬在哪里提问?

Spacy项目由@honnibal@ines@svlandeg@adrianeboyd@polm请理解,我们将不能通过电子邮件提供个人支持。我们还相信,如果帮助被公开分享,那么它就更有价值,这样更多的人就可以从中受益

类型 站台
🚨错误报告 GitHub Issue Tracker
🎁功能要求和想法 GitHub Discussions
👩‍💻使用问题 GitHub Discussions·Stack Overflow
🗯一般性讨论 GitHub Discussions

功能

  • 支持60多种语言
  • 训练有素的管道对于不同的语言和任务
  • 带预训练的多任务学习变形金刚像伯特一样
  • 对预训人员的支持词向量和嵌入
  • 最先进的速度
  • 生产准备就绪培训系统
  • 语言动机标记化
  • 命名的组件实体识别词性标注、依存关系分析、句子切分文本分类、词汇化、词法分析、实体链接等
  • 通过以下功能轻松扩展自定义组件和属性
  • 支持中的自定义模型PyTorchTensorFlow和其他框架
  • 内置可视化工具对于语法和NER
  • 简单易懂模型包装、部署和工作流管理
  • 稳健、经过严格评估的准确性

📖有关更多详细信息,请参阅facts, figures and benchmarks

⏳安装空间

有关详细的安装说明,请参阅documentation

  • 操作系统:MacOS/OS X·Linux·Windows(Cygwin、MinGW、Visual Studio)
  • Python版本:Python 3.6+(仅64位)
  • 包管理器pip·conda(通过conda-forge)

管道

使用pip,spacy发行版以源码包和二进制轮子的形式可用。在安装Spacy及其依赖项之前,请确保您的pipsetuptoolswheel是最新的

pip install -U pip setuptools wheel
pip install spacy

要安装额外的数据表以进行列举化和规范化,可以运行pip install spacy[lookups]或安装spacy-lookups-data分开的。使用列举化数据创建空白模型需要使用查找包,并需要使用尚未附带预先训练的模型和第三方库支持的语言进行词汇化

使用pip时,一般建议在虚拟环境中安装包,避免修改系统状态:

python -m venv .env
source .env/bin/activate
pip install -U pip setuptools wheel
pip install spacy

孔达

您也可以从安装Spacyconda通过conda-forge频道。有关原料(包括构建配方和配置),请查看this repository

conda install -c conda-forge spacy

更新空间

Spacy的一些更新可能需要下载新的统计模型。如果您运行的是spacy v2.0或更高版本,则可以使用validate命令检查您安装的型号是否兼容,如果不兼容,则打印有关如何更新它们的详细信息:

pip install -U spacy
python -m spacy validate

如果您训练过自己的模型,请记住您的训练和运行时输入必须匹配。更新Spacy后,我们建议重新培训您的模型使用新版本

📖有关从spacy 2.x升级到spacy 3.x的详细信息,请参阅migration guide

📦下载模型包

经过培训的空间管道可以安装为Python包这意味着它们是应用程序的一个组件,就像任何其他模块一样。可以使用Spacy的安装模型download命令,或通过将pip指向路径或URL手动执行

文档
Available Pipelines 详细的管道描述、精度数字和基准
Models Documentation 详细的使用和安装说明
Training 如何根据您的数据培训您自己的管道
# Download best-matching version of specific model for your spaCy installation
python -m spacy download en_core_web_sm

# pip install .tar.gz archive or .whl from path or URL
pip install /Users/you/en_core_web_sm-3.0.0.tar.gz
pip install /Users/you/en_core_web_sm-3.0.0-py3-none-any.whl
pip install https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.0.0/en_core_web_sm-3.0.0.tar.gz

加载和使用模型

要加载模型,请使用spacy.load()使用模型名称或模型数据目录的路径

import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("This is a sentence.")

您还可以import直接通过其全名创建模型,然后调用其load()不带参数的方法

import spacy
import en_core_web_sm

nlp = en_core_web_sm.load()
doc = nlp("This is a sentence.")

📖有关更多信息和示例,请查看models documentation

⚒从源代码编译

安装Spacy的另一种方法是克隆其GitHub repository并从源头上建造它。如果您想要更改代码库,这是常用的方法。您需要确保您有一个由Python发行版组成的开发环境,其中包括头文件、编译器pipvirtualenvgit已安装。编译器部分是最棘手的。如何做到这一点取决于您的系统

站台
Ubuntu 通过以下方式安装系统级依赖项apt-getsudo apt-get install build-essential python-dev git
Mac 安装最新版本的XCode包括所谓的“命令行工具”。MacOS和OS X附带预装的Python和Git
窗口 安装一个版本的Visual C++ Build ToolsVisual Studio Express与用于编译Python解释器的版本相匹配

有关更多详细信息和说明,请参阅上的文档compiling spaCy from source以及quickstart widget获取适合您的平台和Python版本的正确命令

git clone https://github.com/explosion/spaCy
cd spaCy

python -m venv .env
source .env/bin/activate

# make sure you are using the latest pip
python -m pip install -U pip setuptools wheel

pip install -r requirements.txt
pip install --no-build-isolation --editable .

要与附加软件一起安装,请执行以下操作:

pip install --no-build-isolation --editable .[lookups,cuda102]

🚦运行测试

Spacy伴随着一个extensive test suite为了运行测试,您通常需要克隆存储库并从源代码构建空间。这还将安装在中定义的所需开发依赖项和测试实用程序requirements.txt

或者,您可以运行pytest在已安装的spacy包裹。别忘了也要通过Spacy的安装测试实用程序requirements.txt

pip install -r requirements.txt
python -m pytest --pyargs spacy

D2l-zh 动手学深度学习

本开源项目代表了我们的一种尝试:我们将教给读者概念、背景知识和代码;我们将在同一个地方阐述剖析问题所需的批判性思维、解决问题所需的数学知识,以及实现解决方案所需的工程技能.

我们的目标是创建一个为实现以下目标的统一资源:

  1. 所有人均可在网上免费获取;
  2. 提供足够的技术深度,从而帮助读者实际成为深度学习应用科学家:既理解数学原理,又能够实现并不断改进方法;
  3. 包含可运行的代码,为读者展示如何在实际中解决问题.这样不仅直接将数学公式对应成实际代码,而且可以修改代码、观察结果并及时获取经验;
  4. 允许我们和整个社区不断快速迭代内容,从而紧跟仍在高速发展的深度学习领域;
  5. 由包含有关技术细节问答的论坛作为补充,使大家可以相互答疑并交换经验.
将本书(中英文版)用作教材或参考书的大学

如果本书对你有帮助,请星空(★)本仓库或引用本书的英文版:

@article{zhang2021dive,
    title={Dive into Deep Learning},
    author={Zhang, Aston and Lipton, Zachary C. and Li, Mu and Smola, Alexander J.},
    journal={arXiv preprint arXiv:2106.11342},
    year={2021}
}

本书的第二版

虽然纸质书第一版已经出版,但深度学习领域依然在迅速发展.为了得到来自更广泛的英文开源社区的帮助,从而提升本书质量,本书的第二版正在用英文写.英文版正不断被搬回中文版中.

目前,英文版已超过160节(中文版共96节),例如增加了理论背景(如优化收敛分析)、硬件设计(如参数服务器)、全新篇章(如注意力机制、推荐系统、深度学习的数学、生成对抗网络)、应用种类(如自然语言推理)、模型种类(如变压器、BERT)等,并优化重组了大量章节(如将自然语言处理篇章按从预训练表征、到模型设计、再到下游应用重构)。

欢迎关注本书第二版的英文开源项目

中英文教学资源

加州大学伯克利分校2019年年春学期Introduction to Deep Learning 课程教材(同时提供含教学视频地址的中文版课件).

学术界推荐

“如果你想深入学习,那就看看这本书吧!”

-韩家炜,acm院士、ieee院士,美国伊利诺伊大学香槟分校计算机系Michael Aiken主席教授

“这对机器学习文献来说是一个非常受欢迎的补充。”

–Bernhard Schölkopf,acm院士、德国国家科学院院士,德国马克斯·普朗克研究所智能系统院院长

“书中代码可谓‘所学即所用’。”

-周志华,acm院士、ieee院士、aaas院士,南京大学计算机科学与技术系主任

“这本书可以帮助深度学习实践者快速提升自己的能力”

-张潼,asa院士、ims院士,香港科技大学计算机系和数学系教授

工业界推荐

“一本优秀的深度学习教材,值得任何想了解深度学习何以引爆人工智能革命的人关注”

-黄仁勋,NVIDIA创始人兼首席执行官

“”动手学深度学习“是最适合工业界研发工程师学习的.我毫无保留地向广大的读者们强烈推荐。”

-余凯,地平线公司创始人&首席执行官

“强烈推荐这本书!我特别赞赏这种手脑一体的学习方式”

-漆远,蚂蚁金服副总裁、首席AI科学家

“”动手学深度学习“是一本很容易让学习者上瘾的书。”

–沈强,将门创投创始合伙人

贡献

感谢社区贡献者们为每一位读者改进这本开源书.

如何贡献|致谢|讨论或报告问题|其他

MadeWithML 了解如何通过ML负责任地交付产品

基础知识

通过直观的解释、干净的代码和可视化学习ML的基础

🔢三个基金会 📈数据建模 🤖*深度学习
Notebooks Linear Regression CNNs
Python Logistic Regression Embeddings
NumPy Neural Network RNNs
Pandas Data Quality Transformers
PyTorch Utilities

📆更多话题即将到来!
Subscribe查看我们每月更新的新内容

MLOPS

了解如何应用ML来构建生产级产品以交付价值

📦新产品 📝使用脚本编写 ♻️*可重现性
Objective Organization Git
Solution Packaging Pre-commit
Iteration Documentation Versioning
🔢三个数据 Styling Docker
Labeling Makefile 🚀三个产品的生产
Preprocessing Logging Dashboard
Exploratory data analysis 📦3个接口 CI/CD workflows
Splitting Command-line Infrastructure
Augmentation RESTful API Monitoring
📈数据建模 ✅测试结果: Pipelines
Evaluation Code Feature store
Experiment tracking Data
Optimization Models

📆每个月都有新的课程!
Subscribe查看我们每月更新的新内容

常见问题解答

这个内容是为谁准备的?

  • Software engineers希望学习ML并成为更好的软件工程师
  • Data scientists谁想了解如何通过ML负责任地交付价值
  • College graduates希望学习该行业所需的实用技能
  • Product Managers谁想为ML应用程序开发技术基础

它的结构是什么?

课程将每周发布一次,每节课程包括:

  • intuition:将涵盖的概念及其如何组合在一起的高级概述
  • code:说明概念的简单代码示例
  • application:将概念应用于我们的具体任务
  • extensions:简要介绍适用于不同情况的其他工具和技术

是什么让这个内容独一无二的呢?

  • hands-on:如果您在线搜索Production ML或MLOps,您会找到很棒的博客帖子和tweet。但是为了真正理解这些概念,您需要实现它们。不幸的是,由于规模、专有内容和昂贵的工具,您没有看到很多运行Production ML的内部工作原理。然而,Made with ML是免费的、开放的和活生生的,这使得它成为社区完美的学习机会
  • intuition-first:我们永远不会直接跳到代码上去。在每节课中,我们都会培养对概念的直觉,并从产品的角度来思考。
  • software engineering:本课程不只是关于ML。事实上,它主要是关于干净的软件工程!我们将介绍一些重要的概念,如版本控制、测试、日志记录等,它们可以真正成为生产级产品
  • focused yet holistic:对于每个概念,我们不仅会介绍对我们的特定任务最重要的内容(这是案例研究方面),而且还会介绍相关的方法(这是指导方面),这些方法在其他情况下可能会被证明是有用的

作者是谁?

  • 我在苹果公司部署了大规模ML系统,也在初创公司部署了受约束的较小系统,我想与大家分享我学到的共同原则
  • 与我保持联系TwitterLinkedIn

为什么这个是免费的?

虽然这个内容是为每个人准备的,但它特别针对那些没有太多学习机会的人。我相信创造力和智慧是随机分布的,而机会是孤立的。我想让更多的人创造并为创新做出贡献


要引用此内容,请使用:

@misc{madewithml,
    title  = "Made With ML",
    author = "Goku Mohandas",
    url    = "https://madewithml.com/"
    year   = "2021",
}