美文网首页
使用正则表达式检测词组搭配

使用正则表达式检测词组搭配

作者: 青椒rose炒饭 | 来源:发表于2019-06-30 11:49 被阅读0次

使用endswith()以及startswith()可以匹配出以指定字母开头和结束的单词.这两个都是字符串对象的方法.
下面的程序包含两个正则表达式,可以先试着写一下再看看我写的,正则表达式比较灵活,只要能够实现功能都是正确的.
    1匹配所有以b结尾的单词
    2匹配长度位5或者6,不包含元音字母的单词

import re
import nltk
wordlist = [w.lower() for w in nltk.corpus.words.words('en')]
print("单词数:",len(wordlist))

#使用正则表达式匹配
#需要使用re模块,匹配模式re.serch(r'正则表达式',文本)
'''
    一些正则表达式:
        ed$--------匹配以ed结果的单词,$表示匹配结尾
        ^..j..t..$-------匹配第3个字母是j第6个字母是t,长度只有8位的单词
                ^表示匹配开始, $表示匹配结束 , .通配符只能匹配一位
        +     至少匹配一次
        -     1-9  1到9之间的数字
        *     0次或者多次
        ^     当出现在方括号内第一个位置时表示出了方括号内的都匹配
        ?     前面的内容可以选择匹配
        \     转义字符
        ()    分组
        { }   指定匹配次数
        |     匹配前面或者匹配后面

'''
end_b = [w for w in wordlist if w.endswith('b')]
print("以字母b结尾的单词:",end_b)
#使用正则表达式找出不包含元音字母,长度位5或者6的单词
words = [w for w in wordlist if re.search(r'^[^aeiou]([^aeiou]){5,6}$',w)]
print("满足条件的单词:",words)

正则表达式的有益应用

re.findall(regular,text):无重叠找出其中满足条件的内容,返回值位一个列表,将列表转换位字符串" ".join(list)

import nltk
import re
#路透社语料库的单词
rotokas_words = nltk.corpus.toolbox.words('rotokas.dic')
print("路透社语料库所有单词",rotokas_words)
#找出其中辅音字母和元音字母的组合
#这个表达式我尝试过貌似只有这种写法,其他的固然能够获取字母组合,但是不能用于产生条件频率分布cfd
cvs = [cv for word in set(rotokas_words) for cv in re.findall(r'[ptksvr][aeiou]', word) ]
cfd = nltk.ConditionalFreqDist(cvs)
cfd.tabulate()

#使用nltk的索引模块,以实现查看满足字母组合的单词
#生成器里时形如('ro', 'kaakaaro') 的组合,使用的时候可以看作是字典吧
cv_word = ((cv,word) for word in rotokas_words for cv in re.findall(r'[ptksvr][aeiou]',word))
cv_index = nltk.Index(cv_word)
#输出包含ki的单词
print(cv_index['ki'])

查找词干

很多单词后面都会有后缀,一般后缀是表明词性的,如ed,ing,tion.ation,sion,ly....等.在进行处理的时候需要我们去除单词的后缀.

import nltk
import re

english_words = nltk.corpus.words.words('en')
#输出100个单词查看
print("100个原始单词:",english_words[0:99])
#获取所有有后缀的单词
word_with_suffix = [word for word in english_words if re.findall(r'(ing|ly|ed|ious|ies|ive|ment)$',word)]
#集合去除重复的单词
word_with_suffix = set(word_with_suffix)
print("拥有后缀的单词:",word_with_suffix)

#定义去除后缀的类
class SteamExtraction:
    suffix = ['ing', 'ly', 'ed', 'ious', 'ies', 'ive', 'es', 's', 'ment']
    #正则表达式以字母一次或者多次开头,以后缀结尾
    reg1 = r'^(\w+)(ing|ly|ed|ious|ies|ive|es|s|ment)$'
    def method1(self,wordList):
        new_wordList = []
        for word in wordList:
            #设置一个标志位,以判断单词时候已经加入列表,如果是用 not in判断效率很低
            flag = 0
            #判断是否以后缀列表中的后缀结尾
            for tail in self.suffix:
                if word.endswith(tail):
                    new_wordList.append(word[:-len(tail)])#切片
                    flag = 1
            if(flag == 0):
                new_wordList.append(word)
                #返回去除后缀之后的单词表
        return new_wordList

    def method2(self,wordList):
        new_wordList = []
        for word in wordList:
            #这个方法的关键在于正则表达式是切片的,能将单词和后缀分开
            reg_obj = re.match(self.reg1,word)
            if reg_obj:
                #0是整个单词,1是词干  2是后缀
                new_wordList.append(reg_obj.group(1))
            else:
                new_wordList.append(word)
        return new_wordList

stemExtract = SteamExtraction()
#使用出后缀类对象stemExtract的方法1去除后缀
after_devide_suffix = stemExtract.method1(word_with_suffix)
#输出前100个去除后缀的单词
print(after_devide_suffix[0:99])

#使用出后缀类对象stemExtract的方法2去除后缀
after_devide_suffix = stemExtract.method2(word_with_suffix)
#输出前100个去除后缀的单词
print(after_devide_suffix[0:99])

搜索词组搭配

这个正则表达式有毒吧,感觉我理解的也还行,在程序弹出的界面中就是匹配不到内容,特别是$.

import nltk
import re
from nltk.corpus import gutenberg

#使用nltk.Text构建文本在新文本之上只用正则表达式
nltk_text = nltk.Text(gutenberg.words('austen-emma.txt'))
print("nltk.Text",nltk_text)
#下面的正则表达式<>后面的空格会被主动忽略,其他的和re模块的正则表达式一样
#匹配文章中的 a *** woman (***可以是任意单词)
target = nltk_text.findall("<a>  <.*> <woman>")
print(target)

print("--------------------------")
#nltk.re_show(p,s)
#能标出s中满足正则表达式p的内容,
target = nltk.re_show(r'\d+',"kmust university builded in 1954")
print(target)

#下面的代码是一个正则表达式的练习图形界面,可以直接在上面写正则表达式
nltk.app.nemo()

hobbies_learned.findall(r"<\w> <and> <other> <\ws>") 查找文本中的 x and onther y的形式, x是y的一个实例以此来进行分类.
park and other landmarks(公园或者是其他的地标)
as x as y ,x和y是同一类别
一个比较神奇的是下面的语句居然自带控制台输出

import nltk
from nltk.corpus import brown
words = brown.words(categories=["hobbies","learned"])
nltk_text = nltk.Text(words)
target = nltk_text.findall(r'<\w+> <and> <other> <\w+>')

print("-----------------------------------------")
target = nltk_text.findall(r'<as> <\w+> <as> <\w+>')

相关文章

网友评论

      本文标题:使用正则表达式检测词组搭配

      本文链接:https://www.haomeiwen.com/subject/lpfycctx.html