『NLP自然语言处理』中文文本的分词、去标点符号、去停用词、词性标注

利用Python代码实现中文文本的自然语言处理,包括分词、去标点符号、去停用词、词性标注&过滤。

在刚开始的每个模块,介绍它的实现。最后会将整个文本处理过程封装成 TextProcess 类。

结巴分词

jieba 是比较好的中文分词库,在此之前,需要 pip install jieba

结巴分词有三种模式:

  • 全模式 :把句子中所有的可以成词的词语都扫描出来
jieba.cut(text, cut_all=True)
  • 精确模式 :将句子最精确地切开,适合文本分析
jieba.cut(text, cut_all=False)  # 默认模式
  • 搜索引擎模式 :在精确模式的基础上,对长词再次切分,适合用于搜索引擎分词
jieba.cut_for_search(txt)

三种分词效果如下图所示:在这里插入图片描述
想要进一步了解 jieba 三种模式,请参考 详细介绍 。因为我要做的是文本分析,所以选用的是默认的精确模式。

对于一些词,比如“吃鸡”,jieba 往往会将它们分成 “吃” 和 “鸡” ,但是又不太想让它们分开,这该怎么做呢?这时候就需要加载自定义的词典 dict.txt。建立该文档,在其中加入“吃鸡”,执行以下代码:

file_userDict = 'dict.txt'  # 自定义的词典
jieba.load_userdict(file_userDict)

效果对比图:
在这里插入图片描述
在这里插入图片描述

词性标注

在用 posseg 分词后,结果是一对值,包括 wordflag ,可以用 for 循环获取。关于汉语词性对照表,请看 词性标注表

import jieba.posseg as pseg
sentence = "酒店就在海边,去鼓浪屿很方便。"
words_pair = pseg.cut(sentence)
result = " ".join(["{0}/{1}".format(word, flag) for word, flag in words_pair])
print(result)

在这里插入图片描述
在此基础上,可以进一步做词性过滤,只保留特定词性的词。首先在 tag_filter 表明想要留下哪些词,接着对于词性标注后的句子中的每一个词,如果词性符合,则加入到 list 中。在这里只保留了名词和动词。

import jieba.posseg as pseg
list = []
sentence = "人们宁愿去关心一个蹩脚电影演员的吃喝拉撒和鸡毛蒜皮,而不愿了解一个普通人波涛汹涌的内心世界"
tag_filter = ['n', 'v']  # 需要保留的词性
seg_result = pseg.cut(sentence)  # 结果是一个pair,有flag和word两种值
list.append([" ".join(s.word for s in seg_result if s.flag in tag_filter)])
print("词性过滤完成")
print(list)

在这里插入图片描述

去停用词

去停用词时,首先要用到停用词表,常见的有哈工大停用词表百度停用词表,在网上随便下载一个即可。
在这里插入图片描述
在去停用词之前,首先要通过 load_stopword( ) 方法来加载停用词列表,接着按照上文所示,加载自定义词典,对句子进行分词,然后判断分词后的句子中的每一个词,是否在停用词表内,如果不在,就把它加入 outstr,用空格来区分 。

import jieba


#  加载停用词列表
def load_stopword():
    f_stop = open('hit_stopwords.txt', encoding='utf-8')  # 自己的中文停用词表
    sw = [line.strip() for line in f_stop]  # strip() 方法用于移除字符串头尾指定的字符(默认为空格)
    f_stop.close()
    return sw


# 中文分词并且去停用词
def seg_word(sentence):
    file_userDict = 'dict.txt'  # 自定义的词典
    jieba.load_userdict(file_userDict)

    sentence_seged = jieba.cut(sentence.strip())
    stopwords = load_stopword()
    outstr = ''
    for word in sentence_seged:
        if word not in stopwords:
            if word != '/t':
                outstr += word
                outstr += " "
    print(outstr)
    return outstr


if __name__ == '__main__':
    sentence = "人们宁愿去关心一个蹩脚电影演员的吃喝拉撒和鸡毛蒜皮,而不愿了解一个普通人波涛汹涌的内心世界"
    seg_word(sentence)

在这里插入图片描述

去标点符号

导入 re 包,定义标点符号,使用 sub( ) 方法将之替换。

import re

sentence = "+蚂=蚁!花!呗/期?免,息★.---《平凡的世界》:了*解一(#@)个“普通人”波涛汹涌的内心世界!"
sentenceClean = []
remove_chars = '[·’!"\#$%&\'()#!()*+,-./:;<=>?\@,:?¥★、….>【】[]《》?“”‘’\[\\]^_`{|}~]+'
string = re.sub(remove_chars, "", sentence)
sentenceClean.append(string)
print(sentence)
print(sentenceClean)

