python自然语言处理入门-词典分词

自然语言处理入门-词典分词

 

摘要

  •    中文分词指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本。
  •    词典分词是最简单、最常见的分词算法,仅需一部词典和一套查词典的规则即可。
  •     给定一部词典,词典分词就是一个确定的查词与输出的规则系统。

1. 什么是词

1.1 词的定义

    语言学定义:具备独立意义的最小单位。

    基于词典的中文分词中的定义:词典中的字符串就是词。

1.2 词的性质——齐夫定律

    齐夫定律:哈弗大学语言学家乔治 . 金斯利 . 齐夫于 1949 年发表,一个单词的词频与它的词频排名成反比。

    实验:基于 MSR 语料库(微软亚洲研究院语料库)上的统计结果验证 “齐夫定律”。

[(',', 173173), ('的', 128146), ('。', 81757), ('、', 40695), ('在', 28445), ('了', 27103), ('和', 24398), ('是', 18068), ('”', 16867), ('“', 16686), ('一', 11503), ('有', 9905), ('对', 9654), ('为', 9516), ('中', 9444), ('上', 8408), ('不', 7222), ('这', 7198), ('与', 7197), ('他', 7062), ('就', 6485), ('人', 6338), ('到', 6316), ('等', 6008), (':', 5988), ('发展', 5976), ('说', 5973), ('也', 5801), ('要', 5660), ('将', 5651)]

图 2-1    MSR 语料库前 30 个常用词的词频统计

    横坐标:按词频降序排列的前 30 个常用词;纵坐标:相应的词频。

    这条曲线大致符合 y=\frac{1}{x},即满足幂律分布(power law distribution),也称长尾效应、二八原则、马太效应等。也就是说,虽然存在很多生词,但越靠后词频越小,趋近于 0。

2. 词典

    互联网上公开的中文词典:搜狗实验室发布的互联网词库(SogouW,其中有 15 万个词条)、清华大学开放中文词库(THUOCL)、HanLP 词典。

2.1 HanLP 词典

    以HanLP 附带的迷你核心词典为例,其路径为 "site-packages/pyhanlp/static/data/dictionary/CoreNatureDictionary.txt"。这是一个纯文本文件,用记事本打开后,可以观察到如下格式:

希望  v  7685   vn 616
希望村    ns 2
希杰 nrf    2
希泊妮    nz 2
希波克拉底  nrf    1

    HanLP 中的词典格式:一种以空格分隔的表格形式,第一列是单词本身,之后每两列分别表示词性与相应的词频。比如第 1 行 “希望 v 7685 vn 616” 表示 “希望” 这个词以动词的身份出现了 7685 次,以动名词的身份出现了 616 次。

    如果单词本身有空格,那该怎么办呢?比如 iPhone X、Macbook Pro,此时可以使用英文逗号分隔的 .csv 文件。

iPhone X, n, n

Macbook Pro, n , 1

    注:如果用户的词语都是名词,或者不关心词性的话,可以省略词性部分。

2.2 词典的加载

"""
加载HanLP中的mini词库
"""

from pyhanlp import JClass, HanLP


def load_dictionary():
    """
    加载HanLP中的mini词库
    :return: 一个set形式的词库
    """
    # 根据 Java 路径名获取 HanLp 中的 IOUtil 工具类
    IOUtil = JClass("com.hankcs.hanlp.corpus.io.IOUtil")
    # 获取 HanLP 的配置项 Config 中的词典路径
    path = HanLP.Config.CoreDictionaryPath.replace(".text", ".mini.text")
    # 加载词典数据,参数可以传一个路径字符串,也可以传一个路径字符串列表,返回一个 Java Map 对象
    # dic = IOUtil.loadDictionary(path)
    dic = IOUtil.loadDictionary([path])
    # 将 Java Map 对象转换为 Python 原生的 Set 对象,并返回
    return set(dic.keySet())


if __name__ == "__main__":
    dic = load_dictionary()
    print(len(dic))
    print(list(dic)[0])
153091
沙特阿尔阿赫利

3. 切分算法

    词典查找的规则:完全切分、正向最长匹配、逆向最长匹配、双向最长匹配。

3.1 完全切分

    完全切分:找出一段文本中的所有单词。

"""完全切分的中文分词算法"""

import os
import sys
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定

from ch02.utifily import load_dictionary


def completely_segment(text, dic):
    """
    完全切分的中文分词算法
    :param text: 待切分的文本
    :param dic: 词典
    :return: 单词列表
    """
    word_list = []
    for i in range(len(text)):                   # i从0遍历到text的最后一个字符的下标
        for j in range(i + 1, len(text) + 1):    # j遍历[i+1, len(text)+1] 区间
            word = text[i: j]                    # 去除连续区间[i, j]对应的字符串
            if word in dic:                      # 如果在词典中,则认为是一
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值