Page 1 of 1

How to make this simple script work?

Posted: Sun Jul 22, 2007 2:17 am
by Timothy
Field "wordList" contains a list of the 100 most commonly used words in english, one word per line.

Field "scene" contains text I want to summarize.

Field "test" is the destination field.

This script works, except it replaces strings in field "scene." I want to replace words in field "scene." Many commonly used English words are also little parts of bigger words.

I tried the replaceText command instead. It's commented out. I'm not sure if that's what replaceText is supposed to do. (As I've complained before, the documentation is way too terse for novices like me!)

If replaceText is the right command, maybe I just got the syntax wrong.

Code: Select all

on mouseUp
  Ask "Enter the intensity of summary you want (an integer from 10 to 99)"
  put it into intensity
  put field "scene" into whataVar
  repeat with i = 1 to intensity
    if the shiftKey is down then
      exit repeat
    end if
    put line i of card field "wordlist" into tNum
    replace tnum with empty in whatavar
    --replaceText(whataVar,tnum,empty) 
  end repeat
  put whataVar into field "test" 
end mouseUp

Please advise.

Thanks in advance,


Tim

Posted: Sun Jul 22, 2007 3:00 am
by xApple

Code: Select all

on mouseUp 
  Ask "Enter the intensity of summary you want (an integer from 10 to 99)" 
  put it into intensity 
  put field "scene" into whataVar 
  repeat with i = 1 to intensity 
    if the shiftKey is down then exit repeat 
    put line i of card field "wordlist" into tNum
    repeat with w = 1 to the number of words of whataVar
       if word w of whataVar is tNum then delete word w of whataVar 
    end repeat
  end repeat 
  put whataVar into field "test" 
end mouseUp
should do it. Written on the spot and untested.
Cheers.

Posted: Sun Jul 22, 2007 9:01 pm
by Timothy
Thank you, xApple.

That works, but it's hopelessly slow. Field "scene" contains 2000 words. Ultimately, this script is intended to summarize hundreds of fields containing from a few hundred to a few thousand words each. My computer isn't exactly a screamer, but this script might be too slow even for a faster machine.

That's why I was trying to use the "replace" command. It seems quite fast.
Setting lockmessages and lockscreen to true speeds it up some, but not enhough.

Is there another, faster way to do what I want to do?

Thanks,


Tim

P.S.

For onlookers, there might be a problem with

Code: Select all

 repeat with w = 1 to the number of words of whataVar
       if word w of whataVar is tNum then delete word w of whataVar 
deleting word w of whatavar changes the number of words in whataVar

There are easy ways to fix this problem

I think the way I usually deal with that is

repeat with w = the number of words in whatavar down to 1

The P.S. is also written on the spot and untested

Posted: Sun Jul 22, 2007 9:13 pm
by Timothy
Followup to my previous message...

A bit more testing reveals another small problem with the suggested script.

Word w of whatavar sometimes includes a punctuation mark. E.g., "I," without the quotation marks.

I could figure out slow and clumsy ways to exclude the punctuation marks. What about a fast and elegant way?

Thanks again,


Tim

It works fast and correctly now

Posted: Mon Jul 23, 2007 2:01 am
by Timothy
I guess I fixed it myself. This script seems to work correctly. It takes three or four seconds on my 500 mhz G3 laptop when there are about 2000 words in field "scene"

I added "I'm" "It's" and "I'll" to the front of the list of commonly used English words. Maybe contractions aren't normally included, though they seem common.

Deleting the 25 most common English words, plus those extra three reduces field "scene" to 1300 words. Deleting the 99 most common words, plus the three, reduces field "scene" to 930 words.

FWIW, here's the successful script.

Code: Select all

on mouseUp
  Ask "Enter the intensity of summary you want (an integer from 10 to 99)"
  put it into intensity
  set lockmessages to true
  set lockscreen to true
  put field "scene" into whataVar
  repeat with i = 1 to intensity
    if the shiftKey is down then exit repeat
    put line i of card field "wordlist" after wordListVar
  end repeat
  repeat with w = the number of words in whataVar down to 1
    if the shiftKey is down then exit repeat
    if the charToNum of last char of word w of whataVar < 44 then delete last char of word w of whataVar
    if word w of whataVar is in wordListVar then
      delete word w of whataVar
    end if
    set cursor to busy
  end repeat
  put whataVar into field "test" 
end mouseUp
Using "is in" sped things up considerably. So did putting words to delete into a variable.

Tim

Posted: Mon Jul 23, 2007 3:47 pm
by xApple
Seams like you don't even need our help anymore : )
Yeah, forgetting that deleting a word changes the number of words in the field was stupid ^^

Personnaly I don't see much to speed it up more now...

Posted: Mon Jul 23, 2007 10:00 pm
by Mark
Hi Tim,

Are you looking for something like this?

Code: Select all

on mouseUp
  ask "Enter the intensity of summary you want (an integer from 10 to 99)"
  if it is an integer and it > 9 and it < 99 then
    put summarize(field "scene",line 1 to it of fld "Wordlist") into fld "test"
  else if the result is not cancel then
    beep
  end if
end mouseUp

function summarize theData,theWordlist
  -- change unwanted chars into spaces
  put replaceText(theData,"[" & numToChar(2) & "-" & numToChar(48) & "]"," ") into theData
  -- make word list space delimited only
  put word 1 to -1 of theWordlist into theWordlist
  replace cr with space in theWordlist
  -- prepare regex
  replace space with " | " in theWordlist
  put replaceText(space & theData & space,space & theWordlist & space,space) into theData
  return word 1 to -1 of theData
end summarize
Best,

Mark