在这里插入图片描述

最终代码

最后结合上面的内容,将它们封装到一个 TextProcess 类中。 filePath 是刚开始要处理的文本位置, fileSegDonePath 是处理完毕后要保存的位置。

思路是先将要处理的文本逐行保存到一个 fileTrainRead 的列表中,然后有两种方法可供选择:

  • 加载停用词表,对它进行分词及去停用词操作,保存到 word_list_seg 列表中;

  • 或者也可以选择不分词及去停用词,而是直接从句子中提取需要的词性,然后保存到 word_list_pos 列表中。

由于停用词及词性过滤都对句子标点进行了去除,因此该类中不包含标点符号的去除。最后将处理好的句子写入文件中。

import jieba
import jieba.posseg as pseg


class TextProcess(object):

    def __init__(self, filePath, fileSegDonePath):
        self.filePath = filePath  # 需要处理的文本位置
        self.fileSegDonePath = fileSegDonePath  # 处理完毕后的保存位置
        self.fileTrainRead = []  # 所有行保存到该列表
        self.stopPath = "hit_stopwords.txt"  # 自己所用的停用词表位置
        self.word_list_seg = []  # 分词及去停用词后保存的列表
        self.word_list_pos = []  # 词性过滤后保存的列表

    # 将每一行文本依次存放到一个列表
    def saveLine(self):
        count = 0  # 统计行数
        with open(self.filePath, encoding='utf-8') as fileTrainRaw:
            for index, line in enumerate(fileTrainRaw):
                self.fileTrainRead.append(line)
                count += 1
        print("一共有%d行" % count)
        return self.fileTrainRead

    # 加载停用词表
    def load_stopword(self):
        f_stop = open(self.stopPath, encoding='utf-8')  # 自己的中文停用词表
        sw = [line.strip() for line in f_stop]  # strip() 方法用于移除字符串头尾指定的字符(默认为空格)
        f_stop.close()
        return sw

    # 分词并且去停用词,与下一个词性过滤方法选择一个即可
    def segLine(self):
        file_userDict = 'dict.txt'  # 自定义的词典
        jieba.load_userdict(file_userDict)
        for i in range(len(self.fileTrainRead)):
            sentence_seged = jieba.cut(self.fileTrainRead[i].strip())
            stopwords = self.load_stopword()
            outstr = ''
            for word in sentence_seged:
                if word not in stopwords:
                    if word != '/t':
                        outstr += word
                        outstr += " "
            self.word_list_seg.append([outstr])
        print("分词及去停用词完成")
        return self.word_list_seg

    # 保留特定词性
    def posLine(self):
        for i in range(len(self.fileTrainRead)):
            tag_filter = ['n', 'd', 'a', 'v', 'f', 'ns', 'vn']  # 需要保留的词性 d-副词 f-方位词 ns-地名 vn-名动词
            seg_result = pseg.cut(self.fileTrainRead[i])  # 结果是一个pair,有flag和word两种值
            self.word_list_pos.append([" ".join(s.word for s in seg_result if s.flag in tag_filter)])
        print("词性过滤完成")
        return self.word_list_pos

    # 处理后写入文件
    def writeFile(self):
        with open(self.fileSegDonePath, 'wb') as fs:
            for i in range(len(self.word_list_seg)):  # 选择去停用词方法
                fs.write(self.word_list_seg[i][0].encode('utf-8'))
                fs.write('\n'.encode("utf-8"))
            '''
            for i in range(len(self.word_list_pos)):  # 选择词性过滤方法
                fs.write(self.word_list_pos[i][0].encode('utf-8'))
                fs.write('\n'.encode("utf-8"))
            '''


if __name__ == '__main__':
    tp = TextProcess('ex.txt', 'final.txt')
    tp.saveLine()  # 将每一行文本依次存放到一个列表
    tp.load_stopword()  # 加载停用词表
    tp.segLine()
    # tp.posLine()
    tp.writeFile()

原始文本(爬取的酒店评论部分数据):

各方面条件都很好,就是住进去时没有明面窗户屋子里比较潮,后来用了除湿器。
位置特别好,出入方便,酒店前台、门童服务特别好。
就在步行街路口,位置不错。酒店服务也挺好的。
酒店各方面非常不错。“健身房”实在是短板。太影响整体形象
酒店位置很好中山路步行街口,有停车场出行很方便。
早餐品种丰富,工作人员很热情,海景房能观赏鼓浪屿夜景相当不错!
早点丰富,出行方便!

