NLP:词中的数学( 五 )
3.2 向量化我们已经将文本转换为基本的数值 。 虽然仍然只是把它们存储在字典中 , 但我们已经从基于文本的世界中走出一步 , 而进入了数学王国 。 接下来我们要一直沿着这个方向走下去 。 我们不使用频率字典来描述文档 , 而是构建词频向量 , 在Python中 , 这可以使用列表来实现 , 但通常它是一个有序的集合或数组 。 通过下列片段可以快速实现这一点:
>>> document_vector = []>>> doc_length = len(tokens)>>> for key, value in kite_counts.most_common():...document_vector.append(value / doc_length)>>> document_vector[0.07207207207207207, 0.06756756756756757, 0.036036036036036036, ..., 0.0045045045045045045]
对于上述列表或者向量 , 我们可以直接对它们进行数学运算 。
提示
我们可以通过多种方式加快对上述数据结构的处理[2] 。 现在我们只是基于基本要素进行处理 , 但很快我们就会想加快上面的步骤 。
如果只处理一个元素 , 那么在数学上没什么意思 。 只有一篇文档对应一个向量是不够的 , 我们可以获取更多的文档 , 并为每篇文档创建其对应的向量 。 但是每个向量内部的值必须都要相对于某个在所有向量上的一致性结果进行计算(即所有文档上有个通用的东西 , 大家都要对它来计算) 。 如果要对这些向量进行计算 , 那么需要相对于一些一致的东西 , 在公共空间中表示一个位置 。 向量之间需要有相同的原点 , 在每个维度上都有相同的表示尺度(scale)或者“单位” 。 这个过程的第一步是计算归一化词项频率 , 而不是像在上一节中那样计算文档中的原始词频 。 第二步是将所有向量都转换到标准长度或维度上去 。
此外 , 我们还希望每个文档向量同一维上的元素值代表同一个词 。 但我们可能会注意到 , 我们写给兽医的电子邮件中不会包含《战争与和平》(War--tt-darkmode-color: #666666;">)中的许多词 。 (也许会 , 谁知道呢?)但是 , 如果允许向量在不同的位置上都包含0 , 那么这也是可以的(事实上也是必要的) 。 我们会在每篇文档中找到独立的词 , 然后将这些词集合求并集后从中找到每个独立的词 。 词汇表中的这些词集合通常称为词库(lexicon) , 这与前面章节中所引用的概念相同 , 只是前面都考虑的是某个特定的语料库 。 下面我们看看比《战争与和平》更短的电影会是什么样子 。 我们去看看Harry , 我们已经有了一篇“文档” , 下面我们用更多的文档来扩充语料库:
>>> docs = ["The faster Harry got to the store, the faster and faster Harry? would get home."]>>> docs.append("Harry is hairy and faster than Jill.")>>> docs.append("Jill is not as hairy as Harry.")
提示
如果我们不只是在计算机上敲出来这段程序 , 而是想一起玩转的话 , 那么可以从nlpia包导入这段程序:from nlpia.data.loaders import harry_docs as docs 。
首先 , 我们来看看这个包含3篇文档的语料库的词库:
>>> doc_tokens = []>>> for doc in docs:...doc_tokens += [sorted(tokenizer.tokenize(doc.lower()))]>>> len(doc_tokens[0])17>>> all_doc_tokens = sum(doc_tokens, [])>>> len(all_doc_tokens)33>>> lexicon = sorted(set(all_doc_tokens))>>> len(lexicon)18>>> lexicon[',', '.', 'and', 'as', 'faster', 'get', 'got', 'hairy', 'harry', 'home', 'is', 'jill', 'not', 'store', 'than', 'the', 'to', 'would']
尽管有些文档并不包含词库中所有的18个词 , 但是上面3篇文档的每个文档向量都会包含18个值 。 每个词条都会被分配向量中的一个槽位(slot) , 对应的是它在词库中的位置 。 正如我们能想到的那样 , 向量中某些词条的频率会是0:
推荐阅读
- Eyeware Beam使用iPhone追踪玩家在游戏中的眼睛运动
- 田伟院士:我眼中的医疗机器人
- Mozilla将默认禁用Firefox中的退格键以防止用户编辑数据丢失
- LG Stylo 7渲染图曝光:没有预想中的重大升级
- 平淡无奇中的暗自升级,2020年主板市场年终盘点
- 手机中的“哈曼卡顿”,小米11又有黑科技曝光
- 谷歌Project Zero披露了Windows中的严重安全漏洞
- 微信推出“微信豆”,可用于购买直播中的虚拟礼物,你会充值吗?
- 曾是盗版中的成功案例,还将正品公司收购,原因是“迷失了”方向
- 谷歌披露存在于高通骁龙Adreno GPU中的高危漏洞