如何利用Python对中文进行分词处理

如何利用Python对中文进行分词处理,第1张

python做中文分词处理主要有以下几种:结巴分词、NLTK、THULAC

1、fxsjy/jieba

结巴的标语是:做最好的 Python 中文分词组件,或许从现在来看它没做到最好,但是已经做到了使用的人最多。结巴分词网上的学习资料和使用案例比较多,上手相对比较轻松,速度也比较快。

结巴的优点:

支持三种分词模式

支持繁体分词

支持自定义词典

MIT 授权协议

2、THULAC:一个高效的中文词法分析工具包

前两天我在做有关于共享单车的用户反馈分类,使用jieba分词一直太过零散,分类分不好。后来江兄给我推荐了THULAC: 由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包 。THULAC的接口文档很详细,简单易上手。

THULAC分词的优点:

能力强。利用规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。

准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达973%,词性标注的F1值可达到929%

速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度达到13MB/s,速度比jieba慢

Python 解决中文编码问题基本可以用以下逻辑:

utf8(输入) ——> unicode(处理) ——> (输出)utf8

Python 里面处理的字符都是都是unicode 编码,因此解决编码问题的方法是把输入的文本(无论是什么编码)解码为(decode)unicode编码,然后输出时再编码(encode)成所需编码。

由于处理的一般为txt 文档,所以最简单的方法,是把txt 文档另存为utf-8 编码,然后使用Python 处理的时候解码为unicode(sometextsdecode('utf8')),输出结果回txt 的时候再编码成utf8(直接用str() 函数就可以了)。

众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我 是 一个 学生。

中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。

现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。

1、基于字符串匹配的分词方法

这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:

1)正向最大匹配法(由左到右的方向);

2)逆向最大匹配法(由右到左的方向);

3)最少切分(使每一句中切出的词数最小)。

还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。

一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。

对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。

2、基于理解的分词方法

这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。

3、基于统计的分词方法

从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。

到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。笔者了解,海量科技的分词算法就采用“复方分词法”,所谓复方,相当于用中药中的复方概念,即用不同的药才综合起来去医治疾病,同样,对于中文词的识别,需要多种算法来处理不同的问题。

提供一下思路作参考:因为输入的随意性较大,而词典较固定;

可以遍历词典替换语句中的词为一个特定字符,成功一个,记录一个;

如:遍历"语言"后,记录"语言"

我这学期学了刘杰老师的自然@理解概论课

遍历"老师"后,记录"老师"

我这学期学了刘杰@的自然@理解概论课

当然还要这里要考虑速度,及重复的问题,希望对你有帮助

 #! python3

# -- coding: utf-8 --

import os, codecs

import jieba

from collections import Counter

 

def get_words(txt):

    seg_list = jiebacut(txt)

    c = Counter()

    for x in seg_list:

        if len(x)>1 and x != '\r\n':

            c[x] += 1

    print('常用词频度统计结果')

    for (k,v) in cmost_common(100):

        print('%s%s %s  %d' % ('  '(5-len(k)), k, ''int(v/3), v))

 

if __name__ == '__main__':

    with codecsopen('19dtxt', 'r', 'utf8') as f:

        txt = fread()

    get_words(txt)

而百度中文分词就是把词按照一定的规格,将一个长尾词分割成几个部分,从而概括一段话的主要内容。在百度中文分词中,百度强调的是:一、

字符串匹配的分词方法。我们需要有一定的字符串做基础,就是一段词用字符分开,比如标点符号,空格等。才能够进行分词匹配,我们把这些字符串叫做机械词典。机械词典的个数不定。由每个搜索引擎自己确定。每个机械词典之间还会有优先级。字符串匹配的分词方法最常用的有几种:1、正向最大匹配法(由左到右的方向)2、逆向最大匹配法(由右到左的方向)3、最少切分(使每一句中切出的词数最小)百度中文分词基于字符串匹配举例给大家说明一下:“我想去澳大利亚旅游”正向最大匹配:我想去,澳大利亚旅游逆向最大匹配:我想,想去,澳大利亚,旅游。最少切分:我把上面哪句话分成的词要是最少的“我想去,澳大利亚旅游”这就是最短路径分词法,分出来就只有2个词了。另外,不同的搜索的词典不同,分出来的词也不同。二、理解的分词方法。这种分词方法不需要机械词典。这种其实就是一种机器语音判断的分词方法。很简单,进行句法、语义分析,利用句法信息和语义信息来处理歧义现象来分词,这种分词方法,现在还不成熟。处在测试阶段。三、统计的分词方法。这个顾名思义,就是根据词组的统计,发现那些相邻的字出现的频率高,那么这个词就很重要。可以作为用户提供字符串中的分隔符。比如,“我的,你的,许多的,这里,这一,那里”。等等,这些词出现的比较多,就从这些词里面分开来。四、对于百度中文分词的理解:基于统计的分词方法得到的词或者句子的权重要高于基于字符串匹配得到的。就是全字匹配得到的词的权重会高于分开的词的权重。根据自己的观察现在百度大部分都是使用的是正向匹配。百度分词对于一句话分词之后,还会去掉句子中的没有意义的词语。

1)正向最大匹配法(由左到右的方向);

2)逆向最大匹配法(由右到左的方向);

3)最少切分(使每一句中切出的词数最小)

还可以将上述各种方法相互组合,例,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法

最复杂的就是这一行了:

(word for word in jiebacut(line,HMM=True)if word not in stop and len(wordstrip())>1)

jiebacut(line)将一行字符串,分割成一个个单词

word for word in jiebacut(line,HMM=True)是一个Python的表理解,相当于for循环遍历分割好的一个个单词

if word not in stop and len(wordstrip())>1这仍然是表理解的一部分,如果满足条件,就把单词加入到一个新的列表中,如果不满足就丢弃,

word not in stop单词不在停用词当中

len(wordstrip())>1单词去掉首尾的空格、标点符号后的长度大于1。

以上就是关于如何利用Python对中文进行分词处理全部的内容,包括:如何利用Python对中文进行分词处理、已知一个包含若干英文单词的词典对任意输入的某一个单词查询单词在词典中的位置,只有一个字服不匹配的、vb6.0高手进!有一个txt词典,要在text1中输入一句话,依照词典实现分词。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9701847.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存