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