[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-Edward1Chou--SentimentAnalysis":3,"tool-Edward1Chou--SentimentAnalysis":64},[4,17,25,39,48,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",138956,2,"2026-04-05T11:33:21",[13,14,15],"开发框架","Agent","语言模型","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":10,"last_commit_at":23,"category_tags":24,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,15],{"id":26,"name":27,"github_repo":28,"description_zh":29,"stars":30,"difficulty_score":10,"last_commit_at":31,"category_tags":32,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[33,34,35,36,14,37,15,13,38],"图像","数据工具","视频","插件","其他","音频",{"id":40,"name":41,"github_repo":42,"description_zh":43,"stars":44,"difficulty_score":45,"last_commit_at":46,"category_tags":47,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,3,"2026-04-04T04:44:48",[14,33,13,15,37],{"id":49,"name":50,"github_repo":51,"description_zh":52,"stars":53,"difficulty_score":45,"last_commit_at":54,"category_tags":55,"status":16},519,"PaddleOCR","PaddlePaddle\u002FPaddleOCR","PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来，转换成计算机可读取的结构化数据，让机器真正“看懂”图文内容。\n\n面对海量纸质或电子文档，PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域，它扮演着连接图像与大型语言模型（LLM）的桥梁角色，能将视觉信息直接转化为文本输入，助力智能问答、文档分析等应用场景落地。\n\nPaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显：不仅支持全球 100 多种语言的识别，还能在 Windows、Linux、macOS 等多个系统上运行，并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目，PaddleOCR 既能满足快速集成的需求，也能支撑前沿的视觉语言研究，是处理文字识别任务的理想选择。",74913,"2026-04-05T10:44:17",[15,33,13,37],{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":45,"last_commit_at":62,"category_tags":63,"status":16},2181,"OpenHands","OpenHands\u002FOpenHands","OpenHands 是一个专注于 AI 驱动开发的开源平台，旨在让智能体（Agent）像人类开发者一样理解、编写和调试代码。它解决了传统编程中重复性劳动多、环境配置复杂以及人机协作效率低等痛点，通过自动化流程显著提升开发速度。\n\n无论是希望提升编码效率的软件工程师、探索智能体技术的研究人员，还是需要快速原型验证的技术团队，都能从中受益。OpenHands 提供了灵活多样的使用方式：既可以通过命令行（CLI）或本地图形界面在个人电脑上轻松上手，体验类似 Devin 的流畅交互；也能利用其强大的 Python SDK 自定义智能体逻辑，甚至在云端大规模部署上千个智能体并行工作。\n\n其核心技术亮点在于模块化的软件智能体 SDK，这不仅构成了平台的引擎，还支持高度可组合的开发模式。此外，OpenHands 在 SWE-bench 基准测试中取得了 77.6% 的优异成绩，证明了其解决真实世界软件工程问题的能力。平台还具备完善的企业级功能，支持与 Slack、Jira 等工具集成，并提供细粒度的权限管理，适合从个人开发者到大型企业的各类用户场景。",70612,"2026-04-05T11:12:22",[15,14,13,36],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":75,"owner_name":76,"owner_avatar_url":77,"owner_bio":78,"owner_company":78,"owner_location":79,"owner_email":80,"owner_twitter":78,"owner_website":78,"owner_url":81,"languages":82,"stars":91,"forks":92,"last_commit_at":93,"license":78,"difficulty_score":10,"env_os":94,"env_gpu":94,"env_ram":94,"env_deps":95,"category_tags":106,"github_topics":107,"view_count":10,"oss_zip_url":78,"oss_zip_packed_at":78,"status":16,"created_at":110,"updated_at":111,"faqs":112,"releases":127},1414,"Edward1Chou\u002FSentimentAnalysis","SentimentAnalysis","文本情感分析","SentimentAnalysis 是一个基于深度学习技术的开源项目，旨在对文本内容进行情感倾向识别。它能够自动分析输入的文字，将其精准分类为“积极”、“中性”或“消极”三种情感状态，帮助机器理解人类语言背后的情绪色彩。\n\n该工具主要解决了非结构化文本难以被计算机量化理解的难题。在传统方法中，简单的关键词匹配往往无法处理复杂的语义转折或多义词汇，而 SentimentAnalysis 通过结合 Word2Vec 词向量技术与 LSTM（长短期记忆）神经网络模型，有效捕捉了词语间的上下文关联及长距离依赖关系。这种架构不仅将文字转化为高维数学向量以保留语义信息，还能像处理图像一样高效编码句子特征，从而显著提升了情感判断的准确率。\n\n该项目非常适合自然语言处理领域的开发者、算法研究人员以及需要构建舆情监控、用户评论分析系统的数据工程师使用。对于希望快速搭建情感分析基线模型或深入探索 RNN 序列处理机制的学习者而言，它也是一份极具参考价值的实践代码。虽然目前定位为基准模型，但其清晰的架构设计为后续优化预留了充足空间，是入门与进阶文本情感分析任务的理想选择。","## 基于LSTM三分类的文本情感分析\n\n### 背景介绍\n\n文本情感分析作为NLP的常见任务，具有很高的实际应用价值。本文将采用LSTM模型，训练一个能够识别文本postive, neutral, negative三种情感的分类器。\n\n本文的目的是快速熟悉LSTM做情感分析任务，所以本文提到的只是一个baseline，并在最后分析了其优劣。对于真正的文本情感分析，在本文提到的模型之上，还可以做很多工作，以后有空的话，笔者可以再做优化。\n\n### 理论介绍\n\n#### RNN应用场景\n\nRNN相对于传统的神经网络，它允许我们对向量序列进行操作：输入序列、输出序列、或大部分的输入输出序列。如下图所示，每一个矩形是一个向量，箭头则表示函数（比如矩阵相乘）。输入向量用红色标出，输出向量用蓝色标出，绿色的矩形是RNN的状态（下面会详细介绍）。从做到右：（1）没有使用RNN的Vanilla模型，从固定大小的输入得到固定大小输出（比如图像分类）。（2）序列输出（比如图片字幕，输入一张图片输出一段文字序列）。（3）序列输入（比如情感分析，输入一段文字然后将它分类成积极或者消极情感）。（4）序列输入和序列输出（比如机器翻译：一个RNN读取一条英文语句然后将它以法语形式输出）。（5）同步序列输入输出（比如视频分类，对视频中每一帧打标签）。我们注意到在每一个案例中，都没有对序列长度进行预先特定约束，因为递归变换（绿色部分）是固定的，而且我们可以多次使用。\n\n![](http:\u002F\u002F7xritj.com1.z0.glb.clouddn.com\u002F16-5-25\u002F61310852.jpg)\n\n\n#### word2vec 算法\n\n建模环节中最重要的一步是特征提取，在自然语言处理中也不例外。在自然语言处理中，最核心的一个问题是，如何把一个句子用数字的形式有效地表达出来？如果能够完成这一步，句子的分类就不成问题了。显然，一个最初等的思路是：给每个词语赋予唯一的编号1,2,3,4...，然后把句子看成是编号的集合，比如假设1,2,3,4分别代表“我”、“你”、“爱”、“恨”，那么“我爱你”就是[1, 3, 2]，“我恨你”就是[1, 4, 2]。这种思路看起来有效，实际上非常有问题，比如一个稳定的模型会认为3跟4是很接近的，因此[1, 3, 2]和[1, 4, 2]应当给出接近的分类结果，但是按照我们的编号，3跟4所代表的词语意思完全相反，分类结果不可能相同。因此，这种编码方式不可能给出好的结果。\n\n读者也许会想到，我将意思相近的词语的编号凑在一堆（给予相近的编号）不就行了？嗯，确实如果，如果有办法把相近的词语编号放在一起，那么确实会大大提高模型的准确率。可是问题来了，如果给出每个词语唯一的编号，并且将相近的词语编号设为相近，实际上是假设了语义的单一性，也就是说，语义仅仅是一维的。然而事实并非如此，语义应该是多维的。\n\n比如我们谈到“家园”，有的人会想到近义词“家庭”，从“家庭”又会想到“亲人”，这些都是有相近意思的词语；另外，从“家园”，有的人会想到“地球”，从“地球”又会想到“火星”。换句话说，“亲人”、“火星”都可以看作是“家园”的二级近似，但是“亲人”跟“火星”本身就没有什么明显的联系了。此外，从语义上来讲，“大学”、“舒适”也可以看做是“家园”的二级近似，显然，如果仅通过一个唯一的编号，是很难把这些词语放到适合的位置的。\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FEdward1Chou_SentimentAnalysis_readme_9b1fca918afd.png)\n\n**Word2Vec：高维来了**\n\n从上面的讨论可以知道，很多词语的意思是各个方向发散开的，而不是单纯的一个方向，因此唯一的编号不是特别理想。那么，多个编号如何？换句话说，将词语对应一个多维向量？不错，这正是非常正确的思路。\n\n为什么多维向量可行？首先，多维向量解决了词语的多方向发散问题，仅仅是二维向量就可以360度全方位旋转了，何况是更高维呢（实际应用中一般是几百维）。其次，还有一个比较实际的问题，就是多维向量允许我们用变化较小的数字来表征词语。怎么说？我们知道，就中文而言，词语的数量就多达数十万，如果给每个词语唯一的编号，那么编号就是从1到几十万变化，变化幅度如此之大，模型的稳定性是很难保证的。如果是高维向量，比如说20维，那么仅需要0和1就可以表达2^20=1048576220=1048576（100万）个词语了。变化较小则能够保证模型的稳定性。\n\n扯了这么多，还没有真正谈到点子上。现在思路是有了，问题是，如何把这些词语放到正确的高维向量中？而且重点是，要在没有语言背景的情况下做到这件事情？（换句话说，如果我想处理英语语言任务，并不需要先学好英语，而是只需要大量收集英语文章，这该多么方便呀！）在这里我们不可能也不必要进行更多的原理上的展开，而是要介绍：而基于这个思路，有一个Google开源的著名的工具——Word2Vec。\n\n简单来说，**Word2Vec就是完成了上面所说的我们想要做的事情——用高维向量（词向量，Word Embedding）表示词语**，并把相近意思的词语放在相近的位置，而且用的是实数向量（不局限于整数）。我们只需要有大量的某语言的语料，就可以用它来训练模型，获得词向量。词向量好处前面已经提到过一些，或者说，它就是问了解决前面所提到的问题而产生的。另外的一些好处是：词向量可以方便做聚类，用欧氏距离或余弦相似度都可以找出两个具有相近意思的词语。这就相当于解决了“一义多词”的问题（遗憾的是，似乎没什么好思路可以解决一词多义的问题。）\n\n关于Word2Vec的数学原理，读者可以参考这系列文章。而Word2Vec的实现，Google官方提供了C语言的源代码，读者可以自行编译。而**Python的Gensim库**中也提供现成的Word2Vec作为子库（事实上，这个版本貌似比官方的版本更加强大）。\n\n#### 句向量\n\n接下来要解决的问题是：我们已经分好词，并且已经将词语转换为高维向量，那么句子就对应着词向量的集合，也就是矩阵，类似于图像处理，图像数字化后也对应一个像素矩阵；可是模型的输入一般只接受一维的特征，那怎么办呢？一个比较简单的想法是将矩阵展平，也就是将词向量一个接一个，组成一个更长的向量。这个思路是可以，但是这样就会使得我们的输入维度高达几千维甚至几万维，事实上是难以实现的。（如果说几万维对于今天的计算机来说不是问题的话，那么对于1000x1000的图像，就是高达100万维了！）\n\n在自然语言处理中，通常用到的方法是递归神经网络或循环神经网络（都叫RNNs）。**它们的作用跟卷积神经网络是一样的，将矩阵形式的输入编码为较低维度的一维向量，而保留大多数有用信息**。\n\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FEdward1Chou_SentimentAnalysis_readme_177f2f9c5d56.png)\n\n\n### Show me the code\n\n工程代码主要是结合参考资料2做三分类的文本情感分析; \n\n\n#### 数据预处理与词向量模型训练\n\n参考资料二中有很翔实的处理过程，包括：\n\n1. 不同类别数据整理成输入矩阵\n2. jieba分词\n3. Word2Vec词向量模型训练\n\n本文中就不做重复介绍了，想要了解的，可以去参考资料二的博文中查找。\n\n三分类除了涉及到positive和negative两种情感外，还有一种neural情感，从原始数据集中可以提取到有语义转折的句子，“然而”，“但”都是关键词。从而可以得到3份不同语义的数据集。\n\n#### LSTM三分类模型\n\n代码需要注意的几点是，第一是，标签需要使用keras.utils.to_categorical来yummy，第二是LSTM二分类的参数设置跟二分有区别，选用softmax，并且loss函数也要改成categorical_crossentropy，代码如下：\n\n```python\ndef get_data(index_dict,word_vectors,combined,y):\n\n    n_symbols = len(index_dict) + 1  # 所有单词的索引数，频数小于10的词语索引为0，所以加1\n    embedding_weights = np.zeros((n_symbols, vocab_dim)) # 初始化 索引为0的词语，词向量全为0\n    for word, index in index_dict.items(): # 从索引为1的词语开始，对每个词语对应其词向量\n        embedding_weights[index, :] = word_vectors[word]\n    x_train, x_test, y_train, y_test = train_test_split(combined, y, test_size=0.2)\n    y_train = keras.utils.to_categorical(y_train,num_classes=3) \n    y_test = keras.utils.to_categorical(y_test,num_classes=3)\n    # print x_train.shape,y_train.shape\n    return n_symbols,embedding_weights,x_train,y_train,x_test,y_test\n\n\n##定义网络结构\ndef train_lstm(n_symbols,embedding_weights,x_train,y_train,x_test,y_test):\n    print 'Defining a Simple Keras Model...'\n    model = Sequential()  # or Graph or whatever\n    model.add(Embedding(output_dim=vocab_dim,\n                        input_dim=n_symbols,\n                        mask_zero=True,\n                        weights=[embedding_weights],\n                        input_length=input_length))  # Adding Input Length\n    model.add(LSTM(output_dim=50, activation='tanh'))\n    model.add(Dropout(0.5))\n    model.add(Dense(3, activation='softmax')) # Dense=>全连接层,输出维度=3\n    model.add(Activation('softmax'))\n\n    print 'Compiling the Model...'\n    model.compile(loss='categorical_crossentropy',\n                  optimizer='adam',metrics=['accuracy'])\n\n    print \"Train...\" # batch_size=32\n    model.fit(x_train, y_train, batch_size=batch_size, epochs=n_epoch,verbose=1)\n\n    print \"Evaluate...\"\n    score = model.evaluate(x_test, y_test,\n                                batch_size=batch_size)\n\n    yaml_string = model.to_yaml()\n    with open('..\u002Fmodel\u002Flstm.yml', 'w') as outfile:\n        outfile.write( yaml.dump(yaml_string, default_flow_style=True) )\n    model.save_weights('..\u002Fmodel\u002Flstm.h5')\n    print 'Test score:', score\n```\n\n#### 测试\n\n代码如下：\n\n```python\ndef lstm_predict(string):\n    print 'loading model......'\n    with open('..\u002Fmodel\u002Flstm.yml', 'r') as f:\n        yaml_string = yaml.load(f)\n    model = model_from_yaml(yaml_string)\n\n    print 'loading weights......'\n    model.load_weights('..\u002Fmodel\u002Flstm.h5')\n    model.compile(loss='categorical_crossentropy',\n                  optimizer='adam',metrics=['accuracy'])\n    data=input_transform(string)\n    data.reshape(1,-1)\n    #print data\n    result=model.predict_classes(data)\n    # print result # [[1]]\n    if result[0]==1:\n        print string,' positive'\n    elif result[0]==0:\n        print string,' neutral'\n    else:\n        print string,' negative'\n```\n\n经过检测，发现，原先在二分类模型中的“不是太好”，“不错不错”这样子带有前后语义转换的句子，都能正确预测，实战效果提升明显，但是也有缺点，缺点是中性评价出现的概率不高，笔者分析原因是，首先从数据集数量和质量着手，中性数据集的数量要比其他两个数据集少一半多，并且通过简单规则“然而”，“但”提取出来的中性数据集质量也不是很高，所以才会出现偏差。总而言之，训练数据的质量是非常重要的，如何获取高质量高数量的训练样本，也就成了新的难题。\n\n\n- 参考资料\n\n[文本情感分类（二）：深度学习模型](http:\u002F\u002Fspaces.ac.cn\u002Farchives\u002F3414\u002F)\n\n[Shopping Reviews sentiment analysis](https:\u002F\u002Fbuptldy.github.io\u002F2016\u002F07\u002F20\u002F2016-07-20-sentiment%20analysis\u002F)\n\n","## 基于LSTM三分类的文本情感分析\n\n### 背景介绍\n\n文本情感分析作为自然语言处理中的常见任务，具有极高的实际应用价值。本文将采用LSTM模型，训练一个能够识别文本中“积极”、“中性”和“消极”三种情感的分类器。\n\n本文旨在快速熟悉LSTM在情感分析任务中的应用，因此文中仅展示了一个基础模型，并在最后对其优缺点进行了详细分析。对于真正的文本情感分析而言，在本文所提及的模型基础上，还可以开展大量工作。未来若有空闲时间，笔者将对模型进行进一步优化与改进。\n\n### 理论介绍\n\n#### RNN的应用场景\n\n与传统神经网络相比，RNN允许我们对向量序列进行操作：输入序列、输出序列，或大部分的输入输出序列。如图所示，每一个矩形代表一个向量，箭头则表示函数（例如矩阵乘法）。输入向量用红色标出，输出向量用蓝色标出，绿色的矩形则表示RNN的状态（后续将详细介绍）。从左至右依次为：（1）未使用RNN的“Vanilla”模型，从固定大小的输入得到固定大小的输出（如图像分类）；（2）序列输出（如图片字幕，输入一张图片后输出一段文字序列）；（3）序列输入（如情感分析，输入一段文字并将其分类为积极或消极情感）；（4）序列输入与序列输出（如机器翻译：RNN读取一条英文语句，然后以法语形式输出）；（5）同步序列输入与输出（如视频分类，对视频中的每一帧进行标签标注）。值得注意的是，在上述每一种场景中，序列长度并未被预先设定为固定值，因为递归变换（绿色部分）是固定的，且我们可以多次重复使用。\n\n![](http:\u002F\u002F7xritj.com1.z0.glb.clouddn.com\u002F16-5-25\u002F61310852.jpg)\n\n\n#### Word2Vec算法\n\n在建模环节中，特征提取是最关键的一步，自然语言处理领域也不例外。在自然语言处理中，最核心的问题在于：如何将一句话高效地转化为数字形式？若能完成这一步骤，句子的分类问题便迎刃而解。显然，一种最初的思路是：为每个词赋予唯一的编号1、2、3、4……，然后将句子视为一个编号集合。假设1、2、3、4分别代表“我”、“你”、“爱”、“恨”，那么“我爱你”可以表示为[1, 3, 2]，“我恨你”则为[1, 4, 2]。这种思路看似有效，但实际上存在诸多问题：例如，一个稳定的模型可能会认为3和4非常接近，因此[1, 3, 2]与[1, 4, 2]应给出相近的分类结果；然而，按照我们的编号规则，3和4所代表的词语含义却截然相反，分类结果自然不可能一致。因此，这种编码方式难以取得理想的分类效果。\n\n读者或许会想到：是否可以将意思相近的词归为一类，即赋予它们相近的编号呢？确实，如果能够将相近的词归为一组，模型的准确率无疑会大幅提升。然而问题在于，若为每个词赋予唯一的编号，并将相近的词归为相近，实际上我们是在假定语义具有单一性——也就是说，语义仅仅是一维的。然而事实并非如此，语义本应是多维的。\n\n以“家园”为例，有些人会联想到近义词“家庭”，而“家庭”又可能让人联想到“亲人”。这些词虽然意思相近，但“亲人”与“火星”之间并无明显的联系。同样地，“家园”与“地球”之间也存在类似的关联，但“亲人”与“火星”之间的关系却并不紧密。此外，从语义的角度来看，“大学”与“舒适”也可以被视为“家园”的二级近似，然而“亲人”与“火星”本身却并无直接的语义联系。\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FEdward1Chou_SentimentAnalysis_readme_9b1fca918afd.png)\n\n**Word2Vec：高维来了**\n\n通过上述讨论可知，许多词的意思往往呈多向扩散状态，而非单一指向。因此，单一的编号并不能完全满足需求。那么，如何实现多维度的编号呢？换句话说，能否将词对应一个高维向量？答案是肯定的——这正是非常正确的思路。\n\n为什么多维向量可行呢？首先，多维向量解决了词义多方向扩散的问题：仅需二维向量，就能实现360度全方位旋转，更何况是更高维度的向量（实际应用中，通常为数百维）。其次，还有一个更为现实的问题：多维向量使我们能够用变化较小的数字来表征词义。具体来说，中文词汇数量多达数十万，若为每个词赋予唯一的编号，那么编号范围将从1到数十万不等，这样的变化幅度极大，模型的稳定性难以保证。而若采用高维向量，比如20维，只需0和1即可表达2^20 = 1048576220 = 1048576（100万）个词。由于变化较小，模型的稳定性得以保障。\n\n尽管已经阐述了诸多内容，但我们仍未真正触及核心问题。如今，思路已清晰：接下来要解决的问题是：如何将这些词映射到合适的高维向量中？更重要的是，我们是否能在没有语言背景的情况下完成这一任务？（换句话说，如果我想处理英语任务，其实无需先学好英语，只需收集大量的英语文章，该有多方便啊！）在这里，我们无法也不必深入探讨更多理论原理，而是要重点介绍：基于这一思路，Google开源了一款著名的工具——Word2Vec。\n\n简单来说，**Word2Vec实现了我们之前所追求的目标——用高维向量（词向量，Word Embedding）来表示词义**，并将意思相近的词放置在相近的位置，而且使用的是一种实数向量（而非局限于整数）。只要我们拥有足够多的某语言语料，便可利用这些语料训练模型，从而获得词向量。词向量的优点前面已有所提及，或者说，它正是为了解决前文所提到的问题而诞生的。此外，词向量还具备其他优势：借助词向量，我们能够轻松进行聚类分析，通过欧氏距离或余弦相似度，可以迅速找出意思相近的词。这相当于解决了“一词多义”的问题（遗憾的是，似乎并没有什么有效的办法来解决一词多义的问题）。\n\n关于Word2Vec的数学原理，读者可参考相关系列文章。Word2Vec的实现，Google官方提供了C语言的源代码，读者可自行编译。此外，Python的Gensim库中也提供现成的Word2Vec子库（事实上，这个版本似乎比官方版本更强大）。\n\n#### 句向量\n\n接下来要解决的问题是：我们已经将词分好，并将词转换为高维向量，那么句子就对应着词向量的集合，也就是一个矩阵——类似于图像处理，图像数字化后也会形成一个像素矩阵；然而，模型的输入一般只接受一维特征，那该怎么办呢？一个较为简单的想法是将矩阵展平，即将词向量逐一排列，组成一个更长的向量。这一思路虽可行，但会导致输入维度高达数千维甚至数万维，事实上，这在现实中几乎难以实现。（如果说数万维对今天的计算机来说不是问题，那么对于1000×1000的图像，其维度甚至高达100万维！）\n\n在自然语言处理领域，通常采用递归神经网络或循环神经网络（统称为RNNs）。**它们的作用与卷积神经网络相同：将矩阵形式的输入编码为较低维度的一维向量，同时保留大部分有用信息**。\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FEdward1Chou_SentimentAnalysis_readme_177f2f9c5d56.png)\n\n\n### 展示代码\n\n工程代码主要结合参考资料2，用于实现文本情感分析的三分类任务；\n\n\n#### 数据预处理与词向量模型训练\n\n参考资料2中包含了详尽的数据处理流程，包括：\n\n1. 将不同类别数据整理成输入矩阵\n2. 使用jieba进行分词\n3. 训练Word2Vec词向量模型\n\n本文不再赘述重复介绍，若想深入了解相关内容，可前往参考资料2的博客文章中查阅。\n\n除了“积极”和“消极”两种情感外，三分类模型还包含一种“中性”情感。原始数据集中，一些句子蕴含语义转折，例如“然而”和“但”都是关键词。由此，我们能够构建出三个不同语义的数据集。\n\n#### LSTM三分类模型\n\n代码需要注意的几点是：首先，标签需要使用keras.utils.to_categorical进行编码；其次，LSTM二分类的参数设置与二分类有所不同，我们选用softmax激活函数，并将损失函数改为categorical_crossentropy，代码如下：\n\n```python\ndef get_data(index_dict, word_vectors, combined, y):\n    n_symbols = len(index_dict) + 1  # 所有单词的索引数，频数小于10的词语索引为0，所以加1\n    embedding_weights = np.zeros((n_symbols, vocab_dim))  # 初始化索引为0的词，词向量全为0\n    for word, index in index_dict.items():  # 从索引为1的词开始，对每个词对应其词向量\n        embedding_weights[index, :] = word_vectors[word]\n    x_train, x_test, y_train, y_test = train_test_split(combined, y, test_size=0.2)\n    y_train = keras.utils.to_categorical(y_train, num_classes=3) \n    y_test = keras.utils.to_categorical(y_test, num_classes=3)\n    # print x_train.shape, y_train.shape\n    return n_symbols, embedding_weights, x_train, y_train, x_test, y_test\n\n\n## 定义网络结构\ndef train_lstm(n_symbols, embedding_weights, x_train, y_train, x_test, y_test):\n    print '定义一个简单的Keras模型...'\n    model = Sequential()  # 或者使用Graph或其它框架\n    model.add(Embedding(output_dim=vocab_dim,\n                        input_dim=n_symbols,\n                        mask_zero=True,\n                        weights=[embedding_weights],\n                        input_length=input_length))  # 添加输入长度\n    model.add(LSTM(output_dim=50, activation='tanh'))\n    model.add(Dropout(0.5))\n    model.add(Dense(3, activation='softmax'))  # Dense=>全连接层，输出维度=3\n    model.add(Activation('softmax'))\n\n    print '编译模型...'\n    model.compile(loss='categorical_crossentropy',\n                  optimizer='adam', metrics=['accuracy'])\n\n    print \"训练...\" # batch_size=32\n    model.fit(x_train, y_train, batch_size=batch_size, epochs=n_epoch, verbose=1)\n\n    print \"评估...\"\n    score = model.evaluate(x_test, y_test,\n                            batch_size=batch_size)\n\n    yaml_string = model.to_yaml()\n    with open('..\u002Fmodel\u002Flstm.yml', 'w') as outfile:\n        outfile.write(yaml_string)\n    model.save_weights('..\u002Fmodel\u002Flstm.h5')\n    print '测试得分:', score\n```\n\n#### 测试\n\n代码如下：\n\n```python\ndef lstm_predict(string):\n    print '加载模型......'\n    with open('..\u002Fmodel\u002Flstm.yml', 'r') as f:\n        yaml_string = yaml.load(f)\n    model = model_from_yaml(yaml_string)\n\n    print '加载权重......'\n    model.load_weights('..\u002Fmodel\u002Flstm.h5')\n    model.compile(loss='categorical_crossentropy',\n                  optimizer='adam', metrics=['accuracy'])\n    data = input_transform(string)\n    data.reshape(1, -1)\n    #print data\n    result = model.predict_classes(data)\n    # print result # [[1]]\n    if result[0] == 1:\n        print string, '为积极'\n    elif result[0] == 0:\n        print string, '为中性'\n    else:\n        print string, '为消极'\n```\n\n经检测发现，原本在二分类模型中表现不佳的“不是太好”和“不错不错”这类带有前后语义转换的句子，如今均能正确预测。实战效果显著提升，不过仍存在一些不足之处：中性评价的出现概率相对较低。笔者分析原因在于：首先，从数据集的数量和质量入手，中性数据集的数量比另外两个数据集少了一半左右；其次，通过简单的规则“然而”和“但”提取出的中性数据集质量也并不高，因此出现了偏差。总而言之，训练数据的质量至关重要，如何获取高质量且数量充足的训练样本，成为了新的挑战。\n\n\n- 参考资料\n\n[文本情感分类（二）：深度学习模型](http:\u002F\u002Fspaces.ac.cn\u002Farchives\u002F3414\u002F)\n\n[购物评论的情感分析](https:\u002F\u002Fbuptldy.github.io\u002F2016\u002F07\u002F20\u002F2016-07-20-sentiment%20analysis\u002F)","# SentimentAnalysis 快速上手指南\n\n本指南基于 LSTM 模型，帮助开发者快速构建一个支持 **积极 (positive)**、**中性 (neutral)**、**消极 (negative)** 三分类的文本情感分析工具。\n\n## 环境准备\n\n在开始之前，请确保您的开发环境满足以下要求：\n\n*   **操作系统**: Linux \u002F macOS \u002F Windows\n*   **Python 版本**: 推荐 Python 3.6+ (原文代码示例基于 Python 2\u002F3 混合风格，建议统一使用 Python 3 并调整打印语句)\n*   **核心依赖库**:\n    *   `keras`: 深度学习框架\n    *   `tensorflow`: Keras 后端\n    *   `gensim`: 用于训练 Word2Vec 词向量\n    *   `jieba`: 中文分词工具\n    *   `scikit-learn`: 数据划分与处理\n    *   `pyyaml`: 模型保存与加载\n\n**国内加速建议**：\n安装依赖时，推荐使用清华或阿里镜像源以提升下载速度：\n```bash\npip install -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple keras tensorflow gensim jieba scikit-learn pyyaml\n```\n\n## 安装步骤\n\n1.  **克隆项目代码**\n    将开源项目下载到本地：\n    ```bash\n    git clone \u003C项目仓库地址>\n    cd SentimentAnalysis\n    ```\n\n2.  **安装 Python 依赖**\n    如果项目包含 `requirements.txt`，直接安装：\n    ```bash\n    pip install -r requirements.txt\n    ```\n    若无该文件，请手动执行上述“环境准备”中的安装命令。\n\n3.  **数据预处理与词向量训练**\n    根据项目逻辑，需先准备数据集（包含 positive, neutral, negative 三类），并进行分词和 Word2Vec 训练。\n    *   使用 `jieba` 对文本进行分词。\n    *   使用 `gensim` 训练词向量模型，生成词向量矩阵。\n    *   *注：具体数据处理脚本需参考项目中的预处理模块或相关博文（如参考资料中的购物评论数据集处理）。*\n\n4.  **目录结构检查**\n    确保项目根目录下存在用于存储模型的文件夹，若不存在请创建：\n    ```bash\n    mkdir -p model\n    ```\n\n## 基本使用\n\n完成模型训练后，您将得到 `lstm.yml` (模型结构) 和 `lstm.h5` (模型权重) 文件。以下是加载模型并进行预测的最简示例。\n\n### 1. 加载模型并预测\n\n将以下代码保存为 `predict.py` 或在 Python 交互环境中运行：\n\n```python\nimport yaml\nfrom keras.models import model_from_yaml\nimport numpy as np\n\n# 假设 input_transform 函数已定义，用于将输入字符串转换为模型所需的数字序列\n# 实际使用时需引入项目中定义的数据预处理函数\n# from your_preprocessing_module import input_transform \n\ndef lstm_predict(string):\n    print('loading model......')\n    with open('..\u002Fmodel\u002Flstm.yml', 'r') as f:\n        yaml_string = yaml.load(f, Loader=yaml.FullLoader) # 兼容新版 PyYAML\n    \n    model = model_from_yaml(yaml_string)\n\n    print('loading weights......')\n    model.load_weights('..\u002Fmodel\u002Flstm.h5')\n    \n    model.compile(loss='categorical_crossentropy',\n                  optimizer='adam', metrics=['accuracy'])\n    \n    # 数据转换：将文本转换为索引序列\n    # 注意：此处需替换为实际的项目预处理函数\n    data = input_transform(string) \n    data = data.reshape(1, -1)\n    \n    result = model.predict_classes(data)\n    \n    # 输出结果映射：0=neutral, 1=positive, 2=negative (根据代码逻辑调整)\n    if result[0] == 1:\n        print(string, ' positive')\n    elif result[0] == 0:\n        print(string, ' neutral')\n    else:\n        print(string, ' negative')\n\n# 测试示例\nif __name__ == \"__main__\":\n    # 替换为您想要测试的句子\n    test_sentence = \"虽然价格有点贵，但是质量非常好\"\n    lstm_predict(test_sentence)\n```\n\n### 2. 关键注意事项\n\n*   **标签编码**: 模型训练时使用 `keras.utils.to_categorical` 将标签转换为 One-Hot 编码，类别数为 3。\n*   **损失函数**: 三分类任务必须使用 `categorical_crossentropy` 作为 loss 函数，激活函数使用 `softmax`。\n*   **数据质量**: 中性 (neutral) 数据的识别效果高度依赖于训练集中“转折句”（如包含“然而”、“但”）的质量和数量。若发现中性预测概率低，建议优化中性数据集的构建规则。\n\n### 3. 模型训练入口 (参考)\n\n若需重新训练模型，核心训练逻辑如下：\n\n```python\nfrom keras.models import Sequential\nfrom keras.layers import Embedding, LSTM, Dropout, Dense, Activation\nfrom keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\nimport numpy as np\n\ndef train_lstm(n_symbols, embedding_weights, x_train, y_train, x_test, y_test):\n    print('Defining a Simple Keras Model...')\n    model = Sequential()\n    model.add(Embedding(output_dim=vocab_dim,\n                        input_dim=n_symbols,\n                        mask_zero=True,\n                        weights=[embedding_weights],\n                        input_length=input_length))\n    model.add(LSTM(output_dim=50, activation='tanh'))\n    model.add(Dropout(0.5))\n    model.add(Dense(3, activation='softmax'))\n    model.add(Activation('softmax'))\n\n    print('Compiling the Model...')\n    model.compile(loss='categorical_crossentropy',\n                  optimizer='adam', metrics=['accuracy'])\n\n    print(\"Train...\")\n    model.fit(x_train, y_train, batch_size=batch_size, epochs=n_epoch, verbose=1)\n\n    print(\"Evaluate...\")\n    score = model.evaluate(x_test, y_test, batch_size=batch_size)\n    \n    # 保存模型\n    yaml_string = model.to_yaml()\n    with open('..\u002Fmodel\u002Flstm.yml', 'w') as outfile:\n        outfile.write(yaml.dump(yaml_string, default_flow_style=True))\n    model.save_weights('..\u002Fmodel\u002Flstm.h5')\n    print('Test score:', score)\n```","某电商运营团队每天需处理数万条用户商品评论，急需从海量反馈中快速识别用户情绪以优化产品策略。\n\n### 没有 SentimentAnalysis 时\n- 人工逐条阅读评论效率极低，面对突发舆情无法做到实时响应，往往滞后数小时甚至数天。\n- 仅靠关键词匹配（如搜索“不好”）无法识别反讽或转折语境（例如“价格虽贵但质量真好”），导致情感判断严重失真。\n- 缺乏对“中性”评价的细分能力，将所有非极端评价笼统归类，丢失了大量关于用户体验细节的潜在洞察。\n- 数据无法量化，难以生成可视化的情感趋势报表，管理层决策只能依赖模糊的直觉而非数据支撑。\n\n### 使用 SentimentAnalysis 后\n- 基于 LSTM 模型实现自动化批量处理，秒级完成数万条评论的 Positive、Neutral、Negative 三分类，实时监控舆情波动。\n- 利用 Word2Vec 词向量技术深度理解语义关联，精准识别包含转折词的复杂句式，大幅降低误判率。\n- 独立划分出“中性”情感类别，帮助团队筛选出那些态度温和但隐含改进建议的用户反馈，挖掘长尾需求。\n- 输出结构化的情感标签数据，直接对接 BI 系统生成动态情感走势图，为产品迭代和营销活动提供精确的数据依据。\n\nSentimentAnalysis 将非结构化的文本噪音转化为可量化的决策资产，让团队从繁琐的人工阅读中解放出来，真正实现数据驱动的用户体验优化。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FEdward1Chou_SentimentAnalysis_689ff5b2.png","Edward1Chou","Edward Chou","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002FEdward1Chou_c93a897a.jpg",null,"CN","edwardchou903@icloud.com","https:\u002F\u002Fgithub.com\u002FEdward1Chou",[83,87],{"name":84,"color":85,"percentage":86},"Jupyter Notebook","#DA5B0B",83.2,{"name":88,"color":89,"percentage":90},"Python","#3572A5",16.8,878,224,"2026-04-01T14:37:49","未说明",{"notes":96,"python":97,"dependencies":98},"1. 代码基于较旧的 Keras 独立版本编写（使用 Sequential, Embedding, LSTM 等独立导入方式），若在现代环境运行需适配 TensorFlow 2.x 的 keras 接口或安装旧版 Keras。\n2. 中文分词依赖 jieba 库。\n3. 模型训练前需自行使用 Gensim 训练 Word2Vec 词向量并构建索引字典。\n4. 数据集需预先处理为包含 positive, neutral, negative 三类标签的格式，其中中性数据通过关键词（如“然而”、“但”）提取，质量可能影响模型效果。","2.x (代码中使用 print 语句且无括号，暗示 Python 2)",[99,100,101,102,103,104,105],"keras","tensorflow (后端)","gensim","jieba","numpy","pyyaml","scikit-learn",[15],[108,109,99],"lstm","sentiment-analysis","2026-03-27T02:49:30.150509","2026-04-06T05:17:45.279081",[113,118,123],{"id":114,"question_zh":115,"answer_zh":116,"source_url":117},6498,"训练模型时报错：ValueError: You must specify either total_examples or total_words... 如何解决？","这是新版 Gensim 的兼容性要求。在初始化或更新模型参数时，必须显式指定 total_examples 或 total_words 参数。通常设置为 total_examples=model.corpus_count。请检查代码中涉及模型训练的部分，补充该参数以适配新版 Gensim API。","https:\u002F\u002Fgithub.com\u002FEdward1Chou\u002FSentimentAnalysis\u002Fissues\u002F10",{"id":119,"question_zh":120,"answer_zh":121,"source_url":122},6496,"为什么对同一句话进行预测时，结果有时不同或有时相同？","这是因为每次预测时，同一个词对应的索引（index）发生了变化，导致词向量不一致。解决方法是：在训练词向量时，将训练好的词对应的索引保存到文件（如 word2index.txt）中，预测时直接加载该文件使用，确保索引固定。运行 lstm_train.py 时通常会自动生成该文件。","https:\u002F\u002Fgithub.com\u002FEdward1Chou\u002FSentimentAnalysis\u002Fissues\u002F5",{"id":124,"question_zh":125,"answer_zh":126,"source_url":122},6497,"代码运行时提示缺少 word2index.txt 文件怎么办？","该文件通常在运行 lstm_train.py 进行模型训练时自动生成。如果缺失，请确保先执行训练脚本生成词典索引文件，然后再运行预测代码。也可以参考社区用户基于原代码修复后的版本获取完整逻辑。",[]]