- 本文来自《基于Python的语料库处理》_雷蕾著。
7.1 分句和分词
7.1.1 分句
- 分句(sentence splitting)就是将字符串按自然句子的形式进行切分。假设我们有如下代码的一个字符串,该字符串包含两个句子。如果我们对该字符串进行分句处理,就是将该字符串切分成两个元素(分别为一个句子)构成的列表。NLTK库提供了专门的分句处理模块。使用NLTK库前必须首先引入NLTK库。请看下面的代码:
import nltk
string = "My father's name being Pririp,and my Christian name Philip,my infant tongue could make of both names nothing longer or more explicit than Pip. So,I called myself Pip,and came to be called Pip."
# 载入和定义分词器(sentence splitter) sent_tokenizer
sent_tokenizer = nltk.load('tokenizers/punkt/english.pickle')
# 利用分词器中的sent_tokenizer.tokenize()函数来分句
sents = sent_tokenizer.tokenize(string)
sents
["My father's family name being Pirrip, and my Christian name Philip, my infant tongue could make of both names nothing longer or more explicit than Pip.", 'So, I called myself Pip, and came to be called Pip.']
7.1.2 分词
- 我们在前面几章作词表的时候,通过将句子中所有标点符号替换成空格、基于空格将句子切分单词的过程,就是分词(word tokenization)的过程。简单地说,分词就是抽取出句子中的单词,或者说,分词就是将句子转换成一组单词的过程。NLTK库也提供了分词的模块。请看下面的代码示例。
#%%
import nltk
string = "My father's name being Pririp,and my Christian name Philip,my infant tongue could make of both names nothing longer or more explicit than Pip. So,I called myself Pip,and came to be called Pip."
# 载入和定义分词器(sentence splitter) sent_tokenizer
string_tokenized = nltk.word_tokenize(string)
string_tokenized
- 上面代码中的string是Great Expectations正文的第一段。打印结果如下:
['My',
'father',
"'s",
'name',
'being',
'Pririp',
',',
'and',
'my',
'Christian',
'name',
'Philip',
',',
'my',
'infant',
'tongue',
'could',
'make',
'of',
'both',
'names',
'nothing',
'longer',
'or',
'more',
'explicit',
'than',
'Pip',
'.',
'So',
',',
'I',
'called',
'myself',
'Pip',
',',
'and',
'came',
'to',
'be',
'called',
'Pip',
'.']
- 从上面的打印结果可见,nltk.word_tokenize()函数将分词后的结果保存为一个列表,列表的每个元素为原字符串中的单词和标点符号。
7.1.3 制作词表
- 我们可以将上述分句和分词的方法,使用nltk.word_tokenize()函数先进行分句和分词处理。另外,我们将词频表按词频由大到小排序。请看下面的代码。
(1)分句处理
import nltk
file_in = open(r"D:\works\文本分析\leopythonbookdata-master\texts\ge.txt",'r')
file_out = open("D:\works\文本分析\ge_worldlist4.txt","a")
# 下面对文本进行分词处理
# 结果存储到all_sentences列表中
all_sentences = []
sent_tokenizer = nltk.load('tokenizers/punkt/english.pickle')
for line in file_in.readlines():
sents = sent_tokenizer.tokenize(line) #笔者在实际操作中发现,这个函数可以自动过滤掉空行
for sent in sents:
all_sentences.append(sent) #结合上一条注释,all_sentences列表中没有空行
- 实际上,sent_tokenizer.tokenize是将英文“.”切分的,如果便利的一行中存在“.”,那就进行切分。如果这一行中没有“.”号,那就把这一行作为一个被切分的句子。
(2)分词处理
# 下面对分词后列表中的字符串进行分词处理
# 结果存储到all_words 列表中
all_words = []
for sent in all_sentences:
sent_tokenized = nltk.word_tokenize(sent)
for word in sent_tokenized:
all_words.append(word.lower()) #word.lower是将所有单词都用小写模式
(3)词频统计
# 下面对分词后列表中的字符串进行词频统计
# 结果存储在wordlist_freq字典中
wordlist_freq = {}
for word in all_words:
'''
下面的if——else语句的功能是:判断这个word是否在字典中,如果word已经是字典的一个key值,那么
就将这个key值对应的values值增加1;如果word不是字典的一个key值,那么就将这个word作为新的
一个key值,并将对应的values赋值为1
'''
if word in wordlist_freq.keys():
wordlist_freq[word] += 1
else:
wordlist_freq[word] = 1
- 第10行中的wordlist_freq.keys()得到的是一个dict_keys类型,如果想将其变成可迭代的list类型,可以使用list(wordlist_freq.keys())方法。
对词频字典按词频逆序排序
# 下面对词频字典按词频逆序排序
# 结果储存到pairs_reversed列表中
pairs_reversed = []
for p in wordlist_freq.items():
pairs_reversed.append([p[1],p[0]])
pairs_reversed_sorted = sorted(pairs_reversed,reverse=True)
# 将逆序词频表写入到file_out中
for p in pairs_reversed_sorted:
file_out.write(p[1] + '\t' + str(p[0]) + '\n') #对于逆序表中的每一个列表,p[1]是字符串,p[0]是数字
file_in.close()
file_out.close()
- 结果如下图(局部):