《自然语言处理》教学上机实验报告.pdfVIP

  • 5
  • 0
  • 约1.58万字
  • 约 9页
  • 2023-09-23 发布于湖北
  • 举报

《自然语言处理》教学上机实验报告.pdf

《⾃然语⾔处理》教学上机实验报告 《⾃然语⾔处理》教学上机实验报告 实验⼀ 基于规则的分词算法 实验 ⽬的和要求: 握完全切分,正向最长匹配,逆向最长匹配,双向最长匹配,⽐较三种匹配效率。 实验过程 : 1.基于字典、词库匹配的分词⽅法(基于规则)。这种⽅法是将待分的句⼦与⼀个充分⼤的词典中的词语进⾏匹配。常⽤的有 :正向最⼤匹 配,逆向最⼤匹配,最少切分法。实际应⽤中,将机械分词作为初分⼿段,利⽤语⾔信息提⾼切分准确率。优先识别具有明显特征的词,以 这些词为断点,将原字符串分为较⼩字符串再机械匹配,以减少匹配错误率,或将分词与词类标注结合。 2.完全算法指的是,找出⼀段⽂本中的所有单词。这并不是标准意义上的分词,有些⼈将这个过程误称为分词,其实并不准确。 伪代码 : def fully_segment(text, dic) : word_ list = [] for i in range(len(text)) : # i从0遍历到text的最后⼀个字的下标 for j in range(i + , len(text) + ) : # j遍历[i + , len(text)]区间 word = text[i:j] # 取出连续区间[i, j)对应的字符串 if word in dic: # 如果在词典中,则认为是⼀个词 word_ list.append(word) return word_ list 在正向最长匹配算法中,算法有可能分出不太令⼈满意的结果,此时,我们可以尝试逆向最长匹配算法。 3.逆向最长匹配算法和正向匹配⽅法类似,都是找出⼀段⽂本中的所有单词,有所不同的是,逆向最长匹配算法是从逆向来寻找词的。 伪代码 : def backward_segment(text, dic) : word_ list = [] i = len(text) - while i = 0: # 扫描位置作为终点 longest_word = text[i] # 扫描位置的单字 for j in range(0, i) : # 遍历[0, i]区间作为待查询词语的起点 word = text[j : i + ] # 取出[j , i]区间作为待查询单词 if word in dic: if len(word) len(longest_word) : # 越长优先级越⾼ longest_word = word word_ list.insert(0, longest_word) # 逆向扫描,因此越先查出的单词在位置上越靠后 i -= len(longest_word) return word_ list 4.⼈们经过尝试上述两种算法,发现有时正向匹配正确,有时逆向匹配正确,但似乎逆向匹配成功的次数更多。为此,⼈们继续提出新的规 则,⽐如所谓的双向最长匹配。 流程如下 : (1)同时执⾏正向和逆向最长匹配,若两者的词数不同,则返回词数更少的那⼀个。 (2)否则,返回两者中单词更少的那⼀个。当词数也相同时,优先返回逆向最长匹配的结果。 伪代码 : def count_single_char(word_ list : list) : # 统计单字成词的个数 return sum( for word in word_ list if len(word) == ) def bidirectional_segment(text, dic) : f = forward_segment(text, dic) b = backward_segment(text, dic) if len(f) len(b) : # 词数更少

文档评论(0)

1亿VIP精品文档

相关文档