多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Python Machine Learning 仓库 movie 数据集指南:50,000 条 IMDb 影评的二分类 CSV 构建与实战用法

Python Machine Learning 仓库 movie 数据集指南:50,000 条 IMDb 影评的二分类 CSV 构建与实战用法 Python Machine Learning 仓库 movie 数据集指南50,000 条 IMDb 影评的二分类 CSV 构建与实战用法【免费下载链接】python-machine-learning-bookThe Python Machine Learning (1st edition) book code repository and info resource项目地址: https://gitcode.com/gh_mirrors/py/python-machine-learning-book本文围绕python-machine-learning-book仓库中 code/datasets/movie/README.md 所描述的电影评论数据集展开系统说明该数据集的来源、CSV 结构、极性标注约定与训练/测试划分方式并结合仓库中第 8 章情感分析与第 9 章Web 应用部署的实际代码演示如何读取、清洗、训练分类器以及进行流式out-of-core学习。读完本文你将能直接基于movie_data.csv复现仓库中完整的 IMDb 影评情感分类流程并理解该数据集在全书中的定位与使用前提。数据集概览它是什么用在哪movie是《Python Machine Learning第 1 版》仓库中随书提供的补充数据集之一code/datasets/README.md 一并收录了 iris、wine、wdbc、housing、mnist 等经典数据集。它的原型是斯坦福大学发布的Large Movie Review Dataset v1.0IMDb 影评数据集经过预处理后被转换为便于 pandas 直接读取的 2 列 CSV 格式review评论文本内容sentiment情感极性标签0 负面negative1 正面positive。按文档说明该数据集被用于第 8 章Applying Machine Learning to Sentiment Analysis和第 9 章Embedding a Machine Learning Model into a Web Application。这与仓库中的章节结构完全吻合第 8 章围绕获取 IMDb 影评数据集 → 词袋模型 → 逻辑回归 → 在线学习展开第 9 章则将训练好的分类器序列化并嵌入 Flask Web 应用。数据来源斯坦福大学 Andrew Maas 等人的 Large Movie Review Dataset原始发布地址为http://ai.stanford.edu/~amaas/data/sentiment/。本仓库仅保留转换后的 CSV 压缩包不包含原始aclImdb目录结构。文件构成与解压方式code/datasets/movie/目录下实际包含两个文件文件说明README.md数据集元信息说明即本篇文章所依据的文档movie_data.csv.zip压缩后的 CSV 数据约 25 MB使用 Python 标准库即可解压并预览内容无需安装额外工具import zipfile with zipfile.ZipFile(code/datasets/movie/movie_data.csv.zip) as z: print(z.namelist()) # [movie_data.csv, __MACOSX/, __MACOSX/._movie_data.csv] with z.open(movie_data.csv) as f: for _ in range(3): print(f.readline().decode(utf-8, replace)[:120])解压后得到movie_data.csv约 50,000 行 1 行表头。第一行表头为review,sentiment从仓库实际数据可以验证评论文本中保留了原始网页的br /br /等 HTML 标签因此第 8 章的预处理步骤专门针对这类噪声进行了清洗详见下文结合源码看数据如何使用。CSV 结构、标注约定与训练/测试划分README 明确了三条关键约定它们直接决定了后续所有代码切分数据的方式两列结构第一列review存文本第二列sentiment存极性标签标签语义0表示负面评价1表示正面评价样本划分前 25,000 行是训练样本剩余 25,000 行是测试样本分别对应原始 Large Movie Review Dataset v1.0 中的train与test子集。仓库代码正是按照行号边界来切分的例如 code/optional-py-scripts/ch08.py 中X_train df.loc[:25000, review].values y_train df.loc[:25000, sentiment].values X_test df.loc[25000:, review].values y_test df.loc[25000:, sentiment].values注意这里使用了loc[:25000]与loc[25000:]的写法由于 DataFrame 的行索引从 0 开始前 25,000 个样本实际对应索引 024999loc[:25000]会额外包含索引 25000 这一行即测试集的第一个样本在严格复现精度时会有一个样本的偏差如需严格切分应改用df.iloc[:25000]与df.iloc[25000:]。这也是从源码结构中可以推断出的一个值得注意的细节。原始数据在转换时经过了随机重排见源码中被注释的构建逻辑其中使用np.random.seed(0)并reindex(np.random.permutation(df.index))因此 CSV 中训练/测试两部分各自内部的顺序是打乱的但两部分的边界仍然严格保持前 25,000 / 后 25,000。结合源码看数据如何使用第 8 章完整实战链路第 8 章的核心代码在 code/optional-py-scripts/ch08.py对应ch08.ipynb。文件开头有一段被注释掉的、从原始aclImdb目录构建 CSV 的逻辑它展示了movie_data.csv的生成过程遍历train/test下的pos/neg目录、逐文件读取、标注pos→1, neg→0、随机重排后to_csv。当前仓库直接使用已转换好的文件df pd.read_csv(../datasets/movie/movie_data.csv)文本清洗由于原始影评带 HTML 标签与表情符号第 8 章定义了preprocessordef preprocessor(text): text re.sub([^]*, , text) # 去除 HTML 标签 emoticons re.findall((?::|;|)(?:-)?(?:\)|\(|D|P), text) # 抽取表情 text re.sub([\W], , text.lower()) \ .join(emoticons).replace(-, ) return text它对/aThis :) is :( a test :-)!的清洗结果为this is a test :) :( :)——HTML 标签被剔除、文本转小写、非单词字符替换为空格、表情符号被保留并统一格式。随后df[review] df[review].apply(preprocessor)应用到全量 50,000 条数据。分词与去停用词第 8 章比较了普通分词与 Porter 词干化两种 tokenizer并使用 NLTK 的英文停用词表from nltk.stem.porter import PorterStemmer porter PorterStemmer() def tokenizer(text): return text.split() def tokenizer_porter(text): return [porter.stem(word) for word in text.split()] stop stopwords.words(english)tokenizer_porter(runners like running and thus they run)会输出[runner, like, run, and, thus, they, run]说明词干化把runners/running/run归并到了同一词根run从而降低特征空间的冗余。逻辑回归 网格搜索模型侧使用PipelineTfidfVectorizer → LogisticRegression并通过 5 折交叉验证在 3 组参数网格上搜索最优配置候选参数包括ngram_range、stop_words、tokenizer、penaltyl1/l2与正则化强度C1.0/10.0/100.0tfidf TfidfVectorizer(strip_accentsNone, lowercaseFalse, preprocessorNone) param_grid [{vect__ngram_range: [(1, 1)], vect__stop_words: [stop, None], vect__tokenizer: [tokenizer, tokenizer_porter], clf__penalty: [l1, l2], clf__C: [1.0, 10.0, 100.0]}, ...] lr_tfidf Pipeline([(vect, tfidf), (clf, LogisticRegression(random_state0))]) gs_lr_tfidf GridSearchCV(lr_tfidf, param_grid, scoringaccuracy, cv5, verbose1, n_jobs-1) gs_lr_tfidf.fit(X_train, y_train) clf gs_lr_tfidf.best_estimator_ print(Test Accuracy: %.3f % clf.score(X_test, y_test))书中在该数据集上得到的测试准确率约为0.89约 89%可作为自行复现时的参考基线。大数据场景流式out-of-core学习针对 50,000 条影评在内存中的处理成本第 8 章还演示了基于HashingVectorizer SGDClassifier.partial_fit的在线学习方案这正是 README 所述前 25,000 训练 / 后 25,000 测试划分在流式场景下的另一重用法def stream_docs(path): with open(path, r, encodingutf-8) as csv: next(csv) # skip header for line in csv: text, label line[:-3], int(line[-2]) yield text, label vect HashingVectorizer(decode_errorignore, n_features2**21, preprocessorNone, tokenizertokenizer) clf SGDClassifier(losslog, random_state1, n_iter1) for _ in range(45): X_train, y_train get_minibatch(doc_stream, size1000) if not X_train: break X_train vect.transform(X_train) clf.partial_fit(X_train, y_train, classesnp.array([0, 1]))注意stream_docs中text, label line[:-3], int(line[-2])的解析方式依赖 CSV 行尾格式标签位于倒数第 2 个字符、行尾为换行符这是针对该数据文件格式的一个实现细节。HashingVectorizer使用 2^21 个哈希桶不依赖完整词表即可增量更新SGDClassifier通过partial_fit每次消费 1,000 条的小批量。第 9 章从 CSV 到可部署的影评分类 Web 应用第 9 章把上述模型产物化先用 pickle 序列化分类器与停用词表再用 Flask 搭建可交互的 Web 应用。仓库 code/ch09/pickle-test-scripts/README.md 明确指出这些测试脚本就是从第 8 章相关代码裁剪而来用于验证 pickle 流程是否正常执行python pickle-dump-test.py会基于movie_data_small.csv一个极小的movie_data.csv子集格式完全一致同样为review,sentiment两列训练一个迷你分类模型并生成stopwords.pkl与classifier.pkl两个文件随后执行python pickle-load-test.py应输出Prediction: positive Probability: 85.71%这正是从 CSV 到序列化模型再到应用全链路的自检实验。完整的 Web 应用位于 code/ch09/movieclassifier/其 app.py 中用户提交影评后调用classify(review)返回预测标签与概率train(review, y)与sqlite_entry(db, review, y)则把用户反馈写入reviews.sqlite实现增量更新movieclassifier_with_update/目录即该能力的扩展版。这也解释了为什么 README 强调该数据集同时服务于第 8、9 两章——模型训练、序列化、Web 交互、数据库反馈四者共用同一份review/sentiment数据结构。在本地复现的完整步骤以下步骤在仓库根目录下即可完成且无需修改任何仓库文件解压数据使用任意 Python 3 环境import zipfile with zipfile.ZipFile(code/datasets/movie/movie_data.csv.zip) as z: z.extract(movie_data.csv, path/tmp/)直接复用仓库脚本脚本内已用相对路径定位到../datasets/movie/movie_data.csvpython3 code/optional-py-scripts/ch08.py注意脚本中的网格搜索GridSearchCVcv5、n_jobs-1在完整数据上计算量较大可先缩减param_grid或改用movie_data_small.csv验证流程。验证 pickle 链路cd code/ch09/pickle-test-scripts python pickle-dump-test.py python pickle-load-test.py启动 Web 应用按 code/ch09/README.md 说明cd code/ch09/movieclassifier python3 app.py终端会输出* Running on http://127.0.0.1:5000/浏览器访问该地址即可体验影评情感分类。使用限制与注意事项数据来源与版本本数据集对应 Large Movie Review Dataset v1.0 的转换版本其版权与使用条款以斯坦福大学原始发布页为准格式假设CSV 中的评论文本含br /br /等 HTML 标签标签0/1为数值型若直接套用其他情感数据集需先核对列名与标签语义划分边界训练/测试各 25,000 条、按行号先后排列切分时应与源码保持一致并注意loc[:25000]与iloc[:25000]的边界差异依赖版本ch08.py顶部对 scikit-learn 版本做了兼容处理Version(sklearn_version) 0.18时从sklearn.cross_validation导入GridSearchCV否则从sklearn.model_selection导入且SGDClassifier使用了较老的n_iter参数在现代 scikit-learn 版本下可能需要相应调整流式解析细节stream_docs中line[:-3]/line[-2]的切分方式依赖文件的行尾格式若重新生成 CSV 需同步调整解析逻辑。小结code/datasets/movie/movie_data.csv是本书情感分析双章节第 8、9 章的公共数据基座它以统一的两列 CSV 封装了 50,000 条 IMDb 影评用0/1编码极性并按 25,000/25,000 预先划分训练与测试。从第 8 章的pandas读取、文本清洗、TF-IDF 特征化、逻辑回归网格搜索到流式partial_fit训练再到第 9 章的 pickle 序列化与 Flask 部署整条技术链路都建立在这份数据之上。理解它的结构与约定是复现本书情感分析实验、并将其迁移到自有文本分类任务的第一步。【免费下载链接】python-machine-learning-bookThe Python Machine Learning (1st edition) book code repository and info resource项目地址: https://gitcode.com/gh_mirrors/py/python-machine-learning-book创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表