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

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

作者: 青椒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