选择去停用词方法效果:

方面 条件 都 很好 住 进去 时 没有 明 面 窗户 屋子里 比较 潮 后来 除湿 器
位置 特别 好 出入 方便 酒店 前台 门童 服务 特别 好
步行街 路口 位置 不错 酒店 服务 挺 好
酒店 方面 非常 不错 健身房 实在 短板 太 影响 整体 形象
酒店 位置 很好 中山路 步行街 口 停车场 出行 很方便
早餐 品种 丰富 工作人员 很 热情 海景房 观赏 鼓浪屿 夜景 相当 不错
早点 丰富 出行 方便

选择词性过滤方法效果:

方面 条件 都 就是 住 进去 时 没有 明 面 窗户 屋子里 比较 潮 除湿 器
位置 特别 出入 方便 酒店 前台 门童 服务 特别 好
就 步行街 位置 不错 酒店 服务 也 挺好
酒店 方面 非常 不错 健身房 实在 是 短板 太 影响 整体 形象
酒店 位置 中山路 步行街 有 停车场 出行
早餐 品种 丰富 工作人员 热情 海景房 能 观赏 鼓浪屿 夜景 相当 不错
早点 丰富 出行 方便

就此结束!^o^y

参考文章

NLP-中文文本去除标点符号

  • 34
    点赞
  • 206
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: Python自然语言处理是指使用Python语言来处理自然语言数据,而NLTK就是Python中最常用的自然语言处理工具之一。在深度学习中,自然语言处理技术已经变得越来越重要,它在处理文本数据、自动翻译、语音识别、情感分析和信息提取等方面发挥着重要作用。 在使用NLTK进行自然语言处理的时候,需要掌握一些基本的用法和技巧。下面介绍一些重要的入门教程: 1.安装NLTK库。 首先需要在电脑上安装好Python和NLTK库,可以直接使用 pip install nltk 或者从官网下载进行安装。 2.加载数据集。 使用NLTK库,可以很方便地预处理自然语言文本数据。可以使用nltk.corpus模块的reuters数据集,通过对文章进行预处理和分类,来预测股市趋势。 3.文本预处理。 自然语言文本数据中有许多瑕疵,如标点符号停用词等。使用NLTK库,可以很方便地进行文本清洗,包括去除标点和停用词。 4.分词分词自然语言处理最基本的步骤之一,需要将一段文本切分成单个词汇。可以使用NLTK库的 sent_tokenize()和word_tokenize()方法来实现。 5.词干提取。 同一个单词的不同形态意义相同,需要将它们转化为同一个形式。可以使用NLTK库的 PorterStemmer和LancasterStemmer来处理。 6.词性标注词性标注是将单个单词标注为他们在句子中扮演的角色,如名词、动词、副词等。可以使用NLTK库的pos_tag()方法来实现。 总之,使用NLTK库进行自然语言处理,需要掌握一些基本的用法,包括加载数据集、文本预处理、分词、词干提取和词性标注等。掌握这些基本用法,可以进行更深层次的自然语言处理研究。 ### 回答2: Python自然语言处理NLP)是指使用计算机技术处理和分析人类语言的领域。NLP应用广泛,包括情感分析、语音识别、机器翻译、智能问答等等,是近年来非常热门的领域。Python作为一种非常流行的编程语言,也因其简洁易学的特点成为了NLP工程师们的首选语言之一。而在Python NLP中,NLTK是一个非常著名的库,提供了很多有用的工具和资源,用于处理自然语言数据。以下简要介绍基于Python中的自然语言处理nltk库的用法入门教程。 1. 安装NLTK 在Python环境下,使用pip安装nltk库即可。 2. 下载语料库 使用NLTK,可以轻松下载多个语言的语料库,包括英语、阿拉伯语、西班牙语等等。可以使用如下代码来下载英语语料库: import nltk nltk.download('punkt') 此外,还可以使用其他命令下载更多的资源。 3. 分词 分词NLP中的一个重要任务。NLTK中的word_tokenize方法可以用于将一段文本分成单词。 import nltk text = "This is a sentence." tokens = nltk.word_tokenize(text) print(tokens) 输出内容为 ['This', 'is', 'a', 'sentence', '.'] 4. 词性标注 NLTK还提供了许多方法和资源来进行词性标注。其中,pos_tag方法用于给文本中的每个单词标注词性。标注后的词性可用于后续的文本分析任务中。 import nltk tokens = nltk.word_tokenize("They refuse to permit us to obtain the refuse permit") tagged = nltk.pos_tag(tokens) print(tagged) 输出结果为 [('They', 'PRP'), ('refuse', 'VBP'), ('to', 'TO'), ('permit', 'VB'), ('us', 'PRP'), ('to', 'TO'), ('obtain', 'VB'), ('the', 'DT'), ('refuse', 'NN'), ('permit', 'NN')] 5. 前缀提取 前缀提取是NLP中一种常用的文本处理技术,它将前缀从单词中提取出来,用于相关信息检索。NLTK中的PrefixSpan类可以轻松提取前缀。 import nltk from nltk.corpus import brown from nltk.util import ngrams, pad_sequence from nltk.collocations import PrefixCollocationFinder from nltk.metrics import BigramAssocMeasures text = nltk.Text(brown.words()) prefix_finder = PrefixCollocationFinder(text.tokens, prefix_length=2) top_prefixes = prefix_finder.nbest(BigramAssocMeasures().raw_freq, 10) print(top_prefixes) 输出结果为 [('in', 'the'), ('on', 'the'), ('to', 'the'), ('of', 'the'), ('as', 'a'), ('that', 'the'), ('with', 'the'), ('for', 'the'), ('to', 'be'), ('at', 'the')] 以上就是NLP入门教程中nltk库的使用方法。NLTK为我们提供了丰富的工具和资源,非常方便和高效地处理自然语言数据。希望通过这篇文章的介绍,大家能够轻松入门Python NLP领域。 ### 回答3: Python是一种广泛使用的编程语言,可以在自然语言处理(NLP)领域中发挥巨大作用。NLTK (Natural Language Toolkit),是Python下常用的一种自然语言处理库,它提供了很多基本NLP工具和数据集,可以帮助开发人员快速构建自己的NLP应用。 安装nltk库: 在前置知识中您已经了解到了如何安装Python和pip,安装nltk库其实也非常容易,只需在控制台中输入以下命令即可。 pip install nltk 首先,我们需要安装nltk库。在你的监视器上,输入 "import nltk" 以运行库。如果没有问题弹出,那么nltk库就被成功安装。 现在可以导入所有nltk库中的所有元素,并将它们用于文本解析和分析。不过,值得一提的是,nltk不仅仅只包括算法,它还支持不同语言的语料库和辅助工具。这篇简单教程将介绍NLTK几个当前常用的功能。 第一步,我们先加载语料库: nltk.download() 执行上述代码后,会弹出一个下载窗口,在窗口中下载所有需要的子模蜜蜂和相关语料库即可。 第二步,我们使用语料库: 导入预处理的语料库: from nltk.corpus import genesis text = genesis.raw() print(text[:1000]) 在第二行中,我们加载了名为“创世纪”的语料库。这个语料库包含英语版本的《圣经》,并准备好读取。现在,在第四行中,我们将文本内容存储在名为“text”的新变量中,并在下一行中使用print()函数将前1000个字符输出到屏幕上。 接下来,我们使用正则表达式来分离出所有单词,并将其存储在新的字符串列表words中: from nltk.tokenize import word_tokenize sents = genesis.sents() words = [word_tokenize(sent) for sent in sents] words = [word for sublist in words for word in sublist] print(words[:20]) 此时我们使用nltk.tokenize库中的函数word_tokenize来把我们之前的text转化为单词,并分离到sents列表中。 然后使用列表推导式,将sents中的所有字符串合并,并将其存储在名为“words”的新列表中。我们可以使用相同的print()函数来显示前20个单词。 接下来,我们使用NLTK的詞频計算功能来了解在几乎所有课本中都将演示的語料庫分布: from nltk.probability import FreqDist fdist = FreqDist(words) print(fdist) 最后,我们将自己的当前NLTK库安装到“C:\Python36\Lib\site-packages\nltk_data”目录中,以确保以后不需要重新下载所有语料库。 为此,我们将使用以下代码: import nltk.data nltk.data.path.append("C:\Python36\Lib\site-packages\nltk_data") 我们希望本教程能够帮助您进入自然语言处理(NLP)领域,并掌握入门级的NLTK库的使用。当然,还有很多更多完整的NLP功能等待您去发掘。总之,希望您可以进一步学习NLP,并创造出更加智能的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值