Как я определяю, походит ли случайная строка на английский язык?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

22
задан Dori 6 November 2011 в 08:39
поделиться

13 ответов

Можно создать цепь Маркова огромного английского текста.

Впоследствии можно подать слова в цепь Маркова и проверить, как высоко вероятность состоит в том, что слово является английским.

Посмотрите здесь: http://en.wikipedia.org/wiki/Markov_chain

Внизу страницы Вы видите текстовый генератор Маркова. То, что Вы хотите, является точно реверсом его.

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

28
ответ дан Nils Pipenbrinck 29 November 2019 в 03:50
поделиться

Простой способ с Байесовскими фильтрами (пример Python от http://sebsauvage.net/python/snyppets/#bayesian )

from reverend.thomas import Bayes
guesser = Bayes()
guesser.train('french','La souris est rentrée dans son trou.')
guesser.train('english','my tailor is rich.')
guesser.train('french','Je ne sais pas si je viendrai demain.')
guesser.train('english','I do not plan to update my website soon.')

>>> print guesser.guess('Jumping out of cliffs it not a good idea.')
[('english', 0.99990000000000001), ('french', 9.9999999999988987e-005)]

>>> print guesser.guess('Demain il fera très probablement chaud.')
[('french', 0.99990000000000001), ('english', 9.9999999999988987e-005)]
18
ответ дан e-satis 29 November 2019 в 03:50
поделиться

Вы могли приблизиться к этому путем маркирования строки кандидата в биграммы — пары adjascent letters— и проверка каждой биграммы против таблицы английских частот биграмм.

  • Простой: если какая-либо биграмма является достаточно низкой на таблице частот (или напрямую отсутствуйте), отклоните строку как неправдоподобную. (Строка содержит биграмму "QZ"? Отклонение!)
  • менее простой: вычислите полное правдоподобие целой строки с точки зрения, скажем, продукта частот каждой биграммы, разделенной на среднюю частоту допустимой английской строки той длины. Это позволило бы, Вы обоим (a) принимают строку с нечетной низкочастотной биграммой среди в других отношениях высокочастотных биграмм и (b) отклоняют строку с несколькими отдельными low-but-not-quite-below-the-threshold биграммами.

Любой из тех потребовал бы некоторой настройки порога (порогов), вторая техника больше, чем первое.

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

Биграммные и триграммные таблицы на основе существующих корпусов исследования могут быть доступными бесплатно или покупка (я не нашел никого в свободном доступе, но только сделал поверхностный Google до сих пор), но можно вычислить биграммную или триграммную таблицу от себя из любого большого корпуса английского текста. Просто заводная рукоятка через каждое слово как маркер и счет каждый bigram— Вы могли бы обработать это как хеш с данной биграммой как ключ и увеличенный целочисленный счетчик как значение.

английская морфология и английская фонетика (заметно!) менее, чем изометрический, таким образом, эта техника могла бы хорошо генерировать строки, которые "выглядят" английскими, но представляют неприятный prounciations. Это - другой аргумент в пользу триграмм, а не bigrams— странность, произведенная анализом звуков, которые используют несколько букв в последовательности для создания данной фонемы, будет уменьшена, если n-грамма охватит целый звук. (Думайте "кабелеукладчик" или "цунами", например.)

4
ответ дан Josh Millard 29 November 2019 в 03:50
поделиться

Довольно легко генерировать английские звучащие слова с помощью Цепи Маркова. Движение назад является большим количеством проблемы, как бы то ни было. Каков приемлемый предел погрешности для результатов? Вы могли всегда иметь список общих пар буквы, утраиваетесь, и т.д., и градуируйте их на основе этого.

4
ответ дан William Keller 29 November 2019 в 03:50
поделиться

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

решение для Perl А было бы Склеп:: PassGen, который можно обучить со словарем (таким образом, Вы могли обучить его на различные языки, если Вам нужно к). Это идет через словарь и собирает статистические данные по 1, 2, и последовательности с 3 буквами, затем создает новые "слова" на основе частотностей.

3
ответ дан Andrew Barnett 29 November 2019 в 03:50
поделиться

Метафон и Двойной Метафон подобен SOUNDEX, кроме они могут быть настроены больше к Вашей цели, чем SOUNDEX. Они разработаны для "хеширования" слов на основе их фонетического "звука" и способны делать это для английского языка (но не так других языков и имен собственных).

Одна вещь иметь в виду со всеми тремя алгоритмами состоит в том, что они чрезвычайно чувствительны к первой букве Вашего слова. Например, при попытке выяснить, является ли KEAL звучанием английского языка, Вы не найдете соответствие к РЕАЛЬНЫМ , потому что первые буквы отличаются.

2
ответ дан Andrew Barnett 29 November 2019 в 03:50
поделиться

Я испытал бы желание выполнить soundex алгоритм по словарю английских слов и кэшировать результаты, тогда soundex Ваша строка кандидата и соответствие против кэша.

В зависимости от требований к производительности, Вы могли разработать алгоритм расстояния для кодов soundex и принять строки в рамках определенного допуска.

Soundex очень легко реализовать - см. Википедия для описания алгоритма.

реализация в качестве примера того, что Вы хотите сделать, была бы:

def soundex(name, len=4):
    digits = '01230120022455012623010202'
    sndx = ''
    fc = ''

    for c in name.upper():
        if c.isalpha():
            if not fc: fc = c
            d = digits[ord(c)-ord('A')]
            if not sndx or (d != sndx[-1]):
                sndx += d

    sndx = fc + sndx[1:]
    sndx = sndx.replace('0','')
    return (sndx + (len * '0'))[:len]

real_words = load_english_dictionary()
soundex_cache = [ soundex(word) for word in real_words ]

if soundex(candidate) in soundex_cache:
    print "keep"
else:
    print "discard"

, Очевидно, необходимо будет обеспечить реализацию read_english_dictionary.

РЕДАКТИРОВАНИЕ : Ваш пример "KEAL" будет прекрасен, так как это имеет тот же код soundex (K400) как "КИЛЬ". Вы, возможно, должны зарегистрировать отклоненные слова и вручную проверить их, если Вы хотите понять интенсивность отказов.

2
ответ дан Russ 29 November 2019 в 03:50
поделиться

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

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

Или Вы могли просто использовать словарь и отклонить слова, которые не находятся в нем (с некоторыми допусками на множественные числа и другие изменения).

1
ответ дан Kevin ORourke 29 November 2019 в 03:50
поделиться

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

0
ответ дан Ryan Bigg 29 November 2019 в 03:50
поделиться

Это походит вполне на включенную задачу! Первое, что пришло на ум совместимой фонеме нужен гласный или прежде или после него. Определение, что фонема, будет довольно трудно хотя! Необходимо будет, вероятно, вручную выписать список их. Например, "TR" в порядке, но не "TD", и т.д.

0
ответ дан Iain 29 November 2019 в 03:50
поделиться

Я, вероятно, оценил бы каждое слово с помощью алгоритма SOUNDEX против базы данных английских слов. При выполнении этого на SQL-сервере, должно быть довольно легко установить базу данных, содержащую список большинства английских слов (использующий словарь в свободном доступе), и сервер MSSQL имеет SOUNDEX, реализованный как доступный алгоритм поиска.

, Очевидно, можно реализовать это сами, если Вы хотите на каком-либо языке - но это могла бы быть настоящая задача.

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

0
ответ дан ulrikj 29 November 2019 в 03:50
поделиться

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

, Например, английские звучащие слова имеют тенденцию следовать за шаблоном совместимого гласного гласного, кроме некоторых дифтонгов и стандартных совместимых пар (например, th, т.е. и ei, oo, TR). С системой как этот необходимо разделить почти все слова, которые не кажутся, что они могли быть англичанами. Вы нашли бы на более близком контроле вероятное разделение большого количества слов, которые действительно походят на английский язык также, но можно тогда начать добавлять правила, которые допускают более широкий диапазон слов и 'обучают' алгоритм вручную.

Вы не удалите все ложные отрицательные стороны (например, Я не думаю, что Вам могло удаться придумать правило включать 'rythm', явно не кодируя в том ритме, слово), но это предоставит метод фильтрации.

я также предполагаю, что Вы хотите строки, которые могли быть английскими словами (они звучат разумными, когда объявлено), а не строки, которые являются определенно словами с английским значением.

-1
ответ дан workmad3 29 November 2019 в 03:50
поделиться

Я бы посоветовал взглянуть на фи-тест и индекс совпадения. http://www.threaded.com/cryptography2.htm

0
ответ дан 29 November 2019 в 03:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: