1、语言模型
1)使用规则匹配语言语法(怎么样生成一个合理的句子)
- 1)历史上最原始的语言生成是通过语法规则树,匹配生成对应的句子。比如下面例子
- 1、我们先定义规则,如下我们1)定义手机专卖店服务员的问候语言规则:host,2)消费者问候语言规则:consumer
-
host = """ [host] = 打招呼|,|[自我介绍]|,|主|谓|宾 [自我介绍] = 我是|主|号码|号|人员 号码 = 0|1|2|3|4|5 人员 = 员工|工作人员 打招呼 = 你好|顾客您好|hi|hello|欢迎光临 主 = 我们|我们店|本店|咱店 谓 = 有|包含|出售 宾 = iphone|华为手机|小米|vivo|所有品牌手机|手机|苹果|联想 """ consumer = """ [consumer] = 打招呼|,|主|谓|宾 打招呼 = 你好|hello|喂|那个谁 主 = 我|我们|咱|我朋友|我同学 谓 = 想买|看看|购买 宾 = 手机|iPhone|小米|vivo """
2、通过规则,我们编写代码
-
def genGrama(grama,split_word = "|",split_line = "="): """ 解析语言规则 """ gramas = {} lines = grama.split("\n") for item in lines: items = item.split(split_line) if len(items) <2: continue else: key = items[0].strip("\n").strip() gramas[key] = [] for word in items[1].split(split_word): if word.strip() == "": continue gramas[key].append(word.strip()) return gramas gr = genGrama(host) #print(gr) def checkIsSentence(item): """ #检测是否是句子 """ if len(item) < 2: return False #print(item[0],item[-1]) if item[0] == '[' and item[-1] == ']': return True return False def generate(gra,sentence): """ #生成句子 """ if sentence not in gra.keys(): return sentence sentence_list = [] for item in gra[sentence]: dedup_set.add(item) if item in gra: is_sentence = checkIsSentence(item) if is_sentence == True: sentence_list.append(generate(gra,item)) else: sentence_list.append(generate(gra,random.choice(gra[item]))) else: sentence_list.append(item) return "".join(sentence_list) def generate_n(): """ #生成10个句子 """ # you code here for i in range(10): #name = random.choice(choice_list) sentence_h = generate(genGrama(host),"[host]") sentence_c = generate(genGrama(consumer),"[consumer]") print(sentence_c) print(sentence_h) print("\n") pass generate_n()
3、运行之后我们可以生成下面句子
-
喂,咱看看小米 hi,我是咱店2号工作人员,本店有iphone hello,我同学想买vivo hi,我是本店3号员工,本店有iphone hello,我想买小米 顾客您好,我是咱店2号工作人员,我们有vivo hello,我们想买小米 你好,我是咱店1号员工,我们有联想 hello,我朋友购买小米 hello,我是我们店2号工作人员,本店出售所有品牌手机 hello,我想买vivo 顾客您好,我是本店0号员工,我们出售小米 hello,我同学看看小米 hello,我是本店4号员工,本店有iphone 那个谁,咱想买手机 hello,我是我们2号员工,咱店包含华为手机 hello,我想买手机 你好,我是我们店5号工作人员,咱店包含手机 喂,我同学想买iPhone hi,我是本店1号员工,我们店出售苹果
总结:虽然通过语言规则我们可以简单生成符合语法的句子。但是这个对语言的规则依赖太强,语法太多,规则也很多,当针对某个场景可以适用,也不能校验生成语言的合理性。生活中有千变万化的语言场景,很明显这种方式不能很智能化的解决语言自动生成和识别的问题。
2)概率模型解决语言模型的问题。(怎么样判断一个句子是合理的)
- 1)数据预处理:去掉,。+-*等等无效字符
- 2)jieba分词
- 3)训练数据,计算单词之间的概率向量
- 使用条件概率判断单词生成的概率:
- ????????_?????(??????)=???????????(??????)∈(0,1)
- ???(?1?2?3?4)=??(?1|?2?3?4)∗?(?2|?3?4)∗??(?3|?4)∗??(?4)
???(?1?2?3?4)∼??(?1|?2)∗?(?2|?3)∗??(?3|?4)∗??(?4)- 如何获取??(?1|?2?3?4)Pr(w1|w2w3w4) ?
- 4)生成句子,通过计算句子单词相关的概率来判断句子是否合理
-
import jieba import pandas import re import os import numpy #content = pandas.read_csv("article_9k.txt") #articles = content['content'].tolist() #print(len(content)) #清理无效字符 count = 0 def token(string): """ 通过正则表达式去除逗号等无效字符 """ return "".join(re.findall('\w+',string)) #print(token("打算飞撒得粉碎。。。+俄df11 >,,dsd1wo的")) def cut(string): """ 利用jieba分词切词 """ return list(jieba.cut(token(string))) from collections import Counter def getWords(filename,encode = 'UTF-8'): """ 读取文件获取词汇总 """ all_words = [] if not os.path.isfile(filename): return all_words f = open(filename,encoding= encode) count = 0 for line in f.readlines(): #print(line) all_words.extend(cut(str(line))) if count >= 1000: break count += 1 f.close() return all_words all_words = getWords("article_9k.txt") print(len(all_words)) count_words = Counter(all_words) print(count_words.most_common(50)) def prob_1(word): """ 计算单个单词的概率 """ pro = 0.0 if len(all_words) > 0 and word in count_words: pro = count_words[word]/len(all_words) return pro print(prob_1("我们")) from functools import reduce from operator import add,mul def prob_2(word1,word2): """ 计算两个单词的概率 """ word = word1 + word2 if word in count_words and count_words > 0: return count_words[word]/len(count_words) return 1/len(count_words) print(prob_2("我们","和")) def genProbForSentence(sentence): words = cut(sentence) prob_all = 1 for i , word in enumerate(words[:-1]): next_word = words[i+1] prob_t = prob_2(word,next_word) prob_all *= prob_t return prob_all print(genProbForSentence("今天天气不错啊")) print(genProbForSentence("他将进行计划")) print(genProbForSentence("他将进入市场"))
如上,我们生成三个句子:
-
1、今天天气不错啊
-
2、他将进行计划
-
3、他将进入市场
-
分别得到3个概率值
4.482003182916971e-10
9.488733318338036e-15
9.488733318338036e-15