Алгоритм наименования продуктов - PullRequest
11 голосов
/ 15 ноября 2010

Я работаю над новым веб-сайтом, который может генерировать названия компаний / продуктов. Кто-то может прийти на сайт и напечатать несколько слов, которые вы хотите включить в значение продукта.

т.е. Вы только что изобрели робота, который очищает разлив нефти. Вы вводите список слов: робот, масло, разлив, автономный, интеллектуальный и т. Д. Код будет принимать слова, находить синонимы, префиксы и суффиксы для всех этих слов и пытаться смешать их вместе классным способом.

Нефть будет означать синоним нефти и префикс petro. Месить, что вместе с роботом даст «Петробот». Или, для новой версии будильника, список: «интеллектуальный, будильник, часы, осведомленный, подключенный» может привести к названию продукта «Cognizant Clock».

На сайте будет представлен список пюре слов, и вы можете выбрать из лучших имен.

Мой вопрос такой. Любые идеи о том, как генерировать эти слитные слова? Прямо сейчас я собираюсь найти синонимы, префиксы и суффиксы и сохранить их в массиве. Затем я буду искать общие буквы между словами и максимально перекрывать их. прямое телевидение становится DirecTV. Этот поиск грубой силы кажется немного не элегантным.

Существуют ли какие-либо другие способы генерирования названий продуктов, которые вы можете придумать, или более простой подход к предложенному мной?

Просто хотел посмотреть, есть ли другой способ, о котором люди могут подумать. Конечно, этот сайт будет свободным и открытым, и я буду ссылаться на эту тему на странице о сайте, поэтому, пожалуйста, не думайте, что этот пост принес мне пользу сообществу.

Ответы [ 2 ]

3 голосов
/ 15 ноября 2010

Я бы сохранил все префиксы слов в нескольких хэш-картах. Чтобы проверить, начинается ли одно слово с слова «бот», вам нужно выполнить только один поиск в карте префиксов.

После этого это просто обход в ширину «графа» «соединяемых» слов.

Примерно так:

import java.util.*;

public class WordMasher {

    int maxWordLen = 0;
    Set<String> words = new HashSet<String>();
    HashMap<String, Set<String>> prefixes = new HashMap<String, Set<String>>();

    public WordMasher(String... words) {
        for (String word : words) {
            this.words.add(word);
            maxWordLen = Math.max(maxWordLen, word.length());
            for (int i = 0; i < word.length() - 1; i++)
                putPrefix(word.substring(0, i), word);
        }
    }


    private void putPrefix(String pref, String word) {
        getPrefixSet(pref).add(word);
    }


    public Set<String> getMashes() {

        Set<String> mashes = new HashSet<String>();
        for (String word : words) {
            Set<String> newWordsLeft = new HashSet<String>(words);
            newWordsLeft.remove(word);
            mashes.addAll(getMashes(word, newWordsLeft));
        }

        return mashes;
    }

    private Set<String> getPrefixSet(String prefix) {
        if (!prefixes.containsKey(prefix))
            prefixes.put(prefix, new HashSet<String>());
        return prefixes.get(prefix);
    }


    private Set<String> getMashes(String prefix, Set<String> wordsLeft) {

        Set<String> mashes = new HashSet<String>();

        int prefLen = prefix.length();

        for (int n = Math.min(prefLen, maxWordLen); n >= 1; n--) {

            String toMatch = prefix.substring(prefLen - n, prefLen);
            List<String> alts = new ArrayList<String>(getPrefixSet(toMatch));
            alts.retainAll(wordsLeft);
            for (String alt : alts) {

                String newPrefix = prefix + alt.substring(n);
                mashes.add(newPrefix);

                Set<String> newWordsLeft = new HashSet<String>(wordsLeft);
                newWordsLeft.remove(alt);
                for (String tail : getMashes(newPrefix, newWordsLeft))
                    mashes.add(tail);
            }
        }
        return mashes;
    }


    public static void printProductNames(String... words) {
        System.out.println("Products for " + Arrays.toString(words) + ":");
        for (String product : new WordMasher(words).getMashes())
            System.out.println("    " + product);
        System.out.println();
    }

    public static void main(String[] args) {

        printProductNames("robot", "liquid", "oil", "cleaner", "spill", "turbo" );
        printProductNames("world", "domination", "yellow",
                "monkey", "donkey", "banana");
    }
}

Печать:

Products for [robot, liquid, oil, cleaner, spill, turbo]:
    turboiliquid
    oiliquid
    spilliquid
    cleanerobot
    roboturbo
    cleaneroboturboil
    roboturboiliquid
    cleaneroboturbo
    cleaneroboturboiliquid
    turboil
    roboturboil

Products for [world, domination, yellow, monkey, donkey, banana]:
    monkeyellow
    yelloworldonkey
    donkeyelloworld
    donkeyelloworldomination
    worldonkey
    monkeyelloworldomination
    yelloworldomination
    worldomination
    monkeyelloworldonkey
    yelloworld
    monkeyelloworld
    donkeyellow
    worldonkeyellow

Если здесь есть проблема со скоростью, вы можете изменить String s на StringBuilder s.

1 голос
/ 15 ноября 2010

Дерево суффиксов может быть структурой данных, которую вы ищете для эффективной поддержки ваших различных операций: - http://en.wikipedia.org/wiki/Suffix_tree

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...