搜索引擎--范例:中英文混杂分词算法的实现--正向最大匹配算法的原理和实现

纯中文和中英文混杂的唯一区别是,分词的时候你如何辨别一个字符是英文字符还是孩子字符,

人眼很容易区分,但是对于计算机来说就没那么容易了,只要能辨别出中文字符和英文的字符,分词本身就不是一个难题

1:文本的编码问题:

  utf8:windows下,以utf8格式保存的文本是一个3个字节(以16进制)的BOM的,并且你不知道一个汉字是否是用3位表示,但是英文适合ascii编码一样的

ascii:英文一位,中文两位,并且中文的第一个字节的值是大于128和,不会和英文混淆,推荐

  unicode:中文基本是两个字节,适合网页纯中文分词

2:分析选择文本编码

  线下的分词我选用的是ascii编码的文本,因为英文和中文的编码容易区分,所以最容易实现

  线上的分词,由于传入的参数是unicode的,纯中文分词更加简单

3:中文分词原理(词库或者语义分词,后者需要大量的数据),这里采用的是词库分词

  我用的中文词库:点此下载本来30万的词库,去掉大于5个字词语后,只剩下25万多,基本够用,ps,我是用结巴分词词库自己提取出来的,可以自己去提取30万的词库^_^

  中文停用词库:点此下载

  分词素材,点词下载10000条新浪微博的数据

  如果点开下载不了,把链接拷贝到迅雷,旋风等下载软件上面下载即可

4:正向最大匹配算法分词的原理

定义一个匹配的最大长度max_length

从左往右,依次遍历文档,

  如果是汉字字符的话,ord>128

    如果长度不足max_length,继续,

    如果长度==max_length,

      依次匹配max_length到1长度的单词

        若匹配到

判断是否为停用词,

             若果不是

记录

  如果是停用词

                重新切词

  若为非汉字字符,对当前遍历得到的中文词组进行处理

    如果为空,继续

    如果不为空,进行分词处理

5:python代码实现正向最大匹配中英文分词如下:weibo是分词的对象,result是分词后结果,可以print出来看看对不对

# -*- coding: cp936 -*-
import string

dist = {}
df = file("bdist.txt","r")
while True:
    line = df.readline()
    if len(line)==0:
        break
    term = line.strip()
    dist[term]=1

stop = {}
sf = file("stopword.txt","r")
while True:
    line = sf.readline()
    if len(line)==0:
        break
    stopping = line.strip()
    stop[stopping]=1

