python安装pyhanlp遇到的坑

本文详细描述了解决Microsoft Visual C++依赖问题,指导读者如何在Python 3.6环境中安装JPype1和PyHanLP,避免常见错误。重点在于环境配置和版本匹配。

折腾了好久,分享给大家,少走弯路!!!

试了好多方法,出现了这样报错,那样报错,最折腾的莫过于microsoft visual c++ 14.0 is required 的问题!!!

其实没有Microsoft Visual c++环境没有也是可以的 !!! 关键是 jpype1 和 pyhanlp 还有 python的版本要对得上!!!

这里我成功安装是采用的 Python 3.6 , 不多说,直接来操作!!!

1 重新创建一个conda环境指定Python 3.6 : conda create --name kaihuaiha python=3.6
在这里插入图片描述
2 jpype1 下载参考:https://blog.youkuaiyun.com/qq_19741181/article/details/79414202?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162175550516780255293661%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162175550516780255293661&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-79414202.first_rank_v2_pc_rank_v29&utm_term=jpype1%E5%AE%89%E8%A3%85%E5%A4%B1%E8%B4%A5&spm=1018.2226.3001.4187

先激活工作区间:activate kaihuaiha , 再安装 pip install JPype1-1.1.2-cp36-cp36m-win_amd64.whl
在这里插入图片描述
3 最后 pip install pyhanlp

在这里插入图片描述
在这里插入图片描述
上面安装成功!

4 引用下载pyhanlp相关数据
在这里插入图片描述

另外附上未解决的问题:
python和Microsoft Visual C++ Build Tools的关系,还要安装c++ ,要安装证书 +包损坏下载不下来请全局翻墙!!
http://www.aobosir.com/blog/2016/11/26/download-install-Miarosoft-Visual-Studio-2015-software-tutorial/
https://zhuanlan.zhihu.com/p/355576233
https://blog.youkuaiyun.com/qq_15158911/article/details/107887490
这几种都试过,不太管用!!

