<div dir="ltr">Dear Steve,<br>Thank you so much for your help.<br>Actually this is not homework. It&#39;s gonna be used in building a collocation dictionary as part of my dissertation. Please remeber that I&#39;m not a programmer, so many of the terminologies may not be accessible to me.<br>
<br>Thank you also for attracting my attention to the typo<br><br><div class="gmail_quote">On Sat, Aug 16, 2008 at 2:09 PM, Steve Willoughby <span dir="ltr">&lt;<a href="mailto:steve@alchemy.com">steve@alchemy.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="Ih2E3d">On Sat, Aug 16, 2008 at 01:55:36PM -0400, Emad Nawfal (???? ????) wrote:<br>

&gt; Hello Tutors,<br>
&gt; I&#39;m trying to write a small scrip to find collocations using chi squared,<br>
<br>
</div>Minor nit, but the word you&#39;re looking for here is &quot;script&quot;. &nbsp;&quot;Scrip&quot;<br>
is also an English word but means something completely different.<br>
Looking professional in a field includes using the jargon correctly.<br>
<div class="Ih2E3d"><br>
&gt; depending on a fairly big corpus.<br>
&gt; The program below does a good job, but it&#39;s too slow, and I need to process<br>
&gt; something like 50 million words.<br>
&gt; How can I make it run fast?<br>
<br>
</div>How fast is fast enough?<br>
What&#39;s its time now?<br>
Can you identify where it might be slowing down?<br>
<br>
Depending on the order of magnitude of the speedup you&#39;re looking<br>
to achieve, the answer could be very different.<br>
<div class="Ih2E3d"><br>
&gt; # Let&#39;s first get the text and turn into bigrams<br>
&gt; bigrams = []<br>
&gt; infile = file(&quot;corpus.txt&quot;)<br>
&gt; text = infile.read().lower().split()<br>
<br>
</div>This strikes me as needlessly memory-consuming. &nbsp;You might want to<br>
iterate over lines of text instead of sucking the entire file into<br>
a giant string. &nbsp;I&#39;m guessing you want to recognize words next to<br>
one another even if separated by a newline? &nbsp;Be aware of the cost,<br>
though, of passing potentially huge data values around.<br>
<div class="Ih2E3d"><br>
&gt; infile.close()<br>
&gt; for i,v in enumerate(text): # get words and their ranking number<br>
&gt; &nbsp; &nbsp; &nbsp;if i &lt; len(text)-1: # This guarntees that the list index is not out of<br>
&gt; range<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bigram = v, text[i+1] # each word and the two succeding words<br>
&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bigrams.append(bigram)<br>
<br>
</div>Why don&#39;t you trust enumerate&#39;s i values, out of curiosity?<br>
<br>
It seems to me if you think of what you&#39;re collecting here<br>
you could do some calculating on the fly as you look through<br>
the list of words and wouldn&#39;t need to be building these<br>
lists and then going back through them.<br>
<br>
I&#39;m trying to give some vague help without doing the work for you<br>
because we don&#39;t do homework exercises for people :)<br>
<font color="#888888"><br>
--<br>
Steve Willoughby &nbsp; &nbsp;| &nbsp;Using billion-dollar satellites<br>
<a href="mailto:steve@alchemy.com">steve@alchemy.com</a> &nbsp; | &nbsp;to hunt for Tupperware.<br>
</font></blockquote></div><br><br clear="all"><br>-- <br>لا أعرف مظلوما تواطأ الناس علي هضمه ولا زهدوا في إنصافه كالحقيقة.....محمد الغزالي<br>&quot;No victim has ever been more repressed and alienated than the truth&quot;<br>
<br>Emad Soliman Nawfal<br>Indiana University, Bloomington<br><a href="http://emnawfal.googlepages.com">http://emnawfal.googlepages.com</a><br>--------------------------------------------------------<br>
</div>