正则表达式的相关应用

时间:2022-11-11 15:11:02

1.通过re.findall()方法找出所有匹配的指定的正则表达式。例如:找出以下示例词中的所有元音,并计数。

[python]  view plain  copy
  1. >>> word='supercalifragilisticexpialidocious'  
  2. >>> re.findall(r'[aeiou]',word)  
  3. ['u''e''a''i''a''i''i''i''e''i''a''i''o''i''o''u']  
  4. >>> len(re.findall(r'[aeiou]',word))  
  5. 16  
  6. >>>   

2.查找文本中两个或两个以上的元音序列,并确定他们的相对频率。

[python]  view plain  copy
  1. wsj=sorted(set(nltk.corpus.treebank.words()))  
  2. ... fd= nltk.FreqDist(vs for word in wsj for vs in re.findall(r'[aeiou]{2,}',word))  
  3. >>> fid.items()  

3.将正则表达式与条件频率分布结合起来。例子中,从罗托卡特语词汇中提取所有的辅音-元音序列,如ka和si,因为其都是成对出现的,所以可以用频率分布表来表示。

[python]  view plain  copy
  1. >>> rotokas_words=nltk.corpus.toolbox.words('rotokas.dic')  
  2. >>> cvs=[cv for w in rotokas_words for cv in re.findall(r'[ptksvr][aeiou]',w)]  
  3. >>> cfd=nltk.conditionalFreqDist(cvs)  
  4. >>> cfd.tabulate()  

4.查找词干

apples和apple对比中,apple就是词干。写一个简单脚本来查询词干。

[python]  view plain  copy
  1. def stem(word):  
  2.     for suffix in ['ing','ly','ed','ious','ies','ive','es','s','ment']:  
  3.         if word.endswith(suffix):  
  4.             return word[:-len(suffix)]  
  5.     return None  

而如果利用正则表达式,此问题将会变得很简单

[python]  view plain  copy
  1. re.findall(r'^(.*?)(ing|ly|ed|ious|ies|ive|es|s|ment)$',word)  

5.词干提取器和归并器

nltk提供了PorterStemmer 和 LancasterStemmer两个词干提取器,Porter比较好,可以处理lying这样的单词。

[python]  view plain  copy
  1. porter = nltk.PorterStemmer()  
  2. print(porter.stem('lying'))  

如果需要处理像women这样的词,需要词性归并器:WordNetLemmatizer

[python]  view plain  copy
  1. wnl = nltk.WordNetLemmatizer()  
  2. print(wnl.lemmatize('women'))  

6.利用词干提取器实现索引文本(concordance)

利用到nltk.Index这个函数,nltk.Index((word , i) for (i,word) in enumerate(['a','b','a']))

[python]  view plain  copy
  1. class IndexText:  
  2.     def __init__(self,stemmer,text):  
  3.         self._text = text  
  4.         self._stemmer = stemmer  
  5.         self._index = nltk.Index((self._stem(word),i) for (i,word) in enumerate(text))  
  6.     def _stem(self,word):  
  7.         return self._stemmer.stem(word).lower()  
  8.     def concordance(self,word,width =40):  
  9.         key = self._stem(word)  
  10.         wc = width/4 #words of context  
  11.         for i in self._index[key]:  
  12.             lcontext = ' '.join(self._text[int(i-wc):int(i)])  
  13.             rcontext = ' '.join(self._text[int(i):int(i+wc)])  
  14.             ldisplay = '%*s' % (width,lcontext[-width:])  
  15.             rdisplay = '%-*s' % (width,rcontext[:width])  
  16.             print(ldisplay,rdisplay)  
  17. porter = nltk.PorterStemmer()  
  18. grail = nltk.corpus.webtext.words('grail.txt')  
  19. text = IndexText(porter,grail)  
  20. text.concordance('lie')