あなたのコンパクト化文書ことN.
レッツのB(n個)の長さは、ブールとする:真の文書が位置からn個の文書で始まる単語に分割することができます。
b(N)が真(空文字列は0ワードに分割できるので)です。 文字N-k-1から始まるすべての単語を考慮してb(N-k-1)を構成すると、b(N)、b(N-1)、... bそのような単語wがb(N - k - 1 + len(w))に設定されている場合、b(N - k - 1)をtrueに設定します。そのような単語がない場合は、b(N - k - 1)をfalseに設定します。
最後に、文書全体を単語に分割できるかどうかを示すb(0)を計算します。
擬似コードで
:あなたので、
def try_to_split(doc):
N = len(doc)
b = [False] * (N + 1)
b[N] = True
for i in range(N - 1, -1, -1):
for word starting at position i:
if b[i + len(word)]:
b[i] = True
break
return b
はあなたが効率的「位置私はで始まる単語」を得るために行うことができますいくつかのトリックがありますが、あなたはO(N^2)のアルゴリズムを求めています辞書からiで始まるすべての文字列を検索できます。
ワードを生成するために、あなたは良い言葉を保存するために、上記のアルゴリズムを変更したり、ちょうどこのようにそれを生成することができ、次のいずれか
def generate_words(doc, b, idx=0):
length = 1
while true:
assert b(idx)
if idx == len(doc): return
word = doc[idx: idx + length]
if word in dictionary and b(idx + length):
output(word)
idx += length
length = 1
ここでBは、アルゴリズムの最初の部分から生成されたboolean型の配列であります。
これは、教科書の練習問題です。私は練習問題に対する解決策はありません。この問題を解決する方法がわかりません。 – Pet
最初に気になること - あいまいさ。あなたの辞書に 'was'、 'her'、 'washer'という単語があるとします。あなたは、しかし、最短の言葉を好むことができます。待って、いいえ...単語から部分を切り取って文字列を無効にすることができます - キャッチ '自動'から '自動'のように。 – alxx
最初に回答を検索しようとしましたか? SOに関するこの問題についての質問はほとんどありません - http://stackoverflow.com/questions/4755157/split-string-into-words、http://stackoverflow.com/questions/3553958/tokenize-valid-words-from -a-long-string、http://stackoverflow.com/questions/3466972/how-to-split-a-string-into-words-ex-stringintowords-string-into-words。ダイナミックプログラミングソリューションについて言及しているものもあります。 – hoha