python自然语言处理-读书笔记5

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zlp_zky/article/details/83027026
#使用UniCode进行文字处理
#Unicode支持超过一百万种字符。每个字符分配一个编号,称为编码点。在 Python中, 编码点写作\uXXXX 的形式,其中 XXXX是四位十六进制形式数。

#从文件中提取已编码文本
import codecs
path = nltk.data.find('corpora/unicode_samples/polish-lat2.txt')
f = codecs.open(path, encoding='latin2') #我们可以使用f = codecs.open(path, 'w', encoding='utf -8')写入 Unicode 编码数据到一个文件。
for line in f:
    line = line.strip()
    print(line.encode('unicode_escape'))

import re #在python中使用正则表达式,需要使用re函数库,还需要用于搜索的词汇链表
wordlist=[w for w in nltk.corpus.words.words('en') if w.islower()]
print([w for w in wordlist if re.search('ed$', w)])#使用正则表达式«ed$»查找以ed 结尾的词汇。re.search(p, s)检查字符 串s 中是否有模式 p
print([w for w in wordlist if re.search('^..j..t..$', w)])#通配符“.”匹配任何单个字符。假设我们有一个8 个字母组成的词的字谜室,j 是其第 三个字母,t 是其第六个字母。空白单元格中的每个地方,我们用一个句点
#插入符号“^”匹配字符串的开始,就像“$”符号匹配字符串的 结尾
#最后,符号“?”表示前面的字符是可选的。因此«^e-?mail $»将匹配 email 和 e-mai l。我们可以使用sum(1 for w in text if re.search('^e-? mail$', w))计数一个文本 中这个词(任一拼写形式)出现的总次数。
print( [w for w in wordlist if re.search('^[ghi][mno][jlk][def]$', w)])#两个或两个以上的词汇以相同的击键顺序 输入,这叫做输入法联想提示。例如:hole 和golf 都是通过输入序列4653。

chat_words = sorted(set(w for w in nltk.corpus.nps_chat.words()))
print([w for w in chat_words if re.search('^m+i+n+e+$', w)])
print([w for w in chat_words if re.search('^[ha]+$', w)])#“+”表示的是“前面的项目的一个或多个实例,现在让我们用“*”替换“+”,它表示 “前面的项目的零个或多个实例。
#:«[^aei ouAEIOU]»匹配除元音字母之外的所有字母。

 

#提取字符块
# word = 'supercalifragilisticexpialidocious'#re.findall() (“find all”即找到所有)方法找出所有(无重叠的)匹配指定正则表 达式的 字符 串加一个前缀“r”来表明它是一个原始字符串
# print(re.findall(r'[aeiou]', word))
#
# wsj = sorted(set(nltk.corpus.treebank.words()))
# fd = nltk.FreqDist(vs for word in wsj for vs in re.findall(r'[aeiou]{2,}', word))#文本中的两个或两个以上的元音序列,并确定它们的相对频率
# print(fd.items())

# regexp = r'^[AEIOUaeiou]+|[AEIOUaeiou]+$|[^AEIOUaeiou]'#正则表达式匹配词首元音序列,词尾元音序列和所有的辅音;其它的被忽 略。这三个阶段从左到右处理,如果词匹配了三个部分之一,正则表达式后面的部分将被忽 略。
# def compress(word):
#     pieces = re.findall(regexp, word)
#     return ''.join(pieces)
# english_udhr = nltk.corpus.udhr.words('English-Latin1')
# print(nltk.tokenwrap(compress(w) for w in english_udhr[:75]))
#
# rotokas_words = nltk.corpus.toolbox.words('rotokas.dic')#将从罗托卡特语 词汇中提取所有辅音-元音序列,如ka 和 si。因为每部分都是成对的,它可以被用来初始化 一个条件频率分布。然后我们为每对的频率列表。
# cvs = [cv for w in rotokas_words for cv in re.findall(r'[ptksvr][aeiou]', w)]
# cfd = nltk.ConditionalFreqDist(cvs)
# cfd.tabulate()
#
# cv_word_pairs = [(cv, w) for w in rotokas_words for cv in re.findall(r'[ptksvr][aeiou]', w)]#检查表格中数字背后的词汇,有一个索引允许我们迅速找到包含一个给定 的辅音-元音对的单词的列表将会有帮助。例如:cv_index['su']应该给我们所有含有“su” 的词汇
# cv_index = nltk.Index(cv_word_pairs)
# print(cv_index['su'],cv_index['po'] )

