Jieba分词是一个用于中文文本分词的开源工具。它可以将一段连续的中文文本切分成一个一个的词语,这对于中文自然语言处理(NLP)任务如文本分类、情感分析、机器翻译等非常重要。Jieba分词具有以下特点:
- 支持三种分词模式:
- 精确模式:试图将句子最精确地切开,适合文本分析。
- 全模式:把句子中所有的可以成词的词语都扫描出来,速度快,但不能解决歧义。
- 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- 支持自定义词典:用户可以通过添加自定义词典来提高分词的准确性,尤其是对一些专有名词和新词的识别。
- 内置多种分词词典: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。
- 词性:可选,词语的词性标注。
例如:
自然语言处理 3 n 机器学习 5 n 深度学习 2 n
加载自定义词典: 使用
jieba.load_userdict
方法加载自定义词典:import jieba jieba.load_userdict('user_dict.txt')
添加单个词汇: 除了加载整个词典文件,还可以动态添加单个词汇:
jieba.add_word('自定义词') jieba.add_word('深度学习', freq=20000, tag='n')
删除单个词汇: 如果需要移除某个词汇,可以使用
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.analyse
text = "人工智能是计算机科学的一个重要领域,近年来得到了广泛的应用。"
# 提取关键词
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.analyse
text = "人工智能是计算机科学的一个重要领域,近年来得到了广泛的应用。"
# 提取关键词及其权重
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.analyse
text = "人工智能是计算机科学的一个重要领域,近年来得到了广泛的应用。"
# 使用 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 requests
def 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,lat
def 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 pseg
def find_first_word_of_type(text, word_type):
# 分词并标注词性
words = pseg.cut(text)
# 遍历分词结果,寻找第一个指定词性的词
for word, flag in words:
if flag == word_type:
return word
return None