EDIT:申し訳ありませんが、私のサンプルコードはバグがあります。推測する部分の最初のステップとして、この種のアルゴリズムが必要です:最長の部分文字列またはこれ
上で説明したように反復といくつかのマスキングを追加する必要があります。また、以下のサンプルでは、DVD-RW の「L121」は推測されません (「共通」で開始する必要があると述べたように)。したがって、一般的な連続したサブシーケンスをすべて見つけて、どれが関連しているかを判断する必要があります! (おそらく一種の最大化ゲイン関数を使用)
2 番目のリンク long_substr を使用:
>>> for x in d:
for y in d:
if x == y: continue
common = long_substr([x, y])
length = len(common)
if x.startswith(common) and y.startswith(common):
print "\t".join((x, y, str(length), common))
=>を生成する
0324311071068 0324311071134 10 0324311071
0324311071134 0324311071068 10 0324311071
1613519L121 1613518L121 6 161351
1613519L121 1613509L121 5 16135
WMAYUJ844900 WMAYUJ753738 6 WMAYUJ
WMAYUJ844900 WMAYUJ072099 6 WMAYUJ
WMAYUJ844900 WMAYUJ683739 6 WMAYUJ
WMAYUJ753738 WMAYUJ844900 6 WMAYUJ
WMAYUJ753738 WMAYUJ072099 6 WMAYUJ
WMAYUJ753738 WMAYUJ683739 6 WMAYUJ
1613518L121 1613519L121 6 161351
1613518L121 1613509L121 5 16135
WMAYUJ072099 WMAYUJ844900 6 WMAYUJ
WMAYUJ072099 WMAYUJ753738 6 WMAYUJ
WMAYUJ072099 WMAYUJ683739 6 WMAYUJ
WMAYUJ683739 WMAYUJ844900 6 WMAYUJ
WMAYUJ683739 WMAYUJ753738 6 WMAYUJ
WMAYUJ683739 WMAYUJ072099 6 WMAYUJ
608131237 608131234 8 60813123
1613509L121 1613519L121 5 16135
1613509L121 1613518L121 5 16135
608131234 608131237 8 60813123
--- 最初のバグのある返信はここから始まります
以下は私の返信の最初の部分です。これは、私が間違っていた場所を理解するのに役立つだけであり、いくつかのアイデアを提供する可能性があります。
あなたの特定のニーズに合わせてLongest Common Subsequence probleme solver LCSを使用したサンプルは、何が一般的かを推測するプロセスの最初のステップであると考えることができますか?
これは Python で書かれていますが、上記の最初のリンクの ActiveState Code Recipes を使用すると、簡単に読むことができます (または IDLE (Python エディター) でカット アンド ペーストできます)。
これはバイオインフォマティクスと関係があります (遺伝子配列を考えてください)。
最も興味深い一般的なシーケンスを決定するために何かが必要になります (最小の長さを持っている可能性がありますか?そして、David または私のコメントで既に提案されているようなマスキングに進みます)
(最初は、LCSがLCS連続ソルバーではないことがわかりませんが、必要になるでしょう!だから、LCSソルバーの最初の使用法はバグです:(連続していないため、MAYUJ8またはWMAYUJ7を持っていますが、そうではありませんWMAYUJ - これは短いです! ソルバーは、それらが連続していることを期待せずに最も長い一般的な文字を見つけます! - 申し訳ありません)
>>> raw = """1613518L121
1613509L121
1613519L121
0324311071068
0324311071134
608131234
608131237
WMAYUJ753738
WMAYUJ072099
WMAYUJ683739
WMAYUJ844900"""
>>> d = dict()
>>> for line in raw.split("\n"):
if not line.strip(): continue
value = line.strip()
d[value] = 1
>>> for x in d:
for y in d:
if x == y: continue
length = LCSLength(x, y)
common = LCS(x,y)
if length >= 3 and x.startswith(common):
print "\t".join((x, y, str(length), common))
=>を生成する
0324311071068 0324311071134 10 0324311071
0324311071068 608131234 4 0324
0324311071134 0324311071068 10 0324311071
WMAYUJ844900 WMAYUJ753738 7 WMAYUJ8
WMAYUJ753738 WMAYUJ072099 7 WMAYUJ7
608131237 608131234 8 60813123
608131234 608131237 8 60813123