我有一个带故事的文本文件,其中每个句子出现在不同的行上,例如:
ONCE UPON A TIME, THERE WAS A MOUSE NAMED ED.
ED WAS A FRIENDLY MOUSE.
HE HAD MANY FRIENDS.
HE LIVED IN A SMALL HOUSE WITH HIS OTHER MOUSE FRIENDS.
HIS MOUSE FRIENDS WERE FRIENDLY.
HIS FRIENDS LIVED IN A SMALL HOUSE.
...
我还创建了一个单词列表,列出了故事中出现的每个单词。
ONCE
UPON
A
TIME
...
这有大约6,000个句子,4,000个独特单词。
我需要找到一个算法,我将写入BASH脚本,该脚本最符合此标准:
单词列表中的每个单词都用故事中的大括号标记一次,例如:
{ONCE} {UPON} {A} {时间},{有}} {WAS} A {MOUSE} {NAMED} {ED}。 ED是{FRIENDLY} MOUSE。 {HE} {HAD} {MANY} {FRIENDS}。 HE {LIVED} {IN} A {SMALL} {HOUSE} {WITH} {HIS} {OTHER} MOUSE FRIENDS。 他的朋友朋友{WERE}友好。 他的朋友住在一个小房子里。 ...
可能会标记找到某个单词的任何位置,例如第一次出现,第三次出现,最后一次出现等。
某些算法会导致许多行被删除。其他算法会减少删除的行数。
这些是我尝试的算法:
标记故事中每个单词的第一个出现位置。这导致大约50%的线被删除,大部分都在最后。
标记故事中每个单词的第一个出现位于一条尚未有大括号的行上。如果找不到这样的行,则标记故事中该单词的第一次出现。这导致大约25%的行被删除。
随机标记单词。结果可能仍然不是最佳的。
如何创建一个算法,在文件中标记一个单词的出现次数,从而最大限度地将这些标记分布在每一行中,从而产生尽可能少的无标记行?
答案 0 :(得分:1)
准备二分图,其中一个部分的顶点对应于线条,另一个部分的顶点对应于单词。将边放在一行中出现的任何地方。找一个maximum matching,例如,Hopcroft - Karp。对于与单词匹配的每一行,在该行的该单词的出现周围加上大括号。用无与伦比的单词做一些特别的事情。