python 状态机语句"Python is fun"褒贬义判断的两种实现方式

0、

背景:思考下怎么对一句话如python is bad判断出这是贬义。

版本:

pip install transitions==0.6.1

python == 2.7.10


1、

网上教程大部分如:http://www.cnblogs.com/21207-iHome/p/6085334.html 这篇博客上的写法。

# coding=utf-8

##############################################################
# 代码来源: https://www.python-course.eu/finite_state_machine.php
# 目标:输入一段str如:python is good.
#      判断出这句话是褒义还是贬义的。
##############################################################


class StateMahine(object):
    def __init__(self):
        """
        有限状态机是一个五元组M=(Q,Σ,δ,q0,F),其中:
            Q = {q0,q1,...,qn}是有限状态集合。在任一确定的时刻,有限状态机只能处于一个确定的状态qiqi;
            Σ = {σ1,σ2,...,σn}是有限输入字符集合。在任一确定的时刻,有限状态机只能接收一个确定的输入σjσj;
            δ: Q×Σ→Q是状态转移函数,在某一状态下,给定输入后有限状态机将转入状态迁移函数决定的一个新状态;
            q0 ∈ Q是初始状态,有限状态机由此状态开始接收输入;
            F ⊆ Q是最终状态集合,有限状态机在达到终态后不再接收输入。
        """
        self.handlers = {}  # 这就是状态转移函数δ
        self.startState = None  # 初始状态q0
        self.endStates = []  # 最终状态集合F

    def add_state(self, name, handler, end_state=0):
        name = name.upper()
        self.handlers[name] = handler
        if end_state:
            self.endStates.append(name)

    def set_start(self, name):
        self.startState = name.upper()

    def run(self, cargo):
        try:
            handler = self.handlers[self.startState]
        except:
            raise Exception("must call .set_start() before .run()")
        if not self.endStates:
            raise Exception("at least one state must be an end_state")

        while 1:
            newState, cargo = handler(cargo)
            if newState.upper() in self.endStates:
                print ("Reached ", newState)
                break
            else:
                handler = self.handlers[newState.upper()]


positive_adjectives = ["great", "super", "fun", "entertraining", "easy"]
negative_adjectives = ["boring", "difficult", "ugly", "bad"]


def start_transitions(txt):
    """
        s = "python is good"
        s.split(None, 1)
        ['python', 'is good']
    """
    splitted_txt = txt.split(None, 1)
    word, txt = splitted_txt if len(splitted_txt) > 1 else (txt, "")
    if word == "Python":
        newState = "Python_state"
    else:
        newState = "error_state"
    return (newState, txt)


def python_state_transitions(txt):
    splitted_txt = txt.split(None,1)
    word, txt = splitted_txt if len(splitted_txt) > 1 else (txt,"")
    if word == "is":
        newState = "is_state"
    else:
        newState = "error_state"
    return (newState, txt)


def is_state_transitions(txt):
    splitted_txt = txt.split(None,1)
    word, txt = splitted_txt if len(splitted_txt) > 1 else (txt,"")
    if word == "not":
        newState = "not_state"
    elif word in positive_adjectives:
        newState = "pos_state"
    elif word in negative_adjectives:
        newState = "neg_state"
    else:
        newState = "error_state"
    return (newState, txt)


def not_state_transitions(txt):
    splitted_txt = txt.split(None,1)
    word, txt = splitted_txt if len(splitted_txt) > 1 else (txt,"")
    if word in positive_adjectives:
        newState = "neg_state"
    elif word in negative_adjectives:
        newState = "pos_state"
    else:
        newState = "error_state"
    return (newState, txt)


if __name__ == '__main__':
    m = StateMahine()
    m.add_state("Start", start_transitions)
    m.add_state("Python_state", python_state_transitions)
    m.add_state("is_state", is_state_transitions)
    m.add_state("not_state", not_state_transitions)
    m.add_state("neg_state", None, end_state=1)
    m.add_state("pos_state", None, end_state=1)
    m.add_state("error_state", None, end_state=1)

    m.set_start("Start")

    m.run("Python is great")
    m.run("Python is not great")
    m.run("Python is not fun")
    m.run("Python is ugly")
    m.run("Pythoniseasy")
    m.run("Python is easy1")