re = {}
def record(t,i,w_id):
    #print(t)
    if re.get(t)==None:
        re[t]=str(w_id)+‘[‘+str(i)+‘.‘
    else:
        re[t]=re[t]+str(i)+‘.‘

wf = file("weibo.txt","r")
while True:
    re = {}
    line = wf.readline()
    if len(line) ==0:
        break
    b = 0;
    #print(line[len(line)-2:len(line)-1])
    if line[len(line)-2:len(line)-1]!=‘1‘:
        continue
    w_id_end = line.find(r‘,‘,0)
    w_id = line[0:w_id_end]
    if not w_id.isdigit():
        continue
    w_id = string.atoi(line[0:w_id_end])
    #print(w_id)
    w_userid_end = line.find(r‘,‘,w_id_end+1)
    w_userid = line[w_id_end+1:w_userid_end]
    #print(w_userid)
    w_username_end = line.find(r‘,‘,w_userid_end+1)
    w_username = line[w_userid_end+1:w_username_end]
    #print(w_username)
    w_content_end = line.find(r‘,‘,w_username_end+1)
    w_content = line[w_username_end+1:w_content_end]
    #print(w_content)

    w_pt_end = line.find(r‘,‘,w_content_end+1)
    w_pt = line[w_content_end+1:w_pt_end]
    #print(line[w_pt_end+1:])
    w_count = string.atoi(line[w_pt_end+1:] )
    #print(w_count)

    weibo = w_content
    #s= type(weibo)
    #print(s)
    #print(weibo)

    #begin particle
    max_length = 10
    weibo_length = len(weibo)
    #print(weibo_length)
    t = 2
    index = 0
    temp = ‘‘
    result = ‘‘
    #print(weibo_length)
    while index<weibo_length:
        #print(index)
        #print(temp)
        s=weibo[index:index+1]
        if ord(s[0])>128:
            #print("ord")
            s = weibo[index:index+2]
            temp = temp+s
            index = index+2
            if len(temp)<max_length and index+1<weibo_length:
                #print("@")
                continue
            else:
                t =temp
                while True:
                    #print(temp)
                    if temp==‘‘:
                        break
                    if dist.get(temp)==1:
                        result = result+temp+‘/‘
                        if stop.get(temp)==None:
                            record(temp,index-2,w_id)
                        temp = t[len(temp):len(t)]
                        #print(temp)
                        if temp!=‘‘ and index+1>weibo_length:
                            t =temp
                            while True:
                                #print(temp)
                                if temp==‘‘:
                                    break
                                if dist.get(temp)==1:
                                    result = result+temp+‘/‘
                                    if stop.get(temp)==None:
                                        record(temp,index-2,w_id)
                                    #print(result)
                                    temp = t[len(temp):len(t)]
                                    t = temp
                                    #print(temp)
                                else:
                                    if len(temp)>0:
                                        temp=temp[0:len(temp)-2]
                        else:
                            break
                    else:
                        if len(temp)>0:
                            temp=temp[0:len(temp)-2]
        else:
            #print("ooo")
            index=index+1
            if temp==‘‘:
                #print("$")
                result =result+s
                continue
            else:
                #print("&")
                t =temp
                while True:
                    #print(temp)
                    if temp==‘‘:
                        break
                    if dist.get(temp)==1:
                        result = result+temp+‘/‘
                        if stop.get(temp)==None:
                            record(temp,index-2,w_id)
                        #print(result)
                        temp = t[len(temp):len(t)]
                        t = temp
                        #print(temp)
                    else:
                        if len(temp)>0:
                            temp=temp[0:len(temp)-2]
                result =result+s
    print(result)
sf.close()
df.close()
wf.close()

6:分词完成后,可以处理得到倒排索引,可以算TF-IDF,可以用向量模型等一系列的知识来做搜索引擎了

搜索引擎--范例:中英文混杂分词算法的实现--正向最大匹配算法的原理和实现,布布扣,bubuko.com

时间: 2024-10-10 05:42:22

搜索引擎--范例:中英文混杂分词算法的实现--正向最大匹配算法的原理和实现的相关文章

搜索引擎--范例:django之初试牛刀

这学期学了一门课<信息检索>,也就是传说中的搜索引擎 大作业自然而然的让我们自己做一个小型的搜索引擎.于是乎,我们本次的主题就诞生了 我也是边学边用,下面和大家一起分享我在这个过程中学到的东西,说的不对的请大家指正 这是我的成果搜索引擎--范例,大家可以点进去看看,点此下载所有文件盒源代码 按照流程,下面我给大家分享的依次是: 1:SAE创建新应用,SVN管理代码 2:新浪微博API获取最近的微博 3:中文分词算法的实现 4:谈谈django--mysql数据库的一些常用命令 搜索引擎--范例

万年历算法的实现(C语言--gcc编译)

/** cal.c * * 现行的格里历是从儒略历演化而来的.儒略历每4年一个润年,润年366天,平年365天.* 如果从公元1年算的话,那么凡是能够被4整除的都是润年.从天文角度看,儒略历这种 * 历法是有误差的,到16世纪误差已经达到了10天.1582年,罗马教皇对儒略历进行了 * 一次校定,该年的10-5到10-14这10天被抹掉,并规定凡不能被400整除的世纪年不再 * 算为润年,校定之后的儒略历即为现行的格里历. * * 但是英国直到1752年才开始使用格里历,此时时间误差已经达到了1

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为

搜索引擎--范例:谈谈django--mysql数据库的一些常用命令

现在基本没有什么能离得开数据库了,django我一直用的都是mysql的数据库,这次和大家说说django--mysql数据库的一些常用命令吧 1:命令行登陆mysql C:\Users\Administrator>mysql -uroot -p Enter password: ******** 2:创建一个新的数据库并使用它 mysql> create database t; Query OK, 1 row affected (0.02 sec) mysql> use t; Datab

Bug2算法的实现(RobotBASIC环境中仿真)

移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不能看几遍就理解理论中的奥妙,只能在别人大谈XX理论XX算法的时候,自己一个人苦逼的面对错误的程序问为什么... 下面开始动手来实现一下简单的Bug2避障算法.由于算法中涉及到机器人与外界环境的交互,因此需要选择一个仿真软件.常用的移动机器人仿真软件主要有Gazebo.V-rep.Webots.MRD

软考笔记第六天之各排序算法的实现

对于前面的排序算法,用c#来实现 直接插入排序: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序.第一趟比较前两个数,然后把第二个数按大小插入到有序表中: 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中:依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程.直接插入排序属于稳定的排序,最坏时间复杂性为O(n^2),空间复杂度为O(1).直接插入排序是由两层嵌套循环组成的.外层循环标识并决定待比较的数值.内层循环为待比较数值确定其最终位

图像旋转算法的实现

上一篇转载的文章(http://blog.csdn.net/carson2005/article/details/36900161)介绍了图像旋转的原理,这里给出代码实现,具体原理请参考上面的链接: 实现代码: void ImgRotate(cv::Mat imgIn, float theta, cv::Mat& imgOut) { int oldWidth = imgIn.cols; int oldHeight = imgIn.rows; // 源图四个角的坐标(以图像中心为坐标系原点) fl

Canny边缘检测算法的实现

Canny原理 Canny的原理就不细说了,冈萨雷斯的<数字图像处理>(第三版)P463~465讲解的比较清楚,主要就四个步骤: 1. 对图像进行高斯滤波 2. 计算梯度大小和梯度方向 3. 对梯度幅值图像进行非极大抑制 4. 双阈值处理和连接性分析(通常这一步与非极大抑制并行,详见下面的代码) 下面重点说一下非极大抑制. 非极大抑制 对一幅图像计算梯度大小和梯度方向后,需要进行非极大抑制,一般都是通过计算梯度方向,沿着梯度方向,判断该像素点的梯度大小是否是极大值.这里主要说一下方向的判断.

Python 排序算法的实现

冒泡排序: 1 def bubble(l): 2 length = len(l) 3 for i in range(length): 4 for j in range(i+1, length): 5 if l[i] > l[j]: 6 l[i], l[j] = l[j], l[i] 7 print l 选择排序: 1 def select(l): 2 length = len(l) 3 for i in range(length): 4 minn = i 5 for j in range(i+1