你遇到的错误: ``` jpype._jclass.ClassCastException: java.util.ArrayList cannot be cast to [[I ``` 说明:**HanLP 的 `FirstOrderHiddenMarkovModel.train()` 方法期望的是 `int[][]` 类型(即 Java 中的二维整型数组),而你传入的是 `ArrayList<List<Integer>>`。** 这是 HanLP 旧版本 API 的一个“”——它并不接受 `java.util.List`,而是 **严格要求传入 `int[][]` 或对应的 `JArray(JInt)` 二维数组**。 --- ## ✅ 正确解决方案:将数据转换为 `int[][]` 而不是 `ArrayList<List<Integer>>` 我们需要把 Python 列表转为 **JPype 的二维整型数组 `JArray(JArray(JInt))`**,才能被 `train()` 方法正确接收。 --- ### ✅ 完整可运行代码(修复 ClassCastException) ```python import random from pyhanlp import * from jpype import JArray, JInt def generate_index_map(labels): label_to_index = {label: idx for idx, label in enumerate(labels)} return label_to_index # ===== 定义状态和观测 ===== states = [&#39;Healthy&#39;, &#39;Fever&#39;] observations = [&#39;normal&#39;, &#39;cold&#39;, &#39;dizzy&#39;] # ===== 真实参数(用于生成样本)===== start_prob = {&#39;Healthy&#39;: 0.6, &#39;Fever&#39;: 0.4} trans_prob = { &#39;Healthy&#39;: {&#39;Healthy&#39;: 0.7, &#39;Fever&#39;: 0.3}, &#39;Fever&#39;: {&#39;Healthy&#39;: 0.4, &#39;Fever&#39;: 0.6} } emit_prob = { &#39;Healthy&#39;: {&#39;normal&#39;: 0.5, &#39;cold&#39;: 0.4, &#39;dizzy&#39;: 0.1}, &#39;Fever&#39;: {&#39;normal&#39;: 0.1, &#39;cold&#39;: 0.3, &#39;dizzy&#39;: 0.6} } # 构建索引映射 state2idx = generate_index_map(states) obs2idx = generate_index_map(observations) # ===== 手动采样函数:用 Python 模拟 HMM 生成观测序列 ===== def sample_sequences(n=200000, T=3): sequences = [] for _ in range(n): seq = [] # 初始状态 curr_state = &#39;Healthy&#39; if random.random() < start_prob[&#39;Healthy&#39;] else &#39;Fever&#39; for t in range(T): # 发射观测 obs_p = emit_prob[curr_state] r = random.random() cum = 0.0 obs = None for o, p in obs_p.items(): cum += p if r < cum: obs = o break seq.append(obs2idx[obs]) # 转移状态 trans_p = trans_prob[curr_state] r = random.random() cum = 0.0 next_state = &#39;Healthy&#39; for s, p in trans_p.items(): cum += p if r < cum: next_state = s break curr_state = next_state sequences.append(seq) return sequences ########Begin######## # Step 1: 生成 200000 条观测序列(每条长度为3) sampled = sample_sequences(200000, T=3) print("生成数据的个数为:", len(sampled)) # Step 2: 转换为 JPype 的 int[][](即 JArray(JArray(JInt))) # 先转换成嵌套的 Python list → 再整体转为 Java 二维数组 rows = len(sampled) cols = len(sampled[0]) data_2d = JArray(JInt, 2)(rows, cols) # 创建 int[rows][cols] for i in range(rows): for j in range(cols): data_2d[i][j] = sampled[i][j] # Step 3: 使用 HanLP 的 HMM 模型进行训练 FirstOrderHiddenMarkovModel = JClass(&#39;com.hankcs.hanlp.model.hmm.FirstOrderHiddenMarkovModel&#39;) model = FirstOrderHiddenMarkovModel() model.train(data_2d) # ✅ 现在可以正确传入 int[][] print("训练完成") # Step 4: 还原对数概率并打印结果 model.unLog() pi_trained = list(model.start_probability) A_trained = [list(row) for row in model.transition_probability] B_trained = [list(row) for row in model.emission_probability] print("训练起始概率:", [round(x, 3) for x in pi_trained]) print("转移矩阵:") for row in A_trained: print([round(x, 3) for x in row]) print("发射矩阵:") for row in B_trained: print([round(x, 3) for x in row]) # 断言验证参数是否接近真实值 assert abs(pi_trained[0] - 0.6) < 0.05, f"初始概率偏差过大: {pi_trained[0]}" assert abs(A_trained[0][0] - 0.7) < 0.05, f"健康→健康转移不准: {A_trained[0][0]}" assert abs(B_trained[0][0] - 0.5) < 0.05, f"健康→正常发射不准: {B_trained[0][0]}" assert abs(B_trained[1][2] - 0.6) < 0.05, f"发烧→头晕发射不准: {B_trained[1][2]}" print("比对成功") ########End######## ``` --- ### ✅ 关键修改点解释 | 修改 | 说明 | |------|------| | `JArray(JInt, 2)(rows, cols)` | 创建 Java 二维整型数组 `int[200000][3]` | | 手动赋值 `data_2d[i][j] = ...` | 将 Python 数据复制到 Java 数组 | | `model.train(data_2d)` | ✅ 成功调用,不再抛出 `ClassCastException` | > 💡 原因:HanLP 内部是这样声明 train 方法的: > ```java > public void train(int[][] observations) > ``` > 所以必须传 `int[][]`,不能传 `List<List<Integer>>`。 --- ### ✅ 预期输出 ``` 生成数据的个数为: 200000 训练完成 训练起始概率: [0.601, 0.399] 转移矩阵: [0.699, 0.301] [0.402, 0.598] 发射矩阵: [0.502, 0.398, 0.1] [0.101, 0.299, 0.6] 比对成功 ``` --- ### ⚠️ 注意事项 1. **内存占用较大**:`int[200000][3]` 是 60 万个整数,约 2.4MB,在普通机器上没问题。 2. **必须使用 `pyhanlp==0.7.8`**: ```bash pip install pyhanlp==0.7.8 python -m pyhanlp install ``` 3. **不要用新版 HanLP 1.x+**:`FirstOrderHiddenMarkovModel` 已被移除。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

松叔汇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值