"""
结果:
Reached  pos_state
Reached  neg_state
Reached  neg_state
Reached  neg_state
Reached  error_state
Reached  error_state

采用这种算法结构对每一个状态进行封装处理,逻辑清晰。
"""

2、

但其实我们研究了这个transitions库,理论上也可以实现的吧。 研究的博客:点击打开链接

# coding=utf-8
##############################################################
# 目标:判断"Python is bad"这句话的褒贬义
# 环境: pip install transitions
# 这个库简直碉堡了...
# by ouyang 2017年10月10日 星期二
##############################################################

from transitions import Machine

class Matter(object):
    def __init__(self, words, positive_adjectives, negative_adjectives):
        self.original_s = self.s = words # 保留原始的字符串
        self.positive_adjectives = positive_adjectives
        self.negative_adjectives = negative_adjectives
        self.result = None  # 结果保存

    def on_enter_Start(self):
        splitted_txt = self.s.split(None, 1)
        word, txt = splitted_txt if len(splitted_txt) > 1 else (self.s, "")
        if word == 'Python':
            self.next_state = self.to_Python
        else:
            self.next_state = self.to_error
        self.s = txt

    def on_enter_Python(self):
        splitted_txt = self.s.split(None, 1)
        word, txt = splitted_txt if len(splitted_txt) > 1 else (self.s, "")
        if word == 'is':
            self.next_state = self.to_is
        else:
            self.next_state = self.to_error
        self.s = txt

    def on_enter_is(self):
        splitted_txt = self.s.split(None, 1)
        word, txt = splitted_txt if len(splitted_txt) > 1 else (self.s, "")

        if word == "not":
            self.next_state = self.to_not
        elif word in self.positive_adjectives:
            self.next_state = self.to_positive
        elif word in self.negative_adjectives:
            self.next_state = self.to_negative
        else:
            self.next_state = self.to_error
        self.s = txt

    def on_enter_not(self):
        splitted_txt = self.s.split(None, 1)
        word, txt = splitted_txt if len(splitted_txt) > 1 else (self.s, "")
        if word in self.positive_adjectives:
            self.next_state = self.to_negative
        elif word in self.negative_adjectives:
            self.next_state = self.to_positive
        else:
            self.next_state = self.to_error
        self.s = txt

    def on_enter_negative(self):
        self.result = "Negative!!!"
        self.next_state = None

    def on_enter_positive(self):
        self.result = "Positive!!!"
        self.next_state = None

    def on_enter_error(self):
        self.result = "Error!!!"
        self.next_state = None

    def run(self):
        while self.next_state:
            print "now state = %s!" % self.state
            self.next_state()

if __name__ == '__main__':
    words_list = ["Python is not bad",
                  "Python is bad",
                  "Python is fun",
                  "Python is not fun",
                  "Python1 is bad",
                  "Python is1 bad",
                  "Python is bad111"]

    for words in words_list:
        print "#" * 50
        positive_adjectives = ["great", "super", "fun", "entertraining", "easy"]
        negative_adjectives = ["boring", "difficult", "ugly", "bad"]
        model = Matter(words, positive_adjectives, negative_adjectives)

        # 定义状态
        states = ["Start", "Python", "is", "not",  "positive", "negative", "error"]

        # 初始化状态机
        machine = Machine(model=model, states=states, ordered_transitions=True)

        # 计算结果
        model.run()
        print model.original_s, "=", model.result
结果:

##################################################
now state = initial!
now state = Start!
now state = Python!
now state = is!
now state = not!
Python is not bad = Positive!!!
##################################################
now state = initial!
now state = Start!
now state = Python!
now state = is!
Python is bad = Negative!!!
##################################################
now state = initial!
now state = Start!
now state = Python!
now state = is!
Python is fun = Positive!!!
##################################################
now state = initial!
now state = Start!
now state = Python!
now state = is!
now state = not!
Python is not fun = Negative!!!
##################################################
now state = initial!
now state = Start!
Python1 is bad = Error!!!
##################################################
now state = initial!
now state = Start!
now state = Python!
Python is1 bad = Error!!!
##################################################
now state = initial!
now state = Start!
now state = Python!
now state = is!
Python is bad111 = Error!!!


相关的demo放到:https://github.com/emaste-r/state_demo

如果觉得可以的话,帮忙去github点个star哟~


以上


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值