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喲~


以上


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章