Archive for the ‘Uncategorized’ Category

IronPython, nltk, DLR and lazy programmers

Saturday, March 13th, 2010

Programmers are notoriously lazy.

They would rather write a super complicated fully automated system to do a mundane task for them, than doing it themselves.

image.axd (550×426)Thus, when I was required to submit a homework assignment using a python toolkit named nltk (used for Natural Language Processing) I decided it was time to put the newly unleashed power of .Net 4 DLR and IronPython 2 to inter-op between the CPython toolkit and the comforts of Visual Studio 2010 and C#.

Because, of course, working in a pyShell was not an option.

After hacking through some missing implementations of various python modules in IronPython, I was able to actually run the python toolkit from within Visual Studio.

But simply running Python in .Net is nothing new.

I wanted to use the new DLR interoperability.

The first thing I encountered was that for some reason, dynamic invocation of members on Python modules was not supported.

So doing this didn’t work:

engine.Execute("import nltk");
var nltk = scope.GetVariable("nltk");
var tokenizer = nltk.tokenize.RegexpTokenizer(@"\w+");

There is an open ticket regarding the issue in IronPython’s CodePlex issue tracker, which should be resolved before the final release.

Well, skipping this minor inconvenience, we move on to instantiating python objects the old way.

engine.Execute(@"tokenizer = nltk.tokenize.RegexpTokenizer('\w+')");
var tokenizer = scope.GetVariable("tokenizer");

Next comes the fun part, we can use the python methods defined in the python objects from within C#, as follows:

var tokens = tokenizer.tokenize(text);

No strings! No python engine! Nada !

Just call a method, with a C# string variable named text, and get the result.

