我很想制作一个doc2vec / word2vec数据集,该数据集能够回溯或记住其原始位置。现在,我想知道它来自哪个行或txt文件,但将来甚至会知道它的原始段落。例如,我希望能够使用多个txt文件或一个csv来实现。
搜索类似的代码或类似想法没有任何道理。因此,我很好奇是否有人知道如何或者甚至完全可以做到; 嵌入或让单词记住其原始位置(文档)。
示例输入:
Author | Title | d2v_text
———————————————————————————————————————————————————————————————————————————
0 Name 1 | Title 1 | this is the first text. first text paragraph.
1 Name 2 | Title 2 | this is the second text. second text paragraph.
2 Name 3 | Title 3 | this is the thirth text. thirth text paragraph.
Name1Title1.txt (this is the first text. first text paragraph)
Name2Title2.txt (this is the second text. second text paragraph)
Name3Title3.txt (this is the thirth text. thirth text paragraph)
示例输出:
(‘second’, 0.2384900293, ‘Name2Title2’)
(‘text’,0.34948302,’Name1Title1,Name2Title2,Name3Title3’)
w1 = [“text”]
model.wv.most_similar (positive=w1,topn=1)
[(‘second’, 0.2384900293, ‘Name2Title2’)]
我想实现的是,当从数据集中加载并打印某个矢量时,它将知道其原始文档。有人可以帮我吗?
答案 0 :(得分:2)
这些模型不存储他们的训练数据-他们只是在每次训练通过时观察它们,以为每个单词或文档建立向量模型。
对于Doc2Vec
文档向量,传统上是用原始文档的一些唯一键来命名文档向量,例如ID号或文件名。因此,对于doc-vector,报告结果的标签可能已经提供了您需要的密钥。
对于单词,当您想要一个单词出现在所有文档的列表中时,两种传统方法是:
grep
一样,强行扫描,在其中您可以查看每个文档中的每个单词,并返回出现单词的文档列表。例如,如果您的目录中包含Name1Title1.txt
等文件,则命令grep -l -E '(^|\W)second(\W|$)' *.txt
将打印包含单词second
的那些文件。当然,在大型语料库上这是非常缓慢的。
构建一个 inverted index ,其中的文档包含哪些单词。然后,在进行一次扫描和建立/存储索引之后,查找任何单词的文档列表非常快捷。这是启用全文搜索引擎的基础技术。
一个简单的倒排索引只需要几行Python:
from collections import defaultdict
docs = ( # tuples of doc-name, words
('Name1Title1.txt', "this is the first text. first text paragraph".split()),
('Name2Title2.txt', "this is the second text. second text paragraph".split()),
('Name3Title3.txt', "this is the thirth text. thirth text paragraph".split()),
)
inv_index = defaultdict(list)
for title, words in docs:
for word in set(words):
inv_index[word].append(title)
然后,出现一个单词的所有文档的列表都是一个简单的查找:
>>> inv_index['second']
['Name2Title2.txt']
>>> inv_index['this']
['Name1Title1.txt', 'Name2Title2.txt', 'Name3Title3.txt']
倒排索引可能非常大,因此经常使用其他数据结构来提高压缩性,包括基于文件的索引–因此,如果您的语料库很大,则可能需要研究其他库来进行倒排索引,以便能够建立索引并以一种实用的方式进行查找。