1、语言模型

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值