gensim.corpora.WikiCorpus是否仅支持bz2文件?如何提取维基转储文本?
维基百科转储文本提取方案
gensim.corpora.WikiCorpus 原生支持直接读取.gz格式的维基转储文件,不需要手动转换为bz2格式,手动转换反而可能因为参数问题导致文件结构损坏,无法被类识别。
方法1:直接调用WikiCorpus提取(最简方案)
直接传入原始.gz转储文件路径即可,参考实现代码:
from gensim.corpora import WikiCorpus # 替换为你的本地转储文件路径与输出路径 input_dump = "zhwiki-latest-pages-articles.xml.gz" output_text = "wiki_extracted.txt" # 初始化时传入dictionary={}跳过构建词典步骤,仅提取文本 wiki = WikiCorpus(input_dump, dictionary={}) with open(output_text, "w", encoding="utf-8") as f: # get_texts()返回每篇文章的分词列表,拼接后写入 for article in wiki.get_texts(): f.write(" ".join(article) + "\n")
如果运行仍报错,先做两项检查:
- 确认下载的是标准xml格式的全量文章转储包,而非元数据、摘要类的衍生转储文件
- 终端执行
gzip -t 你的文件名.gz检查压缩包是否完整,排除下载损坏问题
方法2:底层手动解析(兼容性更强)
如果WikiCorpus的封装不符合你的需求,或者仍读取失败,可以用gzip加xml解析模块手动提取,不需要依赖gensim的封装,可自定义过滤规则:
import gzip from xml.sax import make_parser from xml.sax.handler import ContentHandler class WikiTextExtractor(ContentHandler): def __init__(self, output_path): self.in_page = False self.in_text_tag = False self.current_content = [] self.out_file = open(output_path, "w", encoding="utf-8") def startElement(self, tag, attrs): if tag == "page": self.in_page = True if tag == "text" and self.in_page: self.in_text_tag = True def characters(self, content): if self.in_text_tag: self.current_content.append(content) def endElement(self, tag): if tag == "text": self.in_text_tag = False full_text = "".join(self.current_content).strip() # 过滤重定向页面、非正文命名空间页面 if not full_text.startswith("#REDIRECT") and ":" not in full_text.split("\n")[0]: self.out_file.write(full_text.replace("\n", " ") + "\n") self.current_content = [] if tag == "page": self.in_page = False # 替换为你的输入输出路径 with gzip.open("你的转储文件路径.gz", "rb") as compressed_file: parser = make_parser() parser.setContentHandler(WikiTextExtractor("wiki_extracted.txt")) parser.parse(compressed_file)
提取完成后,输出的txt文件每一行对应一篇维基文章的正文内容,你可以按需做分词、去停用词等预处理后,直接送入gensim.models.Word2Vec训练即可。
如果处理的是中文维基转储,可额外用opencc工具批量将提取的文本统一转换为简体,避免简繁差异影响训练效果。
内容的提问来源于stack exchange,提问作者user10679548
相关产品推荐
相关产品推荐

