我想在英语维基百科上使用 python 和 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 的预处理,这样它就不会删除标点符号等,但仍会将维基百科文章直接从压缩的维基百科转储中解析为文本?或者有人知道更好的方法来完成这个吗?提前致谢!
最佳答案
如果 spacy 在句子层面上运行,我不会感到惊讶。为此,很可能使用句子边界(点、问号等)。这就是为什么 spacy NER(或者甚至可能是管道中更早的 POS Tagger)可能对你失败。
至于为 gensim 的 LSI 表示命名实体的方式——我建议添加一个人工标识符(一个不存在的词)。从模型的角度来看,它没有任何区别,它可以节省您返工 gensim 预处理的负担。
您可能需要引用 model.wv.vocab
,其中 model = gensim.models.Word2Vec(...)
为此,您必须训练模型两次。或者,尝试从原始文本创建一个词汇集,并随机选择词汇表中不存在的一组字母。
关于python - 在解析 wiki 语料库时禁用 Gensim 删除标点符号等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43500996/