#查找词干
# def stem(word):
#     for suffix in ['ing', 'ly', 'ed', 'ious', 'ies', 'ive', 'es', 's', 'ment']:
#         if word.endswith(suffix):
#             return word[:-len(suffix)]
#     return word
# print(re.findall(r'^.*(ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processing'))
# print(re.findall(r'^.*(?:ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processing'))
# print(re.findall(r'^(.*)(ing|ly|ed|ious|ies|ive|es|s|ment)$', 'processing'))
# print(re.findall(r'^(.*?)(ing|ly|ed|ious|ies|ive|es|s|ment)?$', 'language'))

# def stem(word):
#     regexp = r'^(.*?)(ing|ly|ed|ious|ies|ive|es|s|ment)?$'
#     stem, suffix = re.findall(regexp, word)[0]
#     return stem
# 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)
# print([stem(t) for t in tokens])

#搜索已分词文本
# from nltk.corpus import gutenberg, nps_chat
# moby = nltk.Text(gutenberg.words('melville-moby_dick.txt'))
# chat = nltk.Text(nps_chat.words())
# print(moby.findall(r"<a> (<.*>) <man>"))
# print( chat.findall(r"<.*> <.*> <bro>"))
# print( chat.findall(r"<l.*>{3,}"))
# from nltk.corpus import brown
# hobbies_learned = nltk.Text(brown.words(categories=['hobbies', 'learned']))
# print(hobbies_learned.findall(r"<\w*> <and> <other> <\w*s>"))


#规范化文本
# 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 中包括了一些现成的词干提取器,如果你需要一个词干提取器,你应该优先使用 它们中的一个,而不是使用正则表达式制作自己的词干提取器,因为NLTK 中的词干提取 器能处理的不规则的情况很广泛。Porter 和Lancaster 词干提取器按照它们自己的规则剥离 词缀。
# porter = nltk.PorterStemmer()
# lancaster = nltk.LancasterStemmer()
# print([porter.stem(t) for t in tokens])
# print([lancaster.stem(t) for t in tokens])
#
# #词形归并
# #WordNet词形归并器删除词缀产生的词都是在它的字典中的词。
# wnl = nltk.WordNetLemmatizer()
# print([wnl.lemmatize(t) for t in tokens])

#用正则表达式为文本分词
#raw = """'When I'M a Duchess,' she said to herself, (not in a very hopeful tone ... though), 'I won't have any pepper in my kitchen AT ALL. Soup does very  well without--Maybe it's always pepper that makes people hot-tempered,'"""
# print(re.split(r' ', raw))
# print(re.split(r'[ \t\n]+', raw))#正则表达式«[ \t\n]+»匹配一个或多个空格、制表符(\t)或换行符(\n)。其他空白 字符,如回车和换页符,确实应该包含的太多。于是,我们将使用一个 re 库内置的缩写“\ s”,它表示匹配所有空白字符。前面的例子中第二条语句可以改写为re.split(r'\s+', raw)。
# print(re.split(r'\s+', raw))
# print(re.split(r'\W+', raw))
# print(re.findall(r'\w+|\S\w*', raw))#正则表达式«\w+|\S\w*»将首先尝试匹配词中字符的所有序列。如果没有找到匹配 的,它会尝试匹配后面跟着词中字符的任何非空白字符(“\S”是“\s”的补)。这意味着标点会与跟在后面的字母(如's)在一起,但两个或两个以上的标点字符序列会被分割。
# print (re.findall(r"\w+(?:[-']\w+)*|'|[-.(]+|\S\w*", raw))

#NLTK的正则表达式分词器
# text = 'That U.S.A. poster-print costs $12.40...'
# pattern = r''''(?x) ([A-Z]\.)+| \w+(-\w+)*| \$?\d+(\.\d+)?%?| \.\.\.| [][.,;"'?():-_`]'''
# print(nltk.regexp_tokenize(text, pattern))
# print(nltk.corpus.treebank.words())

#分割-断句 NLTK 通过包含Punkt句子分割器(Kiss & Strunk, 2006)简化了这些。这里是使用 它为一篇小说文本断句的例子
# print(len(nltk.corpus.brown.words()) / len(nltk.corpus.brown.sents()))
#
# sent_tokenizer=nltk.data.load('tokenizers/punkt/english.pickle')
# text = nltk.corpus.gutenberg.raw('chesterton-thursday.txt')
# sents = sent_tokenizer.tokenize(text)
# pprint.pprint(sents[171:181])
#将结果写入文件
# output_file = open('output.txt', 'w')
# words = set(nltk.corpus.genesis.words('english-kjv.txt'))
# for word in sorted(words):
#     output_file.write(word + "\n")
# output_file.write(str(len(words)) + "\n")
# output_file.close()

猜你喜欢

转载自blog.csdn.net/zlp_zky/article/details/83027026
今日推荐