Подтвердить что ты не робот

Алгоритм именования продуктов

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

После этого это просто пересечение ширины "графика" "подключаемых" слов.

Что-то вроде этого:

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 на StringBuilder s.

Ответ 2

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