当前位置:   article > 正文

pyhanlp词典分词_from utility import load_dictionary # 导入加载词典函数 mod

from utility import load_dictionary # 导入加载词典函数 modulenotfounderror:

目录

1、utility.py(加载词典)

2、fully_segment.py(完全切分)

3、forward_segment.py(正向最长匹配)

4、backward_segment.py(逆向最长匹配)

5、bidirectional_segment.py(双向最长匹配)

备注

参考文献


1、utility.py(加载词典)

  1. # 导入pyhanlp库中的所有包
  2. from pyhanlp import *
  3. # 定义加载词典函数
  4. def load_dictionary():
  5. IOUtil = JClass('com.hankcs.hanlp.corpus.io.IOUtil')
  6. path = HanLP.Config.CoreDictionaryPath.replace('.txt', '.mini.txt')
  7. dic = IOUtil.loadDictionary([path])
  8. return set(dic.keySet())
  9. # 确保被import到其他文件时只导入前面的代码,而忽略后面的代码
  10. if __name__ == '__main__':
  11. # 加载词典
  12. dic = load_dictionary()
  13. # 输出词典中的词个数
  14. print(len(dic))
  15. # 将元组转换为列表,并输出列表中第一个单词(因此输出会有随机加载一个单词的效果)
  16. print(list(dic)[0])

2、fully_segment.py(完全切分)

  1. # 从utility.py中导入load_dictionary函数
  2. from utility import load_dictionary
  3. # 定义完全切分算法
  4. def fully_segment(text, dic):
  5. word_list = []
  6. for i in range(len(text)): # i 从 0 到text的最后一个字的下标遍历
  7. for j in range(i + 1, len(text) + 1): # j 遍历[i + 1, len(text)]区间
  8. word = text[i:j] # 取出连续区间[i, j]对应的字符串
  9. if word in dic: # 如果在词典中,则认为是一个词
  10. word_list.append(word)
  11. return word_list
  12. # 确保被import到其他文件时只导入前面的代码,而忽略后面的代码
  13. if __name__ == '__main__':
  14. # 加载词典
  15. dic = load_dictionary()
  16. # 进行完全分词并输出结果
  17. print(fully_segment('你不对劲', dic))
  18. print(fully_segment('中国的首都是北京', dic))

3、forward_segment.py(正向最长匹配)

  1. # 从utility.py中导入load_dictionary函数
  2. from utility import load_dictionary
  3. # 定义正向最长匹配算法
  4. def forward_segment(text, dic):
  5. word_list = []
  6. i = 0
  7. while i < len(text):
  8. longest_word = text[i] # 当前扫描位置的单字
  9. for j in range(i + 1, len(text) + 1): # 所有可能的结尾
  10. word = text[i:j] # 从当前位置到结尾的连续字符串
  11. if word in dic: # 在词典中
  12. if len(word) > len(longest_word): # 并且更长
  13. longest_word = word # 则更优先输出
  14. word_list.append(longest_word) # 输出最长词
  15. i += len(longest_word) # 正向扫描
  16. return word_list
  17. # 确保被import到其他文件时只导入前面的代码,而忽略后面的代码
  18. if __name__ == '__main__':
  19. # 加载词典
  20. dic = load_dictionary()
  21. # 进行正向最长匹配分词并输出结果
  22. print(forward_segment('你不对劲', dic))
  23. print(forward_segment('中国的首都是北京', dic))

4、backward_segment.py(逆向最长匹配)

  1. # 从utility.py中导入load_dictionary函数
  2. from utility import load_dictionary
  3. # 定义逆向最长匹配算法
  4. def backward_segment(text, dic):
  5. word_list = []
  6. i = len(text) - 1
  7. while i >= 0: # 扫描位置作为终点
  8. longest_word = text[i] # 扫描位置的单字
  9. for j in range(0, i): # 遍历[0, i]区间作为待查询词语的起点
  10. word = text[j: i + 1] # 取出[j, i]区间作为待查询单词
  11. if word in dic:
  12. if len(word) > len(longest_word): # 越长优先级越高
  13. longest_word = word
  14. break
  15. word_list.insert(0, longest_word) # 逆向扫描,所以越先查出的单词在位置上越靠后
  16. i -= len(longest_word)
  17. return word_list
  18. # 确保被import到其他文件时只导入前面的代码,而忽略后面的代码
  19. if __name__ == '__main__':
  20. # 加载词典
  21. dic = load_dictionary()
  22. # 进行逆向最长匹配分词并输出结果
  23. print(backward_segment('你不对劲', dic))
  24. print(backward_segment('中国的首都是北京', dic))

5、bidirectional_segment.py(双向最长匹配)

  1. # 从backward_segment.py文件导入backward_segment函数
  2. from backward_segment import backward_segment
  3. # 从forward_segment.py文件导入forward_segment函数
  4. from forward_segment import forward_segment
  5. # 从utility.py中导入load_dictionary函数
  6. from utility import load_dictionary
  7. # 定义 统计单字成词的个数 函数
  8. def count_single_char(word_list: list):
  9. return sum(1 for word in word_list if len(word) == 1)
  10. # 定义双向最长匹配算法
  11. def bidirectional_segment(text, dic):
  12. f = forward_segment(text, dic)
  13. b = backward_segment(text, dic)
  14. if len(f) < len(b): # 词数更少优先级更高
  15. return f
  16. elif len(f) > len(b):
  17. return b
  18. else:
  19. if count_single_char(f) < count_single_char(b): # 单字更少优先级更高
  20. return f
  21. else:
  22. return b # 都相等时逆向匹配优先级更高
  23. # 确保被import到其他文件时只导入前面的代码,而忽略后面的代码
  24. if __name__ == '__main__':
  25. # 加载词典
  26. dic = load_dictionary()
  27. # 进行双向最长匹配分词并输出结果
  28. print(bidirectional_segment('你不对劲', dic))
  29. print(bidirectional_segment('中国的首都是北京', dic))

备注

句子太长时,可以在字符串中某一位置键入“回车”,即可实现在编辑器中换行而在显示器中不换行的效果。

具体源代码可以查看下面“图灵社区”链接,下载资料

参考文献

图灵社区

《自然语言处理入门》 by 何晗(@hankcs)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/353828?site
推荐阅读
相关标签
  

闽ICP备14008679号