テキストデータ用の単純なパーサーを作成しようとしています。(テキストは、NLTK にパーサーがない言語です。)
基本的に、1 文字か 2 文字のプレフィックスの数には制限があります。単語には複数の接頭辞を付けることができます。また、1 文字または 2 文字のサフィックスの数も限られています。それらの間にあるものは何でも、単語の「ルート」でなければなりません。多くの単語には可能な解析が 1 つ以上あるため、単語を入力して、可能な解析のリストをタプル (プレフィックス、ルート、サフィックス) の形式で取得したいと考えています。
ただし、コードを構造化する方法がわかりません。私が試した1つの方法の例を貼り付けました(ダミーの英語データを使用して理解しやすくしました)が、明らかに正しくありません. 一つには、それは本当に醜くて冗長なので、もっと良い方法があると確信しています. 別の理由として、複数の接頭辞または接尾辞、または接頭辞と接尾辞の両方を持つ単語では機能しません。
何かご意見は?
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', '')