(applause to the C# / IronPython guys comes here …!)

The real trouble starts when we try to do some processing on the list of tokens we just received.

Lets stem the tokens using another dynamic object:

engine.Execute("stemmer = nltk.stem.PorterStemmer()");
var stemmer = scope.GetVariable("stemmer");
tokens = tokens.Select(t => stemmer.stem(t));

Unfortunately extension methods don’t apply to dynamic objects since extension methods are resolved at compile time, and the information required to resolve a method call to an extension method at runtime doesn’t exists.

Then, we can use the extension methods directly right ?

Say:

Enumerable.Select(tokens, t => stemmer.stem(t));

Wrong.

The LinqToObjects extension methods are extremely type safe, relying fully on Generics, and they simply can’t resolve the source and target types from a dynamic object.

So we’ll just convert the list of results to the generic lists of .Net and go back to cool generic-linq-land.

Say:

var tokens = new List<string>(tokenizer.tokenize(text));

Nope.

Generic collections only work on statically typed objects - they don’t even have constructors that accept plain IEnumerable.

On the other hand, the early non-generic collections such as ArrayList are not Linq friendly since Linq was designed relying heavily on implicit generics.

How annoying.

Though there is a small hole that we can slip through:

var tokens = (IEnumerable) tokenizer.tokenize(text);
tokens = tokens.Cast<string>().Select((Func<string, string>)(t=> stemmer.stem(t)));

That is, if we give the CLR a bit of help by suggesting our dynamic object is IEnumerable, we could start using Linq after we cast the entire enumerable to strings and explain that the dynamic lambda expression is actually a function from string to string.

I know this looks like riding a bike with training wheels, and that both pure C# and pure Python would look better than this, but it is a relatively small price to pay considering the enormous gain of inter-oping between a (mostly) static language and a completely dynamic language.

And of course, if we can’t use Linq we can always fall back to looping:

foreach (var item in tokenizer.tokenize(text))
  Console.WriteLine(stemmer.stem(item));

Which works great !

* note: for those who are actually taking the NLP course - this is probably one of the more complicated ways of using nltk, and should only be applied if you really really want to use C#. The most simply way is using Python with a nice editor like PyScripter or any other.

ים לים - מהתיכון לכנרת, דרך ואדיות, כיפות ונחלים

Wednesday, May 13th, 2009

יום 0 (רביע)

הגענו לאזור תל אכזיב בסביבות 16:30. ירדנו ממש בשערי שמורת אכזיב ופנינו לשומר בכניסה להנחיות. הוא הסביר לנו שחלק מהחוף הוא פארק בתשלום, והפנה אותנו לחוף במרחק 15 דקות הליכה משם (חרבת נמל אכזיב) שמתאים להקמת אוהל ולינה. החוף נמצא מעט דרומית לפארק וניתן להגיע אליו ע”י הליכה דרך החורשה, בצמוד לפסי רכבת ישנים עד שמגיעים לכביש שמוביל לחוף.
IMG_0803
החוף עצמו הוא אחד היפים, עם סלעים שיוצרים גלים מרהיבים, חולות שהתאימו לנו להקמת אוהל על קרקע רכה וחופים חוליים לרחצה (אך אלו מגודרים והינם בתשלום). צפונה יש נוף לראש הנקרה.
את הזמן הפנוי עד רדת החשכה בילינו בטבילה בחוף הים, הכנת אוכל, משחק קלפים ובעיקר מנוחה והתאוששות (התחלנו את המסלול אחרי טיול של יומיים באזור חיפה\נהריה\ראש הנקרה).

יום 1 (חמישי)

השקמה ב-6 בבוקר. אחרי ארוחת בוקר קלה הכוללת תה, קפה, לחם לבן פרוס עם ריבה, ותירס משומר, אספנו את הציוד וחזרנו לכביש 4. לפני שהתחלנו את המסלול עצרנו בתחנת דלק כ-100 מטר משם והשלמנו מוצרים שחסרו לנו. מתחנת הדלק התחלנו את המסלול דרך שביל קטן בשיחים הנמצא הישר מעבר לכביש הגישה לתחנה.
הלכנו עם השביל הלבן (שביל לא מסומן) דרך מטעי הבננות עד כביש 70. לקח קצת זמן להפנים את הפרופורציות בין המידות במפה לאלו שבשטח. שביל מטעי הבננות לקח יותר זמן משזה נראה תחילה על המפה, כשעת הליכה. בהצתלבות עם כביש 70 גילינו שער חשמלי, למזלנו כל כמה דקות הגיע רכב שפתח את השער וניצלנו את אחת ההזדמנויות כדי לעבור דרכו. לא בדקנו אבל יתכן שניתן למצוא פרצה כלשהי בגדר לא רחוק מהשער.
IMG_0829 
(בתמונה, ביכשטיין ליד אחד משחרורי המים של מקורות לאורך נחל כזיב מהם ניתן לשתות ולמלא מים)
אחד היעדים שלנו במסלול היה לעבור כמה שיותר מרחק בכל יום, ע”מ להגיע לחוף הכנרת עד היום השלישי בזמן לבטן-גב באור יום, לכן לפעמים בחרנו בפרקטיות על הרפתקנות. בפרט בסוף שביל מטעי הבננות, ויתרנו על לעבור דרך חרבת מנות וחרבת סוגב ועלינו על הכביש לעבדון שהוביל אותנו לסמ”ש (סימון שביל) כמה מטרים לפני הגשר עם נחל כזיב. הלכנו עם הסמ”ש הירוק שהולך בצמוד לנחל אל תוך שמורת נחל כזיב כל הדרך עד המונפורט. בחרנו שלא לעלות למונפורט עצמו ועצרנו לארוחת צהרים בנחל מתחתיו. באזור פגשנו מספר קבוצות טיול של בתי ספר (סימן רע לבאות).

IMG_0849ארוחת הצהריים הייתה מורכבת ממרק ופסטה עם סלט טונה, ופינוק של שוקולד עם אגוזים.
המשכנו עם נחל כזיב והסמ”ש הירוק ושמנו לעצמנו כיעד לצאת מהנחל עם הסמ”ש השחור שעולה לאבירים. בהמשך הנחל הסמ”ש נפסק והנחל, כפי ששמענו, נהיה לא כל כך עביר. הדרך עד הסמ”ש השחור, לעומת הדרך עד המונפורט, נהייתה איטית להחריד עקב נחילים של קבוצות טיולים של בתי ספר ששרצו בנחל ועקב העובדה שקטע הנחל שאחרי המונפורט מכיל מים זורמים, עניין שמסבך את החציה שלו אם מתעקשים לשמור על רגליים יבשות. בעלי סנדלים פתורים מצורך זה. הדבר הטוב שיצא מנחיל הילדים הוא שהשאלנו מאחד החובשים שלהם משחה נגד שפשפת (מצרך חובה לטיולים כאלו), מסתבר גם שנפלנו על אחד שמומחה בתחום והוא סיפר לנו על ספר שהוא כותב - “האשך שננשך”.
ככל שהשעות התקדמו והרגליים התעייפו, העליה בשביל השחור נהייתה פחות ופחות מהנה. זה זמן טוב לציין (לטובת אלו כמוני שלא ידעו זאת עד לפני\בזמן המסלול) כי הצבעים בסימוני השבילים הם בעלי משמעות של דרגות קושי, החל מירוק (קל), דרך כחול (בינוני), אדום (קשה) ושחור (קשה מאד). הטיפוס לאבירים היה קשה. אולי אף יותר עקב הניגוד אל מול המסלול הירוק בו הלכנו כל היום. כשהגענו מותשים לסוף המסלול השחור, היו ברורים כבר שני דברים – א. שלושתנו לא נמצאים באותה רמת כושר - ביכשטיין הוביל את הדרך בקלות מחרידה. ב. נותרו לנו פחות משעתיים של אור יום ועדיין לא הגענו ליעד שלנו – גשר אלקוש.

IMG_0886 יכולנו לעצור ולהעביר את הלילה גם באבירים, אך ע”מ להתקדם כמה שיותר רצינו להגיע ביום הראשון לאלקוש.
בעודנו מתעוששים מהעליה, שאלנו נהג אוטובוס שחיכה לקבוצה שלו, איך כדאי לנו להגיע לאלקוש, האם באמת יש שם תחנת דלק (כפי שצויין במדריכים ברשת, אך לא על המפה) ואיפה אפשר להעביר את הלילה. הוא ספיר לנו שבצעירותו הוא גם עשה את מסלול ים לים וסיפר לנו בין השאר, איך כדאי ללכת בהמשך הדרך – מאבירים לאלקוש, לעלות דרך נחל נריה לחרבת חממה ומשם להר מירון ולקבר הרשב”י ונחל עמוד עד הכנרת. זה פחות או יותר המסלול שתכננו לעשות ועשינו בסופו של דבר. הוא גם הציע לנו שנתפוס טרמפ עם האוטבוס שלו עד לגשר אלקוש, כיוון ואין מסלול מעניין מאיפה שהיינו, ליד אבירים, עד גשר אלקוש פרט להליכה בכבישים. התלבטנו והתחבטנו, ולבסוף החלטנו שלא נותר לנו מספיק אור יום כדי להגיע לאלקוש ברגל והסכמנו להצעה. האוטוס עימו נסענו היה של חברה מבית ספר דתי שעשו טיול של יומיים באזור, והיו כבר בדרך הבייתה.

IMG_0887 אחרי נסיעה של כמה דקות הגענו לגשר אלקוש (או אם תרצו, גשר חורפייש), ולהפתעתנו תחנת הדלק אכן הייתה שם, על אף שאיננה מצויינת במפה. הצתיידנו במצרכים, בעיקר פינוקים לערב, ויצאנו לחפש מקום להקים בו אוהל. נהג האוטובוס הנחה אותנו על המפה ברדיוס דיוק של כק”מ לאזור מומלץ לחנות בו, כחצי ק”מ מערבית-צפונית לגשר, בהמשך הכביש ובמעלה הגבעות. יצאנו לחפש את האזור המומלץ וכחצי שעה מאוחר יותר מצאנו את עצמנו בשביל לא מסומן, בסבך של שיחים דוקרניים, מפוצלים, עם שמש שקועה, פחות מחצי שעת אור יום נותרת וללא סימן לאזור אותו חיפשנו. אחרי שמצאנו את ביכשטיין והתאפסנו על עצמנו ירדנו מהגבעה והתמקנו הישר בתחילת המסלול הירוק שמתחיל ליד גשר אלקוש, בדיוק איפה שנדרשו להתחיל את המסלול ביום למחרת. עם שארית האור שנותר אספנו עצים למדורה, הקמנו אוהל ובילינו את הערב בהכנת ארוחת ערב (מרק, פירה עם רוטב צ’ילי ותירס), פטפוטים ובהיה באש הבוערת ובכוכבים. ליוו אותנו כל הערב והלילה קולות התנים (והזאבים?) ורשרושי הפרות שארבו לנו כעשרה מטרים ליד מאחורי גדר מפרידה.

 


יום 2 (שישי)

tent morning שלמים ובריאים, וללא סימני נשיכה גלויים, התעוררנו ליום השני בסביבות שש וחצי. ארזנו את הדברים ואכלנו ארוחת בוקר קלה (תירס\טונה, וקצת תה\קפה עם ריבה).

IMG_0897 החלק הזה של נחל כזיב, העוקף את הר זבול, שורץ בפרות (או כדברי ביכשטיין “אוכל”) המסתובבות חופשי באחו. יותר מפעם אחת הפרות הרגישו נח במידה מטרידה לחסום לנו את שביל המעבר ונאלצנו להתיישב ולחכות שהן יעברו, יתרחקו או כבמקרה אחד, יתיישבו ויבהו בנו, עד שנמשיך בדרכנו, בתקווה מבלי להנגח אל הנחל. את הדרך עד נחל נריה העברנו בדיבורים לוהטים על פוליטיקה, ממשל, מדינה ודת. נראה שהדיון הסוער המריץ את כולנו ועברנו דרך ארוכה בקצב מהיר. שימו לב רק שאתם מקצים מספיק אויר לנשימה ודיבורים, זה לא יעבור בקלות בקטעים קשים יותר כמו נחל נריה, שכולו סמ”ש אדום.
העליה בנחל נריה, היא לא קשה כפי שהיא ארוכה. העליה נגררת ונראה שלא נגמרת, כל סיבוב שלאחריו נראה שהעליה הסתיימה הוא נק’ התחלה לעליה נוספת. בסופו של דבר הגענו לסוף המסלול האדום, לחרבת חממה. פה תמצאו חניון שבו מטיילים רבים ובהם רוכבי אופניים נפגשים ומתחילים את המסלול שלהם, את מחנה גורן בו אפשר למלא מים (לא מצאנו ברז כלשהו באזור) ואת בית ספר שדה מירון. אכלנו Brunch מזורז המורכב, איך לא, מתירס וטונה, והתחלנו את דרכנו אל פסגת הר מירון.
green view העליה להר מירון היא קשה, אם כי לא ארוכה. אחרי שמגיעים למצפה נריה, זה עניין של עוד 15-20 דקות עד שמגיעים למסלול האדום המעגלי, הסובב את פסגת הר מירון. לפסגה עצמה לא ניתן להגיע כיוון וזה אזור צבאי סגור, אך משלושת המצפים הנמצאים על המסלול האדום ניתן לראות נופים כמעט לכל הכיוונים. ראינו את היעד שלנו, הכנרת, מהמצפה המזרחי, והתיישבנו בשולחנות החניון להשלמת ארוחת צהריים. בישלנו פסטה עם רוטב צ’ילי, טיבוליות וסלט טונה (טעים !). בזמן שחיכינו לפסטה שתתבשל (מה שלקח יותר זמן מהצפוי עקב הרוחות ה*קרות* בפסגת הר מירון) פגשנו את דן וג’ני, זוג מטיילים שעשו בדיוק את אותו המסלול כמונו. הם סיפרו לנו שהם לקחו את הרכבת הראשונה לנהריה והתחילו את המסלול בחמישי בבוקר. את העליה להר מירון הם בחרו לעשות בטרמפ על ג’יפ. אחרי חילופי ברכות (וחלווה) התפצלנו, סיימנו את ארוחת הצהריים שלנו ויצאנו לדרך.
הירידה מהר מירון נעשית דרך מסלול כחול (שהולך בחופף עם שביל ישראל), ואז עם השביל הירוק המתפצל ממנו (עדיין שביל ישראל) ובהמשך הדרך עם שביל ישראל שנפרד מהשביל הירוק. שימו לב שההתפצלות בין השביל הכחול והירוק מבלבלת ונעזרנו במצפן כדי להתאפס על הכיוון הנכון. כרבע שעה אל ההליכה השגנו ועקפנו את דן וג’ני, והמשכנו בדרכנו עם שביל ישראל, כאשר היעד שלנו ושלהם – להגיע לקבר רבי שמעון, לפני החשכה. בירידה מהר מירון, כרבע שעה לפני שהגענו לקבר הרשב”י, פגשנו את ז’קלין, בחורה גרמניה בשנות ה-20, עם שיער בוהק, עיניים כחולות ומבטא אנגלי מקסים שמטיילת בארצנו היפה.
IMG_0965 
העליה לקבר הרשב”י משביל ישראל נעשית דרך שביל שחור קצר, אך תלול מאד, שהוביל אותנו אל מבוך של אוהלים שנפרשו באזור לקראת השבת ולכבוד יום מותו של הרשב”י ב-ל”ג בעומר. אחרי שמצאנו פינה נטויה להקים עליה אוהל, אודי וביכשטיין התארגנו לקראת קבלת השבת בזמן שאני ניצלתי את הדקות האחרונות שלפני כניסת השבת לצילום מספר תמונות (מה שלא התקבל בברכה יתרה). לאחר שכולנו חזרנו לאוהל החלטנו לוותר על ארוחת הערב, ללכת לישון מוקדם ולנוח היטב לקראת היום הארוך שמחכה לנו מחר, בגיחה לכנרת. התפנקנו בכל זאת בנתחי אננס משומר שהיה להם טעם האננס הטוב ביותר שאכלתי עד היום.

יום 3 (שבת)

IMG_10345 וחצי בבוקר, לצלילי השעון המעורר בפלאפון אנחנו קמים ומתארגנים כמה שיותר מהר ובשקט, ע”מ לא להפריע להמון החרדי הישן באוהליו סביבנו. אחרי שמילאנו מים וירדנו מהגבעה, עצרנו לארוחת בוקר ליד שולחנות עץ הנמצאים כמה דקות בהמשך הדרך. לידם מצאנו את דן וג’ני בדיוק מתעוררים. הם סיפרו לנו שהגיעו לאזור הקבר כחצי שעה אחרינו, כבר לקראת החשכה. אחרי ארוחת הבוקר המורכבת מאיך לא, תירס, טונה וריבה עם חתיכות אחרונות של לחם שהשאלנו מדן, המשכנו עם שביל ישראל אל תוך נחל עמוד. שימו לב שהתעלה שעוברת מתחת לכביש 89 (בדיוק על עיקול ה-U הנטוי) היא סמויה וקל מאד לפספס אותה. התחלנו ללכת על הכביש, ורק אחרי שהבנו שטעינו וחזרנו אחורה לאזור השולחנות מצאנו את ההתחלה של השביל המסומן, ממש בתוך הנחל.

המסלול של נחל עמוד עליון מורכב ברובו מדרך טרשים, עם המון עליות וירידות מגדה אחת אל השניה, ומעבר מסוכן ליד מצוקים גבוהים. זהו מסלול לא קל בכלל, אך אחד שעברנו בקצב טוב, והגענו לסיומו במפגש עם כביש 85 לקראת השעה 12:00 בצהרים. 
עצרנו לארוחה ולקראת 13:00 המשכנו לנחל עמוד תחתון, אשר בתחילתו מוזרמים בצורה מלאכותית מים, ככל הנראה לטובת הטבע, הצומח, המטיילים והכנרת, שאליה נשפך בסופו של דבר מה שנותר מהזרימה.

IMG_1038בחלק הזה של המסלול, רגלי התחילו להכשיל אותי, בפרט אחרי שחלצתי את נעלי כדי לעבור דרך המים הזורמים מתחת לגשר כביש 85 וגיליתי את היבלות שהתפתחו להן בשקט בימים האחרונים. עקב כך הדרך מכאן והילך נהייתה מייסרת וקשה הרבה מעבר לנדרש. נחל עמוד תחתון לכשעצמו הוא לא קטע קשה, הוא מורכב בעיקר מהליכה על גדות הנחל, עם עשרות מעברים מגדה לגדה דרך המים הזורמים, לפעמים עם קטעי הליכה שעדיף לעשות אותם עם סנדלים בתוך המים, יחפים, עם נעליים אטומות למים או עם נעלי הליכה שלא אכפת לכם להספיג לחלוטין במים, כך או כך בקטע זה הרגליים שלכם ירטבו.

IMG_1041 רוב המסלול בנחל עמוד עליון ותחתון עובר בצל. הקושי במסלול זה היה בעיקר האורך שלו (מאד ארוך) ובתזמון שלו, כהחלק הכמעט האחרון במסלול, המצב של הרגליים שלכם הוא שקובע אם תעברו אותו בקלות או ביסורים. רצוי לשמור על הרגליים כמה שניתן, יבשות, מאוררות, ואם יש לכם קרם כלשהו שישמור עליהן מיבלות – השתמשו בו, זה יכול לעשות את ההבדל בין סיום המסלול בהליכה או בפינוי.

IMG_1054בדרך קיבלנו קצת עזרה מקבוצת מטיילות שנחו על יד הנחל והתעקשו להאכיל אותנו, ההתנגדות שלנו לא החזיקה זמן רב והן פינקו אותנו בחטיפים, מלפופונים חמוצים, פירות ועוגה.
אחרי שסיימנו את ההליכה הארוכה של נחל עמוד, הגענו לעמוד האבן שעל שמו נקרא הנחל ולמפגש עם כביש חוקוק. את ההחלטה לגבי המשך המסלול דחינו עד אשר נגיע לנק’ זו, ובנק’ זו החלטנו שמצב הרגליים שלי ושל אודי ולחץ הכנרת של ביכשטיין מחייב אותנו לקצר את המסלול לדו”כ הישיר ביותר האפשרי לכנרת, משמע על הכביש מחוקוק לסובב כנרת.

IMG_1058 למרות הברכיים החשופות, לא השגנו טרמפ והלכנו את קטע הכביש ברגל במשך כשעה. בתחילתו הכביש הולך בעליה, אך לאחר שעוברים את הגבעה נפרש לעינינו הנוף המרהיב לכנרת, וכל הדרך למטה אנחנו הולכים בהשראת היעד הסופי שמחכה לנו למטה.
חצינו את כביש 90 ועברנו דרך השבילים בשדה עד לחוף עמוד (נקרא גם חוף חוקוק), שהוא בחלקו חוף שהיה פעם חניון בתשלום אך כשהגענו היה זנוח ופתוח לכל.
IMG_1067
צוהלים ושמחים, טבלנו את רגלינו בכנרת לאות סיום המסלול והתפרקנו על החוף.
מכאן, המסלול שלנו הסתיים, ובעודנו מפנימים את העובדה שבאמת סיימנו, בזמן וללא פינוי, התחלנו לחשוב על הדרך הבייתה.
IMG_1204 
לקחנו אוטובוס לטבריה מתחנת האוטובס הנמצאת בצומת הכביש מחוקוק לכנרת עם כביש 90, ומשם אוטובוס לתל אביב - חזרה לציביליזציה.

תמונות נוספות מהמסלול.


Copyright © 2010 קוצים של פחד. All Rights Reserved.
No computers were harmed in the 0.287 seconds it took to produce this page.

Designed/Developed by Lloyd Armbrust & hot, fresh, coffee.