自然语言处理 | (7)中文文本基本任务与处理

目录

1.分词

 2.停用词与N-gram

3.词性标注、依赖分析、NER、关键词抽取

4.jieba工具库使用


1.分词

关于分词方法和工具库更多内容可以参考知乎讨论有哪些比较好的中文分词方案

中文分词与之前的英文分词(一般以空格分隔)相比更加复杂,词和词紧密连接,需要考虑语境和词义等信息。

 2.停用词与N-gram

  • 停用词

中文当中常用到的停用词词表可以参见中文常用停用词表

关于机器学习中停用词的产出与收集方法,大家可以参见知乎讨论机器学习中如何收集停用词

  • N-gram

N-gram在中文中叫做n元语法,指文本中连续出现的n个语词。n元语法模型是基于(n-1)阶马尔可夫链的一种概率语言模型,通过n个语词出现的概率来推断语句的结构。关于语言模型的更多内容,我们之后会详细学习。

可以阅读自然语言处理中N-Gram模型介绍了解更多内容。

3.词性标注、依赖分析、NER、关键词抽取

  • 词性标注

 

 

  • 句法依存分析

  • 命名实体识别

  • 关键词抽取

4.jieba工具库使用

  • 基本分词函数与用法

# encoding=utf-8
#! pip install jieba #安装jieba
import jieba

seg_list = jieba.cut("我在网易云课堂学习自然语言处理",cut_all = True) 
print("全模式: " + "/".join(seg_list)) #全模式 会把所有可能的词都给切分出来

seg_list = jieba.cut("我在网易云课堂学习自然语言处理")
print("默认模式: " + "/".join(seg_list)) #精确模式

seg_list = jieba.cut("他毕业于北京航空航天大学,在百度深度学习研究院进行研究")
print(", ".join(seg_list)) #默认为精确模式

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在斯坦福大学深造")
print(", ".join(seg_list)) #搜索引擎模式 全模式

可以使用jieba.lcut以及jieba.lcut_for_search直接返回 list:

print(jieba.lcut("我在网易云课堂学习自然语言处理"))
print(jieba.lcut_for_search("小明硕士毕业于中国科学院计算所,后在斯坦福大学深造"))

添加用户自定义字典:

print('/'.join(jieba.cut('如果放到旧字典中将出错。', HMM=False)))
jieba.suggest_freq(('中','将'),True) #把中 将分开
print('/'.join(jieba.cut('如果放到旧字典中将出错。', HMM=False)))

  • 词性标注
import jieba.posseg as pseg

words = pseg.cut("我在网易云课堂学习自然语言处理")
for word,flag in words:
    print('%s %s' % (word,flag))

  • 关键词抽取

1.基于 TF-IDF 算法的关键词抽取

import jieba.analyse as analyse

with open('data/NBA.txt',encoding='utf8') as f:
    lines = f.read()  #读入文本保存到字符串中
withWeight = False
tags = analyse.extract_tags(lines,topK=20,withWeight=withWeight,allowPOS=())

if withWeight is True:
    print(tags) #元组列表  
    print("-------")
    for tag in tags:
        print("tag: %s\t\t weight: %f" % (tag[0],tag[1]))
else:
    print(tags)
    print("--------")
    print(" ".join(tags))

with open('data/novel.txt',encoding='utf8') as f:
    lines = f.read() #读入文本保存到字符串中
withWeight = True
#把提取的关键词限定为名词
tags = analyse.extract_tags(lines,topK=10,withWeight=withWeight,allowPOS=('n'))

if withWeight is True:
    print(tags) #元组列表  
    print("-------")
    for tag in tags:
        print("tag: %s\t\t weight: %f" % (tag[0],tag[1]))
else:
    print(tags)
    print("--------")
    print(" ".join(tags))

关于TF-IDF 算法的关键词抽取补充:

         阅读材料:TF-IDF与关键词提取

  • 关键词提取所使用逆向文件频率(IDF)默认使用内置的文本语料库进行计算,也可以切换成自定义语料库的路径

            用法: jieba.analyse.set_idf_path(file_name) # file_name为自定义语料库的路径

                            自定义语料库示例见这里

                            用法示例见这里

        关键词提取所使用停止词(Stop Words)文本语料库默认是jieba内置的,也可以切换成自定义语料库的路径

            用法: jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径

                自定义语料库示例见这里

                用法示例见这里

        关键词一并返回关键词权重值示例

                用法示例见这里

 

2.基于 TextRank 算法的关键词抽取

      算法论文: TextRank: Bringing Order into Text

      阅读资料:

             基于textrank的关键词抽取方法

                         pagerank算法核心思想

                         浅析PageRank算法

import jieba.analyse as analyse
with open('data/NBA.txt', encoding='utf8')as f:
    lines = f.read()

withWeight = False
#把提取的关键词限定为名词、动词等
tags = analyse.textrank(lines,topK=10,withWeight=withWeight,allowPOS=('ns', 'n', 'vn', 'v'))

if withWeight is True:
    print(tags) #元组列表  
    print("-------")
    for tag in tags:
        print("tag: %s\t\t weight: %f" % (tag[0],tag[1]))
else:
    print(tags)
    print("--------")
    print(" ".join(tags))
print("---------------------我是分割线----------------")

withWeight = True
#把提取的关键词限定为名词
tags = analyse.textrank(lines,topK=10,withWeight=withWeight,allowPOS=('ns', 'n'))

if withWeight is True:
    print(tags) #元组列表  
    print("-------")
    for tag in tags:
        print("tag: %s\t\t weight: %f" % (tag[0],tag[1]))
else:
    print(tags)
    print("--------")
    print(" ".join(tags))

lines = open('data/novel.txt', encoding='utf8').read()
print("  ".join(analyse.textrank(lines, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))))

 

 

 

猜你喜欢

转载自blog.csdn.net/sdu_hao/article/details/86763168