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