使用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+>')
网友评论