语法树是句子结构的图形表示,它代表了句子的推导结果,有利于理解句子语法结构的层次。简单说,语法树就是按照某一规则进行推导时所形成的树。

有了语法树,我们就可以根据其规则自动生成语句,但是语法树本身是死的,在日常生活中我们会有很多并不符合语法树的情况,比如:

我们转换一种思想,我不在意一句话对与不对,而是判断这句话出现概率的高低,如果一句话出现的最终概率越接近1,那么说明它越容易出现,反之亦然。这里我们就需要语言模型:N-gram,该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。

我们可以看出其实1-gram模型就是个词汇单独出现的概率累乘,与我们的初衷不符合,相反N值越大,其实模型应该越好,不过由于计算量的缘故,实际中我们常用的是2-gram(Bi-Gram)与3-gram(Tri-Gram),当N>=4时,实在是太慢了。

2-gram:需要统计句子中词汇与前一词汇同时出现的次数,最后累乘

3-gram:需要统计句子中词汇与前两词汇同时出现的次数,最后累乘

 BaseDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

 file_path = f"{BaseDir}/day1/data/article_9k.txt"
with open(file_path, 'r', encoding='utf-8') as f:
FILE = f.read() def cut(string):
return list(jieba.cut(string)) TOKENS = cut(FILE[:1000000])
words_count = Counter(TOKENS)
_2_gram_words = [
TOKENS[i] + TOKENS[i+1] for i in range(len(TOKENS)-1)
]
_2_gram_word_counts = Counter(_2_gram_words) def get_gram_count(word, wc):
"""
获取字符串在总字符表中的次数
:param word: 需要查询的字符串
:param wc: 总字符表
:return: 该字符串出现的次数,如没有则定为出现最少次数字符串的次数
"""
return wc[word] if word in wc else wc.most_common()[-1][-1] def two_gram_model(sentence):
"""
分别计算句子中该单词在总字符表中出现的次数
该单词跟后一单词在二连总字符表中出现的次数
做比后的连续乘积
:param sentence: 需要验证的句子
:return:
"""
tokens = cut(sentence) probability = 1 for i in range(len(tokens)-1):
word = tokens[i]
next_word = tokens[i+1] _two_gram_c = get_gram_count(word + next_word, _2_gram_word_counts)
_one_gram_c = get_gram_count(next_word, words_count)
pro = _two_gram_c / _one_gram_c probability *= pro return probability r = two_gram_model("这个花特别好看")
print(r)
r = two_gram_model("花这个特别好看")
print(r)
r = two_gram_model("自然语言处理")
print(r)
r = two_gram_model("处语言理自然")
print(r)
r = two_gram_model("前天早上")
print(r)
 1.7475796022508822e-05
9.342406678699686e-07
0.030927835051546393
0.00018491124260355032
0.02857142857142857

从得出的结果我们就可以判断出这个句子出现的概率是多少了,当然N-gram模型的结果是受原始词袋影响的。

最新文章

  1. GitHub Desktop+码云(GIT.oschina)使用方法
  2. MS SQLServer 批量附加数据库 分类: SQL Server 数据库 2015-07-13 11:12 30人阅读 评论(0) 收藏
  3. error MSB6006: “CL.exe”已退出,代码为X —— 的解决办法
  4. x-requested-with 请求头 区分ajax请求还是普通请求(转)
  5. Android -- java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
  6. [wikioi2144]砝码称重2(另类的dfs)
  7. Spring的meta标签
  8. zabbix agent 类型自带的key
  9. maven下载的jar文件出现invalid LOC header (bad signature)
  10. C语言:指针的几种形式二
  11. ANDROID_MARS学习笔记_S01_012_SeekBar
  12. Gson把json串转换成java实体对象
  13. 10491 - Cows and Cars
  14. Java socket通信
  15. Java工程师:四个月小白变大咖,你能做到吗?
  16. (6)UIView常见属性二
  17. ngRx 官方示例分析 - 2. Action 管理
  18. XML系列之--Linq操作带属性的XML(四)
  19. python开发之路-LuffyCity
  20. LeetCode算法题-Minimum Absolute Difference in BST(Java实现)

热门文章

  1. 关于Vmvare虚拟机中Linux系统不能全屏的问题
  2. UML部署图介绍
  3. Canal——Canal-Adapter源码在IDEA部署运行
  4. pycharm重命名文件
  5. preg_replace修饰符e的用法
  6. mysql新建数据库(database)设置为utf8
  7. Robot:robot如何连接Oracle数据库(windows+linux)
  8. 《Fluid Engine Development》 学习笔记4-预测校正不可压缩SPH-PCISPH
  9. 基于Spring Boot的可直接运行的分布式ID生成器的实现以及SnowFlake算法详解
  10. Dapper连接MySql数据库