Как установить разделители слов?

Руководство пользователя, глава 6.1.5 Фрагмент слова Слово представляет собой строку символов, разделенную пробелом, символом табуляции или возврата или заключенную в двойные кавычки. Можно ли использовать дополнительные разделители слов?

У меня есть следующий фрагмент кода, взятый из Руководства пользователя, глава 6.5.1 «Когда использовать массивы», с. 184

on mouseUp

   --cycle through each word adding each instance to an array
   repeat for each word tWord in field "sample text"
      add 1 to tWordCount[tWord]
   end repeat

   -- combine the array into text
   combine tWordCount using return and comma
   answer tWordCount

end mouseUp

Он подсчитывает количество вхождений каждой словоформы в поле «Образец текста».

Я понимаю, что точки после слов считаются частью слова с настройкой по умолчанию.

Как изменить настройки, чтобы точка (и или запятая) считалась границей слова?


person z--    schedule 17.05.2013    source источник


Ответы (3)


В качестве альтернативы вы можете просто удалить оскорбительные символы перед обработкой. Это можно сделать с помощью функции REPLACE или функции REPLACETEXT. Функция REPLACETEXT может использовать строку соответствия регулярного выражения, но работает медленнее, чем функция REPLACE. Поэтому здесь я использую функцию REPLACE.

on mouseUp
   put field "sample" into twords
   --remove all trailing puncuation and quotes
   replace "." with "" in twords
   replace "," with "" in twords
   replace "?" with "" in twords
   replace ";" with "" in twords
   replace ":" with "" in twords
   replace quote with "" in twords
   --hyphenated words need to be seperated?
   replace "-" with " " in twords

   repeat for each word tword in twords
       add 1 to twordcount[tword]
   end repeat
   combine twordcount using return and comma
  answer twordcount
end mouseUp
person James Hale    schedule 18.05.2013
comment
Тоже интересное решение. Интересно, кто из них быстрее. - person z--; 18.05.2013

Я думаю, вы задаете вопрос о разделителях. Некоторые разделители встроены:

места для слов,

запятые для предметов,

возврат (CR) для строк.

Возможность создавать собственное свойство-разделитель (itemDelimiter) — мощная функция языка, относящаяся к «элементам». Вы можете установить это для любого отдельного символа:

установите для itemDelimiter значение "C"

ответьте на количество элементов в "XXCXXCXX" -- назовите эту строку "theText"

Результат будет "3"

Как указывали другие, метод замены одной строки на другую обеспечивает огромный контроль над пользовательским разбором текста:

замените «C» пробелом в тексте

дает "ХХ ХХ ХХ"

Крэйг Ньюман

person dunbarx    schedule 19.05.2013
comment
Да, для элементов я могу установить разделители, и это очень удобно. Однако для слов он установлен на пробел, табуляцию или возврат. А это значит, что точка, следующая сразу за словом, считается частью слова. Мой вопрос о самом простом способе получить эффективные слова, то есть словоформы без включенной пунктуации. - person z--; 20.05.2013

Как сказано в руководстве пользователя в главе 6.1.5 Фрагмент слова Слово — это строка символов, разделенная пробелом, символом табуляции или возврата или заключенная в двойные кавычки.

Есть itemDelimiter, но нет wordDelimiter.

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

Это можно сделать с помощью функции effectiveWord.

function effectiveWord aWord
   put last char of aWord into it
   if it is "." then delete last char of aWord
   if it is "," then delete last char of aWord
   if it is ":" then delete last char of aWord
   if it is ";" then delete last char of aWord
   return aWord
end effectiveWord



on mouseUp

   --cycle through each word adding each instance to an array
   repeat for each word tWord in field "Sample text"
      add 1 to tWordCount[effectiveWord(tWord)]
   end repeat

   -- combine the array into text
   combine tWordCount using return and comma
   answer tWordCount

end mouseUp
person z--    schedule 18.05.2013
comment
Вы можете сделать это намного эффективнее с помощью регулярного выражения: replaceText(myVar,[^a-zA-Z0-9],empty). - person Mark; 18.05.2013
comment
Тип текста, который вам нужен, может быть легко преобразован в текст ASCII. - person Mark; 20.05.2013