美文网首页
Corpora and Vector Spaces语料库和向量空

Corpora and Vector Spaces语料库和向量空

作者: 范_2e8a | 来源:发表于2019-04-17 14:55 被阅读0次

    本教程在Jupyter Notebook上可获取

    或者在notebook在线运行(不需要安装),通过binder project:

    不要忘了设置

    如果你想看到logging的输出

    从字符串到向量

    这一次,从把文档表示成字符串开始:

    这是一个小的语料库,只有9个文本,每个里面只包含一个句子。

    首先, 让我们把文档token化, 删除常见的单词 (使用停用词表) 以及只出现在语料库中一次的单词:

    您处理文件的方式可能会有所不同;在这里, 我只是用空格分词, 然后是小写每个单词。事实上, 我使用这个特殊的 (简单和低效) 设置来模拟 Deerwester 等人的原始 LSA 文章 [1] 中所做的实验。

    处理文档的方法千差万别, 依据应用场景和语言的不同而不同, 因此我决定不通过任何接口来约束它们。相反, 文档由从中提取的特征表示, 而不是由其 "表面" 字符串形式表示: 如何得到特征取决于您。下面我描述了一种常见的通用方法 (称为词袋模型), 但请记住, 不同的应用程序领域需要不同的特征, 而且, 像往常一样, 它的输入垃圾, 输出垃圾..。

    要将文档转换为向量, 我们将使用称为 "词袋模型" 的文档表示形式。在此表示形式中, 每个文档由一个向量表示, 其中每个向量元素表示一个问答对, 其样式为:

    "单词系统(system)在文档中出现多少次?一次。”

    仅由问题 (整数) id 表示问题是有益处的。问题和 id 之间的映射称为字典。

    要将标记文档实际转换为向量, 请执行以下操作:

    在这里, 我们为语料库中出现的所有单词每个单词分配了一个唯一的整数 id, 其中包含 gensim.corpora.dictionary.Dictionary 类。这个类包含了文本, 收集字数和相关统计数据。最后, 我们看到在处理的语料库中有十二个不同的单词, 这意味着每个文档将由12个数字 (即, 由一个12维的 向量表示)。要查看单词和它们的 id 之间的映射, 请执行以下操作:

    函数 doc2bow () 计算每个不同单词的出现次数, 将单词转换为其整数单词 id, 并将结果返回为稀疏向量。稀疏向量 [(0, 1), (1, 1)],读: 在文本 "人的计算机互作用"中, 词计算机 (id 0) 和人 (id 1) 出现一次;其他十个字典单词出现 (隐含的) 零次。

    到现在应该很清楚, id=10的矢量功能代表的问题是 "单词graph 在文档中出现多少次?", 前六个文档的答案是 "零", 其余三份文档的答案是 "零"。事实上, 我们已经得出了与快速示例中完全相同的向量体。

    语料库流媒体–一次一个文档

    请注意, 上面的语料库完全驻留在内存中, 作为一个普通的 Python 列表。在这个简单的例子中, 这并不重要, 但仅仅为了把事情说清楚, 让我们假设语料库中有数百万个文档。将它们都存储在 RAM 中是不行的。相反, 假设文档存储在磁盘上的文件中, 每行一个文档。Gensim 只要求语料库必须能够一次返回一个文档向量:

    在此处下载 示例 mycorpus.txt  文件样本。假定每个文档在每个文件中占用一行并不重要;您可以模块化 _ iter _ 函数, 以适应您的输入格式, 无论它是什么。遍历文件目录, 解析 XML, 访问网络..。只需分析您的输入, 以检索每个文档中的token列表, 然后通过字典将token转换为其 id, 并在 _ iter _ _ 中生成生成的稀疏向量。

    语料库现在是一个对象。我们没有定义任何打印方式, 因此只打印内存中对象的输出地址。不是很有用。若要查看组成向量, 让我们遍历语料库并打印每个文档向量 (一次打印一个):

    尽管输出与普通 Python 列表相同, 但语料库现在更内存友好, 因为最多一次只有一个向量驻留在 RAM 中。您的语料库现在可以尽可能大。

    类似地, 要在不将所有文本加载到内存中的情况下构造字典, 请执行以下建议:

    而这就是它的全部!至少就词袋模型表达的问题而言。当然, 我们如何处理这样的语料库是另一个问题;还不清楚计算不同词的频率有何用处。事实证明, 事实并非如此, 我们需要首先对这个简单的表示应用转换, 然后才能使用它来计算任何有意义的文档与文档相似性。下一教程将介绍转换, 但在此之前, 让我们简单地将注意力转向语料库持久性。

    语料库格式

    有几种文件格式用于将向量空间语料库 (~ 向量序列) 序列化到磁盘。Gensim 通过前面提到的流媒体语料库接口实现它们: 文档以懒散的方式从磁盘 (存储到) 磁盘中读取, 一次一个文档, 而不会同时将整个语料库读入主内存。

    更引人注目的文件格式之一是市场矩阵格式。要以矩阵市场格式保存语料库, 请执行以下操作:

    其他的格式包含Joachim’s SVMlight formatBlei’s LDA-C format and GibbsLDA++ format.

    相反, 要从矩阵市场文件加载语料库迭代器:

    语料库对象是流, 因此通常无法直接打印它们:

    实际上, 要查看语料库的内容:

    or

    第二种方法显然更内存友好, 但出于测试和开发目的, 没有什么比调用列表 (语料库) 的简单性更简单的了。

    要以 Blei 的 LDA-C 格式保存相同的矩阵市场文档流,

    通过这种方式, gensim 还可以用作内存高效的 i/o 格式转换工具: 只需使用一种格式加载文档流, 并立即将其保存为另一种格式即可。添加新格式很容易, 请查看 SVMlight 语料库的代码以了解示例。

    与 NumPy 和SciPy的兼容性

    Gensim 还包含有效的实用程序函数, 以帮助从在numpy矩阵中来回转换

    和from/to scipy的稀疏的矩阵

    要获得完整的参考 (要将字典修剪到较小的大小?优化语料库和 Numpy/scy 阵列之间的转换?), 请参阅 API 文档。或者继续下一个关于主题和转换的教程

    [1]This is the same corpus as used in Deerwester et al. (1990): Indexing by Latent Semantic Analysis, Table 2.

    相关文章

      网友评论

          本文标题:Corpora and Vector Spaces语料库和向量空

          本文链接:https://www.haomeiwen.com/subject/xmygwqtx.html