当前位置:   article > 正文

语料库数据处理个案实例(分词和分句、词频统计、排序)_语料按照句子分行

语料按照句子分行
  • 本文来自《基于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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 打印的结果如下:
["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.']
  • 1

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 上面代码中的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',
 '.']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 从上面的打印结果可见,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列表中没有空行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 实际上,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是将所有单词都用小写模式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
(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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 第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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 结果如下图(局部):
    在这里插入图片描述
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/109741
推荐阅读
相关标签
  

闽ICP备14008679号