NLP的学习

1. 什么是分词

根据语境,将句子以字词为单位划分的过程称之为分词。

2. 为什么需要分词

在英文中,单词之间有空格做天然的分割,分词变得非常简单。而汉语的基本单位是字词,字词是理解句子的基本单位。分词是自然语言处理的基础,分词不好,后面很难去做进一步分析。尽管现在NLP中有很多算法以字来切分,比如bert,中文分词仍然是NLP中很重要、很基础的一块工作。

3. 分词工具

目前,已经有许多开源的中文分词工具,比如jieba,hanlp,pkuseg。这些分词工具都能很好地处理好大部分中文语句的分词工作,所以大部分时候我们不需要重复造轮子。对于一些专业的垂直领域,有些专业常用语可以用增加自定义词典的方式来提高上述分词工具的准确性。

4. 最大匹配分词算法

基于词典的分词方法,比较简单,根据起始匹配位置不同可以分为:

前向最大匹配算法 (FMM,Forward Maximum Matching)
后向最大匹配算法(BMM, Backward Maximum Matching)
双向最大匹配算法

4.1 前向最大匹配算法(FMM)

算法思想:前向最大匹配算法,顾名思义,前向即从左往右取词,取词最大长度为词典中最长词的长度,每次右边减一个字,直到词典中存在或剩下1个单字。

关键点:预先准备好词典;获取词典中最长词的长度;从左到右依次匹配

Python代码实现

#前向最大匹配算法
class FMM:
    def __init__(self):
        self.dict={'我是','我','是','某某','大学','的','大学生','生活','生','学生'}
        self.size=3

    def cut(self,text):
        word_split=[]
        start_index=0
        while start_index

4.2 后向最大匹配算法(BMM)

算法思想:后向最大匹配算法,顾名思义,后向即从右往左取词,取词最大长度为词典中最长词的长度,每次左边减一个字,直到词典中存在或剩下1个单字。

关键点:预先准备好词典;获取词典中最长词的长度;从右到左依次匹配

Python代码实现

#后向最大匹配算法
class BMM:
    def __init__(self):
        self.dict={'我是','我','是','某某','大学','的','大学生','生活','生','学生'}
        self.size=3

    def cut(self,text):
        word_split=[]
        start_index=len(text)
        while start_index>0:
            for end_index in range(self.size,-1,-1):
                word=text[start_index-end_index:start_index]
                if word in self.dict:
                    word_split.append(word)
                    start_index=start_index-end_index
                    break
        word_split.reverse()
        return word_split

bmm=BMM()
words2=bmm.cut("我是某某大学的大学生")
print(words2)

4.3 双向最大匹配

双向最大匹配法:FMM和BMM两种算法都分词一遍,然后根据大颗粒度词越多越好,非词典词和单字词越少越好的原则,选取其中一种分词结果输出。

选择标准:

  • 首先看两种方法结果的分词数,分词数越少越好;
  • 分词数相同的情况下,看单个词的数量,越少越好;
#接上面的代码

#双向最大匹配
l1=len(words1)
l2=len(words2)
if(l1==l2):
    print("前向和后向都可: ",words1)
elif l1>l2:
    print(words1)
else:
    print(words2)

你可能感兴趣的:(nlp)