Я пытаюсь создать простой синтаксический анализатор для некоторых текстовые данные. (Текст на языке, для которого NLTK не имеет синтаксических анализаторов.)
По сути, у меня есть ограниченное количество префиксов, которые могут состоять из одной или двух букв; слово может иметь более одного префикса. У меня также есть ограниченное количество суффиксов из одной или двух букв. Все, что находится между ними, должно быть «корнем» слова. Многие слова будут иметь больше одного возможного разбора, поэтому я хочу ввести слово и получить список возможных анализов в виде кортежа (префикс, корень, суффикс).
Однако я не могу понять, как структурировать код. Я вставил пример одного из способов, который я пробовал (используя некоторые фиктивные данные на английском языке, чтобы сделать его более понятным), но это явно неправильно. Во-первых, это действительно уродливо и избыточно, поэтому я уверен, что есть лучший способ сделать это. Во-вторых, это не работает со словами, которые имеют более одного префикса или суффикса, или оба префикса (ов) и суффикса (ов).
Есть мысли?
prefixes = ['de','con']
suffixes = ['er','s']
def parser(word):
poss_parses = []
if word[0:2] in prefixes:
poss_parses.append((word[0:2],word[2:],''))
if word[0:3] in prefixes:
poss_parses.append((word[0:3],word[3:],''))
if word[-2:-1] in prefixes:
poss_parses.append(('',word[:-2],word[-2:-1]))
if word[-3:-1] in prefixes:
poss_parses.append(('',word[:-3],word[-3:-1]))
if word[0:2] in prefixes and word[-2:-1] in suffixes and len(word[2:-2])>2:
poss_parses.append((word[0:2],word[2:-2],word[-2:-1]))
if word[0:2] in prefixes and word[-3:-1] in suffixes and len(word[2:-3])>2:
poss_parses.append((word[0:2],word[2:-2],word[-3:-1]))
if word[0:3] in prefixes and word[-2:-1] in suffixes and len(word[3:-2])>2:
poss_parses.append((word[0:2],word[2:-2],word[-2:-1]))
if word[0:3] in prefixes and word[-3:-1] in suffixes and len(word[3:-3])>2:
poss_parses.append((word[0:3],word[3:-2],word[-3:-1]))
return poss_parses
>>> wordlist = ['construct','destructer','constructs','deconstructs']
>>> for w in wordlist:
... parses = parser(w)
... print w
... for p in parses:
... print p
...
construct
('con', 'struct', '')
destructer
('de', 'structer', '')
constructs
('con', 'structs', '')
deconstructs
('de', 'constructs', '')