您的位置:首页 > 房产 > 家装 > 【NLP】Jieba中文分词

【NLP】Jieba中文分词

2024/10/14 3:25:20 来源:https://blog.csdn.net/2303_80346267/article/details/140572665  浏览:    关键词:【NLP】Jieba中文分词

Jieba分词是一个用于中文文本分词的开源工具。它可以将一段连续的中文文本切分成一个一个的词语,这对于中文自然语言处理(NLP)任务如文本分类、情感分析、机器翻译等非常重要。Jieba分词具有以下特点:

  1. 支持三种分词模式
    • 精确模式:试图将句子最精确地切开,适合文本分析。
    • 全模式:把句子中所有的可以成词的词语都扫描出来,速度快,但不能解决歧义。
    • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  2. 支持自定义词典:用户可以通过添加自定义词典来提高分词的准确性,尤其是对一些专有名词和新词的识别。
  3. 内置多种分词词典:Jieba自带了多种分词词典,能够识别大量常用词汇。

Jieba基础使用

安装

可以使用pip安装Jieba:

pip install jieba

使用示例

import jieba# 精确模式
text = "我来到北京清华大学"
seg_list = jieba.cut(text, cut_all=False)
print("精确模式: " + "/ ".join(seg_list))# 全模式
seg_list = jieba.cut(text, cut_all=True)
print("全模式: " + "/ ".join(seg_list))# 搜索引擎模式
seg_list = jieba.cut_for_search(text)
print("搜索引擎模式: " + "/ ".join(seg_list))

输出:

精确模式: 我/ 来到/ 北京/ 清华大学
全模式: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
搜索引擎模式: 我/ 来到/ 北京/ 清华/ 华大/ 大学/ 清华大学

通过这种方式,Jieba可以高效地将中文文本分割成词语,为后续的自然语言处理任务提供基础支持。

自定义词典

Jieba分词支持自定义词典功能,允许用户添加特定领域或特定应用场景的词汇,以提高分词的准确性和识别率。以下是关于自定义词典功能的详细介绍:

自定义词典的使用方法

  1. 创建自定义词典文件: 自定义词典是一个纯文本文件,每行一个词汇,格式如下:

    词语 词频 词性
    
    • 词语:需要添加的词汇。
    • 词频:可选,词频越高,分词时越倾向于将此词作为一个整体分出。默认值是1。
    • 词性:可选,词语的词性标注。

    例如:

    自然语言处理 3 n
    机器学习 5 n
    深度学习 2 n
    
  2. 加载自定义词典: 使用jieba.load_userdict方法加载自定义词典:

    import jiebajieba.load_userdict('user_dict.txt')
    
  3. 添加单个词汇: 除了加载整个词典文件,还可以动态添加单个词汇:

    jieba.add_word('自定义词')
    jieba.add_word('深度学习', freq=20000, tag='n')
    
  4. 删除单个词汇: 如果需要移除某个词汇,可以使用jieba.del_word方法:

    jieba.del_word('不需要的词')
    

自定义词典示例

假设有一个文本需要处理,并且有一些特定领域的词汇需要添加:

自定义词典文件 (user_dict.txt):
人工智能 5 n
区块链 3 n
数据挖掘 4 n
加载自定义词典并进行分词
import jieba# 加载自定义词典
jieba.load_userdict('user_dict.txt')# 测试文本
text = "人工智能和区块链是当今的热门技术,数据挖掘也是非常重要的技能。"# 分词
seg_list = jieba.cut(text, cut_all=False)
print("精确模式: " + "/ ".join(seg_list))
输出结果
精确模式: 人工智能/ 和/ 区块链/ 是/ 当今/ 的/ 热门/ 技术/ ,/ 数据挖掘/ 也是/ 非常/ 重要/ 的/ 技能/ 。

词性划分

要查看每个词的词性,你可以使用 Jieba 的 jieba.posseg 模块,它提供了词性标注的功能。jieba.posseg 模块可以分词并同时返回词性标注。

示例代码

以下是使用 jieba.posseg 模块进行分词和词性标注的示例代码:

import jieba.posseg as pseg# 测试文本
text = "人工智能和区块链是当今的热门技术,数据挖掘也是非常重要的技能。"# 分词并标注词性
words = pseg.cut(text)# 输出分词结果和词性
for word, flag in words:print(f'{word} ({flag})')

解释

  • jieba.posseg.cut(text):对文本进行分词并返回一个生成器,每个生成器项是一个包含词语和词性标记的元组。
  • word:表示分词结果中的词语。
  • flag:表示词语的词性标记(例如,n 表示名词,v 表示动词等)。

