目录
- 一、分词
- 1、分词方式方法
- 2、分词优缺点
- 二、jieba使用示例
- 1、引入库
- 2、切分模式
- 3、加载自定义字典
- 三、词的可视化
- 1、读取数据
- 2、数据处理
- 3、统计词频
- 4、去除停用词
- 5、词云图
- 1、pyecharts绘图
- 2、WordCloud绘图
一、分词
1、分词方式方法
- 以构词规则为出发点的规则分词
- 全切分
- 正向最大匹配(FMM)/逆向最大匹配(BMM)/双向最大匹配
- 利用语料库归纳出统计数据作为评判标准的统计分词
- N-Gram概率模型
- HMM概率模型
- 上述方法除HMM外都需词典辅助!
解释: - 全切分:指对输入的文本序列进行分词时,不仅考虑一种或几种可能的切分方式,而是尝试获取该序列的所有可能的切分形式
- 正向最大匹配(Forward Maximum Matching,FMM):是一种基于词典的分词方法,常用于中文分词任务中。该方法的核心思想是按照从前到后的顺序对语句进行切分,尽可能匹配出当前位置上长度最大的词。原理:
- 贪心策略:FMM使用贪心策略,从待分词句子的开头开始,每次尝试匹配词典中最长词的长度。
- 词典依赖:FMM是基于词典的分词方法,词典中包含了已知的所有词汇及其长度信息
- 逆向最大匹配(Backward Maximum Matching,简称BMM)是一种常用的中文分词算法,其工作原理与正向最大匹配(FMM)相反,即从待分词文本的末尾开始向前进行匹配。原理:
- 从后向前匹配:BMM从待分词文本的最右边开始,逐步向左查找可能的词语;
- 最长匹配优先:在每一步匹配中,BMM都尝试匹配尽可能长的词语。它首先会尝试匹配词典中最长的词,如果匹配失败,则逐步缩短匹配长度,直到匹配成功或长度为1的单个字。
- (Bi-directional Maximum Matching,简称Bi-MM或BM)是一种结合了正向最大匹配(FMM)和逆向最大匹配(BMM)的中文分词方法。该方法通过比较正向和逆向分词的结果,以选择最可能的分词方式。原理:
- 正向最大匹配(FMM):从左至右进行分词,每次尝试匹配词典中最长的词。
- 逆向最大匹配(BMM):从右至左进行分词,同样每次尝试匹配词典中最长的词。
- 结果比较:比较FMM和BMM的分词结果,并根据一定的策略选择最终的分词结果
- N-Gram概率模型是一种基于统计语言模型的算法,广泛应用于自然语言处理领域。其核心思想是将文本序列分解为连续的n个元素(如字母、音节或单词)的序列,即“n-gram”,并计算这些序列出现的概率。原理:N-Gram模型基于一个假设:第n个词的出现与前n-1个词相关,而与其他任何词不相关。整个句子出现的概率就等于各个词出现的概率乘积。
- HMM概率模型,即隐马尔可夫模型(Hidden Markov Model, HMM),是一种统计模型,用于描述一个含有隐含未知参数的马尔可夫过程。这种模型在序列数据建模中非常有用,特别是在那些数据包含无法直接观测到的隐藏状态的情况下。两个假设:
- 齐次马尔科夫假设:状态转移的概率只与当前状态有关,与之前的状态无关。
- 观测独立性假设:观测符号只依赖于生成它的隐藏状态,与其他隐藏状态无关。
训练和预测: - 训练:使用Baum-Welch算法(也称为前向-后向算法)来估计HMM的参数。这是一个迭代的过程,通过最大化观测序列的概率来更新模型的参数。
- 预测:使用维特比算法来找到给定观测序列下最可能的状态序列。这个算法基于动态规划,通过选择每一步的最优状态来找到全局最优解
2、分词优缺点
- 规则分词
- 优点:
- 程序简单易行,开发周期短
- 不涉及复杂计算,分词速度快
- 缺点:
- 歧义处理太过简单
- 不能识别新词
- 分词精度不能满足实际的需要
- 规范的文本在80%左右
- 互联网文本在70%左右
- 优点:
- 统计分词
- 优点
- 能够处理大部分常用词带来的歧义问题
- 缺点
- 不能处理新词以及新词带来的歧义问题
- 需要很大的训练语料
- 分词速度相对较慢
- 优点
常用的是jieba分词工具。
二、jieba使用示例
jieba 是Python中常用的一种中文分词工具,它可以将中文文本数据切分为一个一个的中文词语。
1、引入库
- 安装方式:
pip install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple
- 引入库
import jieba
2、切分模式
jieba.cut(sentence, cut_all=False, HMM=True)
- 参数:
- sentence: 需要被切分的字符串.
- cut_all: 切分模式,True 对应全模式 False 对应 精确模式.
- HMM: 是否使用隐马尔可夫模型.
- 返回 generator
jieba.lcut用法与 jieba.cut一致,只是返回值为列表。
string="工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作"
jieba.lcut(string)
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义
- t1 = jieba.cut(string, cut_all=True)
- 精确模式,试图将句子最精确地切开(分词后的概率连乘最大),适合文本分析。已被分出的词语将不会再次被其他词语占有。
- t2 = jieba.cut(string, cut_all=False)
- 搜索引擎模式,在精确模式的基础上,对长词(字数>2)再次切分,提高召回率,适合用于搜索引擎分词。
- t3= jieba.cut_for_search(string)
3、加载自定义字典
sentence = """风暴降生丹妮莉丝·坦格利安一世、不焚者、弥林女王、安达尔人、洛伊拿人和先民的女王、草海上的卡丽熙、
奴隶解放者和火龙之母、维斯特洛的统治者暨全境守护者、阿斯塔波的解放者、弥莎和龙石岛公主"""
seq_sentence = jieba.lcut(sentence)
print("|".join(seq_sentence))
向词典中添加 新词"坦格利安",然后再次切分 :
jieba.add_word("坦格利安")
jieba.load_userdict() 通过此函数加载公司内或行业内的专用词典,用于丰富默认词典
jieba.load_userdict('../data/NLP/user_dict.txt')
sentence = """风暴降生丹妮莉丝·坦格利安一世、不焚者、弥林女王、安达尔人、洛伊拿人和先民的女王、草海上的卡丽熙、奴隶解放者和火龙之母、维斯特洛的统治者暨全境守护者、阿斯塔波的解放者、弥莎和龙石岛公主"""
seq_sentence = jieba.lcut(sentence)
print("|".join(seq_sentence))
自定义默认字典
jieba.set_dictionary("../data/NLP/user_dict.txt")
jieba.initialize()
三、词的可视化
1、读取数据
import pandas as pd
data = pd.read_csv("../data/NLP/articles_20240308.csv")
data.head()
2、数据处理
- 去除前后空格
data["channels"] = data.channels.str.strip()
- 选择数据进行词切分
data = data.loc[data["channels"]=="港股",["articles"]]
data['cut'] = data.articles.apply(lambda x: jieba.lcut(x))
data_cut = data.cut.to_list()
data_cuts = [word for sent in data_cut for word in sent]
data_cuts[:20]
3、统计词频
import collections
collections.Counter(data_cuts).most_common(30)
4、去除停用词
with open("data/my_stop_words.txt",'r',encoding='utf-8') as f:
stop_words = f.readlines()
stop_words = [word.strip("\n") for word in stop_words]
stop_words.extend(['\n'," ","月","日"]) # 扩展停用词
split_word = [word for word in data_cuts if word not in stop_words] #词过滤
# 再次统计词频
import collections
collections.Counter(split_word).most_common(30)
5、词云图
1、pyecharts绘图
工具包:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts
from pyecharts import options as opts
from pyecharts.charts import WordCloud
# 下面代码对应jupyter lab,notebook是默认的绘图环境,按默认配置即可
from pyecharts.globals import CurrentConfig,NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
data = collections.Counter(split_word).items()
wordcloud = (
WordCloud()
.add("", data, word_size_range=[20, 80],textstyle_opts=opts.TextStyleOpts(font_family="Microsoft YaHei",font_weight='bold'))
.set_global_opts(title_opts=opts.TitleOpts(title="港股热词"))
)
wordcloud.render("0620港股热词.html")
wordcloud.load_javascript()
2、WordCloud绘图
工具包:
pip install wordcloud -i https://pypi.tuna.tsinghua.edu.cn/simple
import wordcloud
import matplotlib.pyplot as plt
txt = " ".join(split_word)
w = wordcloud.WordCloud(width=1000,
height=800,
font_path=r"C:\Windows\Fonts\simhei.ttf",
background_color = 'white')
wc = w.generate(txt)
plt.imshow(wc)
plt.axis('off');
修改词云图样式
import wordcloud
import matplotlib.pyplot as plt
backgroud_img = plt.imread("data/mask.jpg")
w = wordcloud.WordCloud(width=1000,
height=800,
font_path=r"C:\Windows\Fonts\simhei.ttf",
background_color = 'white',
mask=backgroud_img)
wc = w.generate(txt)
plt.imshow(wc)
plt.axis('off');