作业1:Hanlp
安装hanlp工具
- 安装pyhanlp包
命令行:pip install pyhanlp - from pyhanlp import *
在python中调用pyhanlp工具会自动安装hanlp.jar包并配置环境
- 测试语句:“今天开心了吗?”‘
from pyhanlp import *
print(HanLP.segment("今天开心了吗?"))
安装成功。
2.使用hanlp进行分词
1.默认分词
代码:
paraStr1='中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程'
print("="*30+"HanLP分词"+"="*30)
HanLP = JClass('com.hankcs.hanlp.HanLP')
print(HanLP.segment(paraStr1))
2.标准分词
print("="*30+"标准分词"+"="*30)
StandardTokenizer = JClass('com.hankcs.hanlp.tokenizer.StandardTokenizer')
print(StandardTokenizer.segment(paraStr1))
3.NLP分词
print("="*30+"NLP分词"+"="*30)
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment(paraStr1))
4.索引分词
print("="*30+"索引分词"+"="*30)
IndexTokenizer = JClass('com.hankcs.hanlp.tokenizer.IndexTokenizer')
termList= IndexTokenizer.segment(paraStr1)
for term in termList :
print(str(term) + " [" + str(term.offset) + ":" + str(term.offset + len(
term.word)) + "]")
5.极速词典分词
print("="*30+" 极速词典分词"+"="*30)
SpeedTokenizer = JClass('com.hankcs.hanlp.tokenizer.SpeedTokenizer')
print(NLPTokenizer.segment(paraStr1))
6.自定义分词
paraStr2 = '中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程'
print("="*30+" 自定义分词"+"="*30)
CustomDictionary = JClass('com.hankcs.hanlp.dictionary.CustomDictionary')
CustomDictionary.add('自然语言')
CustomDictionary.add('处理')
HanLP = JClass('com.hankcs.hanlp.HanLP')
print(HanLP.segment(paraStr2))
向词典中添加“自然语言”,“处理”词,分词结果如下:
3.分词结果
对比发现,默认分词,标准分词,NLP分词,极速分词,自定义分词结果相同。索引分词结果更加细致,可以返回长词,短词,长短词等多种分词结果。
作业2:jieba分词
导入jieba包,采用4中分词方式进行分词,分别是全模式,精确模式,默认模式,网页搜索模式进行分词,代码如下:
import jieba
#jieba_分词
#Python join() 用于将序列中的元素以指定的字符连接生成一个新的字符串。
import jieba
seg = "。。。"
seg_list = jieba.cut(seg, cut_all=True)
print("="*30 + "全模式 " + "="*30)
print( "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut(seg, cut_all=False)
print("="*30 + "精确模式 " + "="*30)
print( "/ ".join(seg_list)) # 精确模式
seg_list = jieba.cut(seg) # 默认是精确模式
print("="*30 + "默认精确模式 " + "="*30)
print("/ ".join(seg_list))
seg_list = jieba.cut_for_search(seg) # 搜索引擎模式
print("="*30 + "搜索引擎模式 " + "="*30)
print( "/ ".join(seg_list))
分词结果如下:
-
全模式分词:把句子中的所有可以成词的词语都扫描出来。
-
精确模式/默认精确模式:试图将文本最精确的分开。
-
搜索引擎模式
分析结果,不同模式下,部分相同词项返回的分词结果。
全模式和搜索引擎下计算机技术 返回了 “计算/计算机/计算机技术/算机/技术/” 等多种结果。自然语言处理 返回了 自然/自然语言/语言 处理等多种结果。
而精确模式返回的为 “计算机技术 ,自然语言处理。
整体来看,全模式和搜索引擎模式返回的分词结果更详尽;精确模式下返回的分词结果更精准,避免了词项的重复,因此精确模式下的分词更适合文本分析。
不足: 几种模式下,都没有对人名进行正确分词,需要使用新词发现算法或添加自定义词典进行处理。
作业3
- 获取文本路径,停用词路径
text_path = "shitouji"#相对路径,文本和工程放在一个目录下
stop_words_path = "哈工大停用词表.txt" #相对路径,文本和工程放在一个目录下
文本是从网络上下载的曹雪芹著作《石头记》,利用简繁体转换工作转换成繁体。
停用词为哈工大停用词表。
- 定义词典,按照精确模式分词,获取分词后的停用词
def get_seg_dic(text_path, stop_words_path):
'''
:param path: 文本路径
:return: 文本分词、去除停用词之后的词典
'''
f = open(text_path,"r",encoding="utf-8")
f_text = f.read()
print(f_text)
f_seg_list = jieba.cut(f_text,cut_all=False)
print(f_seg_list)
f.close()
stop = open(stop_words_path,"r",encoding="utf-8") #打开停用词文本
stop_text = stop.read() #获取停用词文本
stop_words_list = stop_text.split("\n") #split()通过指定分隔符对字符串进行切片
dic = {}
for word in f_seg_list:
if not (word.strip() in stop_words_list):
dic.setdefault(word, 0)
dic[word] += 1
return dic
传入值是文本路径,停用词路径,返回值是去停用词后的词典。
- 查看词频词项(仅部分)
按词频降序:
可以看到,因为现今的停用词表都是简体停用词,所以并没有清除掉繁体停用词。所以高频词有:
[(‘說’, 7847), (‘妳’, 6766), (‘道’, 6216), (‘裏’, 5289), (‘來’, 4764), (‘麽’, 4054), (‘著’, 3337), (‘不’, 3045), (‘壹’, 2894), (‘便’, 2728), (‘人’, 2696)]
按词频降序排序:
可以看到,高频词中包含了很多人名,宝玉,贾母,凤姐,王夫人,姑娘,宝钗等,还包含了“说”,“道”,“听”,“笑”等动词。可以初步分析这是一篇以人物描写为主的小说。