词性标记

常见的词性标记包括:

  • n:名词
  • v:动词
  • a:形容词
  • d:副词
  • p:介词
  • m:数词
  • q:量词

这将帮助你在分词结果中看到每个词汇的词性,从而进行更深入的文本分析。

关键词提取

Jieba 提供了 jieba.analyse 模块来进行关键词提取,常用于从文本中提取出重要的词汇。

示例代码

import jieba.analysetext = "人工智能是计算机科学的一个重要领域,近年来得到了广泛的应用。"# 提取关键词
keywords = jieba.analyse.extract_tags(text, topK=5, withWeight=False)print("关键词: " + "/ ".join(keywords))
  • topK:返回前 K 个关键词。
  • withWeight:是否返回词语的权重,默认为 False。

TF-IDF 算法

jieba.analyse 还支持 TF-IDF 算法来提取关键词。

示例代码
import jieba.analysetext = "人工智能是计算机科学的一个重要领域,近年来得到了广泛的应用。"# 提取关键词及其权重
keywords_with_weight = jieba.analyse.extract_tags(text, topK=5, withWeight=True)for word, weight in keywords_with_weight:print(f'{word}: {weight}')

TextRank 算法

jieba.analyse 模块也支持 TextRank 算法,这是一种图排序算法,用于提取关键词。

示例代码
import jieba.analysetext = "人工智能是计算机科学的一个重要领域,近年来得到了广泛的应用。"# 使用 TextRank 算法提取关键词
keywords = jieba.analyse.textrank(text, topK=5, withWeight=False)print("关键词: " + "/ ".join(keywords))

工程技巧

位置获取

地名提取

要从文本中分出地名,可以使用jieba结合词性标注来识别地名。地名通常标记为ns(名词性地名)。你可以使用jieba.posseg模块进行词性标注,然后筛选出标记为ns的词汇。

以下是从文本中提取地名的示例代码:

import jieba.posseg as pseg# 测试文本
text = "我去了北京和上海,最近还计划去东京和纽约旅游。"# 分词并标注词性
words = pseg.cut(text)# 提取地名
places = [word for word, flag in words if flag == 'ns']
经纬查询

尝试通过两个不同的地图服务API(腾讯地图和高德地图)来获取指定地点的经纬度坐标。

requests 是一个用 Python 编写的第三方 HTTP 库,它使得发送 HTTP/1.1 请求变得非常简单。使用 requests,你可以很容易地发送各种 HTTP 请求(如 GET、POST、PUT、DELETE 等),并获取服务器响应的内容。requests 库的设计哲学是简洁易用,同时又不失强大和灵活性

import requestsdef tencentMap(location):   #调用腾讯api查找城市经纬度url = "https://apis.map.qq.com/jsapi?"  # 腾讯地图API接口para = {"qt": "geoc","addr": location,  # 传入地址参数"output": "jsonp","key": "xxxxxxxxxx",  # 即腾讯地图API的key"pf": "jsapi","ref": "jsapi"}req = requests.get(url, para).json()  # 请求数据并转为json格式geted = req["detail"]return float(geted['pointx']),float(geted['pointy'])def aliMap(location):   #调用阿里api查找城市经纬度para = {'key':'xxxxxxxxxx',   # 高德Key'address':location} # 地址参数url = 'https://restapi.amap.com/v3/geocode/geo?'    # 高德地图地理编码API服务地址result = requests.get(url,para).json()  # GET方式请求lon_lat = result['geocodes'][0]['location']lon,lat = map(float, lon_lat.split(','))return lon,latdef getLonLat(location):try:return tencentMap(location)except:return aliMap(location)return None,None

自定义缺省词典词性

可以通过在加载词典文件后遍历词汇并动态添加这些词汇到 Jieba 的分词库中,同时指定词性。

def add_dict(self, dict_path:str,tag:str):with open(dict_path, 'r', encoding='utf-8') as file:for line in file:word = line.strip()jieba.add_word(word, tag=tag)

找到第一个该词性的词

从一个句子中返回第一个指定词性的词,可以使用 jieba.posseg 模块进行词性标注,并在遍历分词结果时找到第一个匹配的词性。

import jieba.posseg as psegdef find_first_word_of_type(text, word_type):# 分词并标注词性words = pseg.cut(text)# 遍历分词结果,寻找第一个指定词性的词for word, flag in words:if flag == word_type:return wordreturn None

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com