Вот улучшенная версия моего предыдущего ответа. Этот использует совпадение регулярного выражения, чтобы сделать нечеткое совпадение в глаголе. Все это работает:
Steve loves Denise
Bears love honey
Maria interested Anders
Maria interests Anders
Шаблон регулярного выражения "любит?" соответствует "любовь" плюс необязательный 's'. Шаблон «проценты. *» Соответствует «интересам» плюс все, что угодно. Паттерны с несколькими альтернативами, разделенными вертикальными чертами, совпадают, если какая-либо из альтернатив совпадает.
import re
re_map = \
[
("likes?|loves?|interest.*", "red"),
("dislikes?|hates?", "blue"),
("knows?|tolerates?|ignores?", "black"),
]
# compile the regular expressions one time, then use many times
pat_map = [(re.compile(s), color) for s, color in re_map]
# We dont use is_verb() in this version, but here it is.
# A word is a verb if any of the patterns match.
def is_verb(word):
return any(pat.match(word) for pat, color in pat_map)
# Return color from matched verb, or None if no match.
# This detects whether a word is a verb, and looks up the color, at the same time.
def color_from_verb(word):
for pat, color in pat_map:
if pat.match(word):
return color
return None
def make_noun(lst):
if not lst:
return "--NONE--"
elif len(lst) == 1:
return lst[0]
else:
return "_".join(lst)
for line in open("filename"):
words = line.split()
# subject could be one or two words
color = color_from_verb(words[1])
if color:
# subject was one word
s = words[0]
o = make_noun(words[2:])
else:
# subject was two words
color = color_from_verb(words[1])
assert color
s = make_noun(words[0:2])
o = make_noun(words[3:])
print "%s -> %s %s;" % (s, o, color)
Надеюсь, понятно, как взять этот ответ и расширить его. Вы можете легко добавить больше шаблонов, чтобы соответствовать большему количеству глаголов. Вы можете добавить логику для определения «есть» и «в» и отбросить их, чтобы «Андерс заинтересовался Марией». И так далее.
Если у вас есть какие-либо вопросы, я был бы рад объяснить это дальше. Удачи.