NLP之语言处理与Python(1)

1.1语言计算:文本和词汇

NLTK入门
第一步是在python提示符后输入一个特殊的命令,告诉解释器去加载一些我们要用的文本:

from nltk.book import* # 以下所有操作均在此操作下进行

找到文本

print(text1) #这里只能看到该文件的标题
print(text2)
print(text3)
print(text4)
...

搜索文本

#.concordance() 找特定词以及上下文
#搜索text1文本中monstrous出现的情况,包括它的上下文
print(text1.concordance('monstrous')


```python
#.similar()与指定词在上下文中使用相似的其他词(判断该词的特性)
print(text1.similar('monstrous')


```python
#.common_contexts([])研究共用两个或两个以上词汇的上下文,如monstrous和very
print(text2.common_contents(['monstrous','very']))


```python
#.dispersion_plot 判断词在文本中的位置:从文本开头起有多少词出现。可以用离散图表示该位置信息。
print(text4.dispersion_plot(['citizens','democracy','freemdom','duties','Ameriica']))

#.generate()随机生成一些随机文本,每次运行,输出的文本都会不同,但它重复使用了源文件中常见的单词和短语。(但不知道为什么,我这边一直显示的是同一个文本,如果有哪位大神知道原因,请告知我一下,在此谢过。)
print(text3.generate()) #注意,括号里什么也没有

计数词汇

#len()
#计算该文本的长度
print(len(text3))

#查找文本中有多少不同的单词
#首先去重,获得的都是不同的标识符的一个**集合**
res = set(text3)
#其次进行排序,标点在最开始,其次是A开头的词汇,大写单词排在小写单词前面。
print(sorted(res))
#计算去重后的文本单词数,也就说明该本书由这些词组成
print(len(set(text3)))
#那么每个词平均使用的次数
print(len(text3)/len(set(text3)))
#计数一个单词在文本中出现的次数以及占该文本的百分比
print(text3.count('smote'))
print(100*text4.count('a')/len(text4))

#这里提一个小问题,如何将text3中的单词去重,计算每个词的词频
from nltk.book import*

a = set(text3)
b = sorted(a)
for i in b:
    print(i)
    res = text3.count(i)
    print(res)

#函数:重复使用
def lexical_diversity(text):
	return len(text)/len(set(text))

a = lexical_diversity(text3)
print(a)

def percentage(count,total):
	return 100*count/total

a = percentage(4,5)
print(a)

1.2将文本当做词链表

#两个链表相加

#1:
sent1 = ['call','me','ishmeal']
sent2 = ['please','tell','me','your','name']
print(sent1+sent2)

#扩充1
sent1 = ['call','me','ishmeal']
sent2 = ['please','tell','me','your','name']
sent1.extend(sent2)
print(sent1)
sent2.extend(sent1)
print(sent2)

#扩充2
sent1 = ['call','me','ishmeal']
sent2 = ['please','tell','me','your','name']
for item in sent2:
	sent1.append(item)
print(sent1)

#追加

sent1.append('some')
print(sent1)

索引列表
#索引,索引从0开始

a = text4[173] #该位置的单词
b = text4.index('awaken') #该词的索引号
print(a,b)

#切片 (顾头不顾尾)

res = text5[16715:16735]
print(res)

res1 = text5[:3]  #0-2
res2 = text5[3:]  # 3-end

变量
变量 = 表达式
变量必须以字母开头,可以包含数字和下划线。
变量常用来保存计算的中间步骤

vocab = set(text1)
vocal_size = len(vocab)
print(vocab_size)

字符串
一些用来访问链表(列表)元素的方法也可以用在单独的词或字符串上。

neme = 'Monty'
print(name[0])
print(name[:4]

还可以对字符串执行乘法和加法
用词把链表连接起来组成单个字符串,或者把字符串分割成一个链表

res1 = ' '.join(['Monty','Python'])  #''.join()将单个字符串以‘’内的内容分隔相连
print(res1)
res2 = res1.split()
print(res2)

1.3简单的统计

复习上节使用内容

saying = ['After','all','is','said','and','done','more','is','said','than','done']
tokens = set(saying)
tokens = sorted(tokens)
print(tokens[-2:])

在输入后请思考一下,最后的答案与自己思考的是否一致,如若一致,则恭喜你,上一节的内容已经掌握的很好了

频率分布
#FreqDist()函数:获取在文本中每个出现的标识符的频率分布。通常情况下,函数得到的是每个标识符出现的次数与标识符的map映射。

from nltk.book import*
fdist = FreqDist(text1)
vocabulary = list(fdist.keys())
print(vocabulary[:50])      #寻找text1中最常见的50个词

print(fdist['whale']) #'whale'这个单词出现的频率

fdiist.plot(50,cumulative = True) #text1中最常用词的累积频率图
#其中,累积频率,就是按某种标志对数据进行分组后,分布在各组内的数据个数称为频数或次数,各组频数与全部频数之和的比值称为频率或比重。
print(fdist)
print(fdist.hapaxes()) #
查找只出现过一次的词

细粒度的选择词
查看文本中的长词。例如,如果想要找出文本词汇表中长度超过15个字符的词,则把它们称为特性P,则当且仅当词w的长度大于15个字符时P(w)为真。现在a中的数学几何符号表示我们感兴趣的词汇。b的含义是:此集合中所有w都满足:w是集合V(词汇表)的一个元素且w有特性p。 b . [w for w in V if p(w)]

V = set(text1)
long_words = [ w for w in V if len(w) >15 ]
sorted(long_words)
print(long_words)

那么如何特征词呢?我们可以寻找一些出现频率高的长词,这样就忽略了短高频词(如the)和长低频词。

fdist = FreqDist(text5)
print(sorted([ w for w in set(text5) if len(w) > 7  and fdist[w] > 7]) 
#len(w) > 7 长度大于7,fdist[w] > 7 出现次数大于7

词语搭配和双连词
搭配是不经常在一起出现的词序列,其特点是其中的词不能被类似的词置换。要想获取搭配,首先从提取文本词汇中的词对开始(也就是双连词)
#bigrams() 获得词对

print(bigrams(['more','is','said','than','done']))
#会报错,bigrams函数返回了一个“ generator”对象。 这是一种Python数据类型,类似于List,但仅在需要时创建其元素。 如果要将生成器生成列表,则需要将其形式转换为列表。因此,要改写成
print(list(bigrams(['more','is','said','than','done'])))

#collocations()函数,在已知单个词汇频率的基础上,找到出现频率比与预期频率更频繁的双连词。(也就是说找频率高的双连词)

print(text4.collocations())
print(text8.collocations())

计算其他东西
查看文本中词长的分布

print([len(w) for w in text1])
fdist = FreqDist([len(w) for w in text1])
print(fdist)
print(fdist.keys())

不同长度的词的频率是多少呢?

print(fdist.items())  #计算频率
print(fdist.max()) #查找最频繁词
print(fdist[3])   #最频繁词的个数
print(fdist.freq(3)) #最频次占全部词汇的比重

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值