Python自然语言处理—提取词干

Python-自然语言处理 专栏收录该内容
11 篇文章 1 订阅

一 提取词干

在英文中同一个词的形式是有多种的,名词的单数复数、动词的现在和过去式等等,所以在处理英文时要考虑词干的抽取问题。这里直接调用Nltk自带的两个词干抽取器

import re
import nltk

raw = """DENNIS: Listen, strange women lying in ponds distributing swords 
is no basis for a system of government. Supreme executive power derives from 
a mandate from the masses, not from some farcical aquatic ceremony."""

tokens = nltk.word_tokenize(raw)  # 分词 如果该方法调用错误请运行 nltk.download('punkt') 

porter = nltk.PorterStemmer()
print([porter.stem(t) for t in tokens])
lancaster = nltk.LancasterStemmer()
print([lancaster.stem(t) for t in tokens])

结果如下

porter:['denni', ':', 'listen', ',', 'strang', 'women', 'lie', 'in', 'pond', 'distribut', 'sword', 'is', 'no', 'basi', 'for', 'a', 'system', 'of', 'govern', '.', 'suprem', 'execut', 'power', 'deriv', 'from', 'a', 'mandat', 'from', 'the', 'mass', ',', 'not', 'from', 'some', 'farcic', 'aquat', 'ceremoni', '.']
lancaster:['den', ':', 'list', ',', 'strange', 'wom', 'lying', 'in', 'pond', 'distribut', 'sword', 'is', 'no', 'bas', 'for', 'a', 'system', 'of', 'govern', '.', 'suprem', 'execut', 'pow', 'der', 'from', 'a', 'mand', 'from', 'the', 'mass', ',', 'not', 'from', 'som', 'farc', 'aqu', 'ceremony', '.']

中文没有词干抽取的烦恼,中文应该关注于分词的结果(分词后面介绍,jieba,Hanlp等等各种各样的分词方法调用)

二 利用词干提取器,索引文章

当然你也可以直接用单词索引文章,但是用完词干提取器后索引的效果就更好了。

class IndexedText(object):  # 首先定义了一个类
        #初始化参数 stemmer是提取词干的方法,text待处理文本,self的作用大家可以直接忽视但是必不可少
      def __init__(self, stemmer, text):

          self._text = text  # 将文本赋予变量self._text

          self._stemmer = stemmer  # 将提取词干的防范赋予self._stemmer

          self._index = nltk.Index((self._stem(word), i)  # 循环读取文本中的词,最后生成{词干1:(index1,index2,..)}的样式

                             for (i, word) in enumerate(text))
          
          # 找出带处理词所处的index,然后提取index上下40个长度内的词
      def concordance(self, word, width=40):

          key = self._stem(word)  # 提取待处理词的词干

          wc = width//4  # 获取大概需要提取词的个数

          for i in self._index[key]:  # 循环开始获取上下文

              lcontext = ' '.join(self._text[i-wc:i])

              rcontext = ' '.join(self._text[i:i+wc])

              ldisplay = '%*s' % (width, lcontext[-width:])  # %*s右对齐,让打印出的长度是width

              rdisplay = '%-*s' % (width, rcontext[:width])  # %-*s左对齐,让打印出的长度是width

              print (ldisplay, rdisplay, '/n')

      def _stem(self, word):  # 词干提取并全部改为小写
          
          return self._stemmer.stem(word).lower()

porter = nltk.PorterStemmer()  # 定义词干提取的方法

grail = nltk.corpus.webtext.words('grail.txt')  # 获取待处理的文本

text = IndexedText(porter, grail)  # 实例化刚刚定义的类,同时将两个参数传入

text.concordance('lying')  # 调用类中的找上下文的方法

结果如下,我的IDE是Spyder,为了让打印的结果更清晰,我在print()中加入了‘/n’让每一次打印后都换行。

  • 0
    点赞
  • 0
    评论
  • 13
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

午匀需

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值