我想使用pyns和gensim在英语维基百科上训练word2vec模型。我密切关注https://groups.google.com/forum/#!topic/gensim/MJWrDw_IvXw。
它适用于我,但我不喜欢生成的word2vec模型是命名实体被拆分,这使得模型不能用于我的特定应用程序。我需要的模型必须将命名实体表示为单个向量。
这就是为什么我计划用spacy解析维基百科文章并将“北卡罗来纳”等实体合并到“north_carolina”中,以便word2vec将它们表示为单个向量。到目前为止一切都很好。
spacy解析必须是预处理的一部分,我最初按照链接讨论中的建议使用:
...
wiki = WikiCorpus(wiki_bz2_file, dictionary={})
for text in wiki.get_texts():
article = " ".join(text) + "\n"
output.write(article)
...
这会删除标点符号,停用单词,数字和大小写,并将每篇文章保存在生成的输出文件中的单独行中。问题是spacy的NER并不能真正处理这个预处理文本,因为我猜它依赖于NER(?)的标点符号和大小写。
有没有人知道我是否可以“禁用”gensim的预处理,以便它不会删除标点符号等但仍然直接从压缩的维基百科转储中解析维基百科文章到文本?或者有人知道更好的方法来实现这一目标吗?提前致谢!
答案 0 :(得分:0)
如果spacy在句子级别上运行,我不会感到惊讶。为此,它很可能使用句子边界(点,问号等)。这就是为什么spacy NER(或者甚至是管道中早期的POS Tagger)可能会失败的原因。
至于为gensim的LSI表示命名实体的方式 - 我建议添加一个人工识别器(一个不存在的单词)。从模型的角度来看,它没有任何区别,它可以为您节省重新进行gensim预处理的负担。
您可能需要参考model.wv.vocab
model = gensim.models.Word2Vec(...)
,因为您需要两次训练模型。或者,尝试从原始文本创建词汇集,并选择词汇表中不存在的随机字母集。
答案 1 :(得分:0)
您可以在spaCy中使用gensim word2vec预训练模型,但是这里的问题是您处理管道的顺序:
这意味着当spaCy获取文档时,文档已被标记化,是的,它的NER很...复杂:https://www.youtube.com/watch?v=sqDHBH9IjRU
您可能想做的是:
您需要做的就是从gensim下载模型,并告诉spaCy从命令行查找它:
以下是init-model的命令行文档:https://spacy.io/api/cli#init-model
然后像en_core_web_md一样加载它,例如您可以使用.txt,.zip或.tgz模型。