文章目录
1.环境配置
(一)安装:anaconda
1. 理解:为什么需要anaconda
不同的python版本适应与相应的依赖包,可以用ANACONDA来管理不同的python版本环境,需要用到哪个环境就调用哪个环境。
本人最常用的就是一个Py3.6的包,这个包很多的版本的库都兼容,但是由于新的出来,一些最新的库已经开始不适配3.6
此前有次,自己的原生代码,在生成WordCloud词云时,从来都不会报错,会出现一个字体的错误。一直没解决,用了很多方法都没解决,后面发现是不适配3.6版本。所以在anaconda中可以再生成一个更高版本的环境。
可以专门用一个python版本,解决相应的问题。
2. 下载anaconda
下载好,双击安装,一直下一步
3. 启动anaconda
在开始菜单,找到anaconda powershell prompt,输入conda
,有输出即可
这样我们就有了管理python版本、依赖包版本的工具
(二)安装:python环境
- 安装python 3.10.6
conda create -n test python=3.10.6
其中-n 后面的test代表新的环境的名字,可以自己定义
这里一般都不会出现什么问题,都可以正常创建新的环境。
2. 激活环境
创建之后,我们还是在原本的基础环境上,需要跳到新的环境中去配置新的环境的依赖包
conda activate test
然后输入python
,发现python3.10.6安装好了
(三)安装:依赖包
环境已经构建好,接下来就是安装相应的依赖包
- 第一步:先安装hdbscan ⚠️
hdbscan的安装问题
因为BERTopic依赖HDBSCAN这个包
但当前版本,使用pip安装HDBSCAN这个包,会报错
下面是两个相关讨论,里面有解决方案
https://github.com/MaartenGr/BERTopic/issues/1656
解决方案
1. 安装build-tools-for-visual-studio
注意,这个解决方案中说,需要先安装build-tools-for-visual-studio,但是在我的电脑(win10虚拟机)上实测是不需要先安装这个的,大家可以先跳过这个步骤,直接安装hdbscan,如果安装不上去,再拐回来下载build-tools-for-visual-studio,安装并重启电脑,重新打开prompt窗口,然后继续执行后面的步骤
下载地址
https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2022
2. 安装hdbscan
先通过conda安装hdbscan
conda install -c conda-forge hdbscan
这里输入y
,包括python在内的一些包会被更新,但是没关系,仍然具备兼容性
接下来就能使用pip进行安装了
本人在安装过程中,发现就是安装不上去,网络一直卡着不动,可以试试配置一下conda的源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --set show_channel_urls yes
# 查看配置信息:mac上channels只有defaults,没有其他的
conda config --show
网上查找了很多源,从本地或者命令行中添加或者修改源,均未能下载和安装上hdbscan
后来,一气之下,将所有的源都删除,将源恢复成默认源后,开始下载和安装。
如果不行的话,可以试试以下 的命令行:
pip install hdbscan
conda install hdbscan
pip install --upgrade git+https://github.com/scikit-learn-contrib/hdbscan.git#egg=hdbscan
其中,可以在pip安装的时候,先更换第二步中的pip源。
(四)安装transformers、BERTopic等重要依赖包
- 设置pip换源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
- 安装依赖
pip install torch==2.0.1 transformers==4.29.1 tqdm==4.65.0 numpy==1.23.2 jieba==0.42.1 bertopic==0.15.0
2.BERT预训练模型下载
(一)模型原理
我们是数据集可能是一条条的文本数据,每一条文本代表一条数据。但是我们的计算机并不能很好的识别和认识我们的语言,计算机只认识计算机语言,就是数字。
所以需要将文本转成数字,其中很很多方法可以实现,比如TFIDF,one-hot,word2vec等等。这些都是不同的向量转化方法
BERT预训练模型,就是将自己的文本转化为相应的向量。
(二)预训练模型获取
注意在执行到下面这行代码的时候,需要下载模型,在网上下载模型,此时需要梯子
代码如下
embedding_model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
如果实在没有梯子,也可以使用huggingface镜像,参考如下文章
国内快速下载huggingface(镜像)上的模型和数据 - 知乎
下面是官方教程
具体操作:
- 打开Anaconda powershell prompt
注意!!!!!!!!!!!!是Anaconda powershell prompt,不是Anaconda prompt,本人在操作的时候,就犯了这个错误,导致在设置环境变量的时候一直报错,再尝试多次后,才发现应该用Anaconda powershell prompt
- 激活环境
conda activate test
- 安装依赖
pip install -U huggingface_hub
- 设置环境变量,即使用huggingface镜像站
Linux平台,在命令行执行
export HF_ENDPOINT=https://hf-mirror.com
Windows Powershell,在命令行执行,注意这里必须使用powershell
$env:HF_ENDPOINT = "https://hf-mirror.com"
注意这个是在当前powershell会话中临时设置环境变量,所以如果关闭powershell而后重新打开,则需要重新运行该命令设置环境变量
- 下载模型
huggingface-cli download --resume-download 模型名
具体代码如下:
huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2
如果下载不下来,可以尝试用梯子后,再执行该命令行。
模型名需要去huggingface镜像站进行查询,以获取精确的模型名称
注意:如果下载失败,可以重复执行上面的命令,来继续下载
3.BERT模型实战操作
本阶段主要演示了如何使用 BERTopic 库进行文本聚类,包括语义向量的生成、主题建模、以及可视化结果等步骤。可以根据实际需求对相关参数进行调整,以获得更好的聚类效果。
3.1预处理
利用上述的安装的包,初步进行文本主题聚类
导入相应的库
from bertopic import BERTopic
from sentence_transformers import SentenceTransformer
from umap import UMAP
from bertopic import BERTopic
from sentence_transformers import SentenceTransformer
from umap import UMAP
BERTopic: 用于文本聚类和主题建模。
SentenceTransformer: 用于生成语义向量。
UMAP: 用于将高维数据降维到二维以进行可视化。
3.2随机生成数据
用了一些关于天气和自然语言处理的句子作为示例数据。
# step1 加载文件
docs = [
'今天天气很好',
'今天天气很不错',
'今天天气晴朗',
'今天天气不错',
'今天阳光明媚',
'自然语言处理会使用到深度学习',
'自然语言处理会使用到线性代数',
'自然语言处理会需要掌握一定的微积分知识',
'自然语言处理很简单',
'自然语言处理容易掌握'
]
3.3用预训练模型生成词向量
使用了预训练的 Sentence Transformer 模型来生成文本的语义向量。
注意,这里使用了本地预训练模型的路径。如果你想从网络下载预训练模型,可以使用 SentenceTransformer(‘paraphrase-multilingual-MiniLM-L12-v2’) 的方式,需要魔法。
其中,如果按照正常下来下来的数据,会存放在本地自己电脑用户名下的缓存文件中,一般只要修改成自己电脑的对应用户名,后面的路径基本上都差不多。
# 方式1:从网络中下载
# embedding_model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 方式2:从本地加载,注意\\转义
# 路径写到包含config.json的位置
embedding_model = SentenceTransformer('C:\\Users\\Acer\\.cache\\huggingface\\hub\\models--sentence-transformers--paraphrase-multilingual-MiniLM-L12-v2\\snapshots\\bf3bf13ab40c3157080a7ab344c831b9ad18b5eb')
embedding_model
SentenceTransformer(
(0): Transformer({‘max_seq_length’: 128, ‘do_lower_case’: False}) with Transformer model: BertModel
(1): Pooling({‘word_embedding_dimension’: 384, ‘pooling_mode_cls_token’: False, ‘pooling_mode_mean_tokens’: True, ‘pooling_mode_max_tokens’: False, ‘pooling_mode_mean_sqrt_len_tokens’: False})
)
创建词向量
# 方式1:从网络中下载
# embedding_model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
# 方式2:从本地加载,注意\\转义
# 路径写到包含config.json的位置
embedding_model = SentenceTransformer('C:\\Users\\Acer\\.cache\\huggingface\\hub\\models--sentence-transformers--paraphrase-multilingual-MiniLM-L12-v2\\snapshots\\bf3bf13ab40c3157080a7ab344c831b9ad18b5eb')
embedding_model
SentenceTransformer(
(0): Transformer({‘max_seq_length’: 128, ‘do_lower_case’: False}) with Transformer model: BertModel
(1): Pooling({‘word_embedding_dimension’: 384, ‘pooling_mode_cls_token’: False, ‘pooling_mode_mean_tokens’: True, ‘pooling_mode_max_tokens’: False, ‘pooling_mode_mean_sqrt_len_tokens’: False})
)
训练词向量
embeddings = embedding_model.encode(docs, show_progress_bar=True)
print(type(embeddings), embeddings.shape)
print(embeddings)
# 这里生成的六个语义向量,对前面的六个句子
Batches: 100%|███████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 14.71it/s]
<class ‘numpy.ndarray’> (10, 384)
[[ 0.22831468 0.20791563 -0.01361516 … 0.08457319 -0.27376777
0.30211884]
[ 0.23415908 0.18763618 -0.00334522 … 0.0779568 -0.28823084
0.29783484]
[ 0.25473985 0.1818736 0.02977079 … 0.12291715 -0.15997924
0.20394081]
…
[-0.10149585 0.03836724 -0.2841275 … 0.23825662 -0.04146785
-0.19284795]
[-0.28807738 -0.0264765 0.18795006 … 0.4801185 0.34286192
-0.21912703]
[-0.13998343 -0.17367244 -0.0083187 … 0.338658 0.19647516
3.4文本聚类
用 BERTopic 进行文本聚类。
min_topic_size 参数控制了每个主题最小的文档数量,这是一个重要的参数,可以根据需要进行调整。
# 创建模型
topic_model = BERTopic(
embedding_model=embedding_model,
min_topic_size=2, # 重要参数
verbose=True,
)
# 训练模型
topic_model.fit_transform(docs, embeddings=embeddings)
# 获取聚类结果
topic_info = topic_model.get_topic_info()
topic_info
使用 UMAP 将高维的语义向量降维到二维,以便进行可视化。topic_model.visualize_documents() 函数会生成一个交互式的可视化界面,显示文档在二维空间中的分布以及它们所属的主题。
# ⭐ UMAP可视化
reduced_embeddings = UMAP(n_neighbors=5, n_components=2, min_dist=0.0, metric='cosine',).fit_transform(embeddings)
topic_model.visualize_documents(docs, reduced_embeddings=reduced_embeddings, hide_annotations=True)