2010-10-21 5 views
2

Я на OS X, и в Objective-C Я пытаюсь преобразоватьДобавить пробелы между словами в строке внепространственного

, например, «Bobateagreenapple»

в «Боб съел зеленый яблоко "

Есть ли способ сделать это эффективно? Будет ли что-то, связанное с проверкой орфографии?

EDIT: Только некоторые дополнительные данные: Я пытаюсь создать что-то, что требует некоторого искаженного текста (например, текстовая копия, вставленная из старых pdf-файлов, которая заканчивается без пробелов, особенно из интернет-архивов, таких как JSTOR). Поскольку неверно оформленный текст, вероятно, будет длинным ... ну, я просто пытаюсь выяснить, возможно ли это, если я действительно попытаюсь написать систему только для того, чтобы узнать, что требуется 2 часа, чтобы исправить абзац текста ,

+0

+1 Очень интересный вопрос. Мне интересно посмотреть на это решение, хотя я не могу думать об этом. Единственный способ, который может быть рассмотрен, - это просто перебирать все буквы и отрубать слово, когда его сравнивают со словарем в виде полного слова ... хотя этот метод завершился бы довольно быстро. – DMan

+7

Это также можно интерпретировать (по общему признанию, бессмысленно) как «Боб зеленое яблоко». – Ferruccio

+0

@Ferruccio: Вы точно показали, почему это было бы чревато неприятностями ... и это было просто с примером текста, размещенного в этом вопросе. Были бы реальные примеры, которые * имели смысл, но все же были неправильными. –

ответ

1

Решение этой проблемы намного сложнее, чем все, что вы найдете в рамках. Обратите внимание, что даже в вашем примере есть и другие «решения»: «Боб чайное зеленое яблоко» для одного.

Очень наивный (и не очень функциональный) подход может заключаться в использовании проверки орфографии, чтобы попытаться изолировать одно «настоящее слово» за раз в строке; конечно, в этом примере это будет работать только потому, что «Боб» оказывается английским словом.

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

Редактировать: в ответ на ваши изменения, вероятно, потребуется меньше усилий, чтобы запустить какой-либо инструмент OCR в PDF-файле и исправить его вывод, чем просто исправить то, что эта система могла бы вам дать, не говоря уже о программе

+0

Это также может быть «Бобы чай ... », который является довольно популярным напитком, который действительно поступает в яблочные ароматы, поэтому ev en сложный анализ того, как часто возникают фразы и в каких контекстах могут быть сброшены. – Chuck

2

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

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

Псевдо-код будет выглядеть примерно так:

FindWords(vector<Sentence> sentences, Sentence s, Word w, Letters l) 
{ 
    if (l.empty() and w.empty()) 
     add s to sentences; 
     return; 
    if (l.empty()) 
     return; 
    add first letter from l to w; 
    if w in dictionary 
    { 
     add w to s; 
     FindWords(sentences, s, empty word, l) 
     remove w from s 
    } 
    FindWords(sentences, s, w, l) 
    put last letter from w back onto l 
} 

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

0

Я реализовал решение, код доступна на код проекта:

http://www.codeproject.com/Tips/704003/How-to-add-spaces-between-spaceless-strings

Моя идея состояла в том, чтобы приоритеты результатов, которые используют большую часть символов (желательно все из них), то в пользу тех, с самые длинные слова, потому что слова длиной 2-3 или 4 символа часто могут возникнуть случайно из оставшихся символов.В большинстве случаев это обеспечивает правильное решение.

Чтобы найти все возможные перестановки, я использовал рекурсию. Код довольно быстр даже с большими словарями (проверено на 50 000 слов).

+0

Ссылка только ответы не приветствуются в нашем сообществе. Добавьте соответствующий код здесь – FallenAngel

Смежные вопросы