在解析维基语料库时禁用Gensim删除标点符号等

时间:2017-04-19 16:14:54

标签: python nlp gensim word2vec spacy

我想使用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的预处理,以便它不会删除标点符号等但仍然直接从压缩的维基百科转储中解析维基百科文章到文本?或者有人知道更好的方法来实现这一目标吗?提前致谢!

2 个答案:

答案 0 :(得分:0)

如果spacy在句子级别上运行,我不会感到惊讶。为此,它很可能使用句子边界(点,问号等)。这就是为什么spacy NER(或者甚至是管道中早期的POS Tagger)可能会失败的原因。

至于为gensim的LSI表示命名实体的方式 - 我建议添加一个人工识别器(一个不存在的单词)。从模型的角度来看,它没有任何区别,它可以为您节省重新进行gensim预处理的负担。

您可能需要参考model.wv.vocab model = gensim.models.Word2Vec(...),因为您需要两次训练模型。或者,尝试从原始文本创建词汇集,并选择词汇表中不存在的随机字母集。

答案 1 :(得分:0)

您可以在spaCy中使用gensim word2vec预训练模型,但是这里的问题是您处理管道的顺序:

  1. 您将文本传递给gensim
  2. Gensim解析并标记字符串
  3. 您将令牌标准化
  4. 您将令牌传递回spaCy
  5. 您创建了一个w2v语料库(带有spaCy)(?)

这意味着当spaCy获取文档时,文档已被标记化,是的,它的NER很...复杂:https://www.youtube.com/watch?v=sqDHBH9IjRU

您可能想做的是:

  1. 您将文本传递给spaCy
  2. spaCy使用 NER
  3. 解析它们
  4. spaCy相应地标记它们,将实体保留为一个标记
  5. 您使用spacy.load()加载gensim w2v模型
  6. 您使用加载的模型在spaCy中创建w2v语料库

您需要做的就是从gensim下载模型,并告诉spaCy从命令行查找它:

  1. wget [模型网址]
  2. python -m初始化模型[选项] [您刚刚下载的文件]

以下是init-model的命令行文档:https://spacy.io/api/cli#init-model

然后像en_core_web_md一样加载它,例如您可以使用.txt,.zip或.tgz模型。