【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 jieba
    
    jieba.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.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

相关推荐

  1. NLP基础——中文分词

    2024-07-21 06:58:02       56 阅读
  2. 【NLP】Jieba中文分词

    2024-07-21 06:58:02       17 阅读
  3. NLP入门之中文分词

    2024-07-21 06:58:02       19 阅读
  4. Elasticsearch之ik中文分词

    2024-07-21 06:58:02       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 06:58:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 06:58:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 06:58:02       45 阅读
  4. Python语言-面向对象

    2024-07-21 06:58:02       55 阅读

热门阅读

  1. 设计模式实战:多人聊天系统的设计与实现

    2024-07-21 06:58:02       15 阅读
  2. Open-Sora

    Open-Sora

    2024-07-21 06:58:02      18 阅读
  3. MYSQL2

    MYSQL2

    2024-07-21 06:58:02      17 阅读
  4. kafka---消息日志详解

    2024-07-21 06:58:02       18 阅读
  5. 人工智能与机器学习原理精解【2】

    2024-07-21 06:58:02       15 阅读
  6. python中的items()函数

    2024-07-21 06:58:02       16 阅读
  7. Perl中的设计模式革新:命令模式的实现与应用

    2024-07-21 06:58:02       18 阅读
  8. Perl的文本艺术:精通格式化输入输出

    2024-07-21 06:58:02       20 阅读
  9. PHP 安装指南

    2024-07-21 06:58:02       17 阅读
  10. C# 中的委托

    2024-07-21 06:58:02       14 阅读
  11. 时序数据库-04-InfluxData-分布式时序数据库

    2024-07-21 06:58:02       21 阅读
  12. ue5笔记

    ue5笔记

    2024-07-21 06:58:02      19 阅读