2012-05-11 14 views
3

JepはまだPythonで遊んでいます。単語とセクション(Python)からさらに20単語を抽出する

私は、選択された単語&のトピックを見つけるためのツールGensimを試してみることにしました。

私はどのようにテキストのセクションで単語を見つけ、それと一緒に20単語を抽出するのだろうと思った(そのスペキュラの単語の前の10単語とその特定の単語の後の10単語のように) Gensimを実行することができます。

私にとって難しいと思われることは、選択された単語が見つかったときに前後の単語を10個抽出する方法を見つけることです。私は前にnltkで遊んでいただけで、テキストを単語や文にトークン化するだけで、文章を取得するのは簡単でした。その特定の文の前と後のそれらの言葉または文章を引き続き得ることは、私がどのようにするかを理解することは難しいようです。混乱している人のために

(ここでの午前1時は、私は混乱を招く可能性がある)私は一例でそれを紹介します:できるだけ早くそれが完成していたとして

、すべての彼女の血がために、彼女の心に駆けつけ彼女は は雪白がまだ生きていたと聞いてとても怒っていた。 "しかし、今、" 彼女は自分自身に考えて、 "私は彼女を完全に破棄する何かを作ってくれるでしょう "こうして、彼女は彼女が を理解した後、彼女自身を変装する芸術によって中毒した櫛を作った、古い の未亡人の形を取った。彼女は7つの丘を越えて7人の矮小家の家に行きました。 と[15]ドアをノックして、「今日まで売るために良いお得!

私たちは言葉が白雪姫であると言うなら、私はこの部分が抽出された取得したいと思います:

彼女の心、彼女は白雪姫がまだ生きていたと聞いてとても怒っていたため。 「しかし、今、」 は「

10意志の単語の前にスノーホワイト後、彼女自身に彼女を思った。

また、代わりの文白雪姫の前と後の文を取得するのに十分クールですこれはNLTKで行うことができるかどうかで登場し、簡単です。

私が意味する、誰かが私を助けることができれば私は2つの解決策の一つに満足しなければならない最高の作品何でも。

、これはあまりにもGensimで行うことができれば...それは簡単です、そして私はそれにも満足しています。だから、3つの方法のいずれかがうまくいくでしょう...私はちょうど私の頭が空白なので、これがどのように行われるのか試してみたいと思っています。

答えて

4
strs=""" 
As soon as it had finished, all her blood rushed to her heart, for she was so angry to hear that Snow-White was yet living. "But now," thought she to herself, "will I make something which shall destroy her completely." Thus saying, she made a poisoned comb by arts which she understood, and then, disguising herself, she took the form of an old widow. She went over the seven hills to the house of the seven Dwarfs, and[15] knocking at the door, called out, "Good wares to sell to-day!" 
""" 
spl=strs.split() 

def ans(word): 
    for ind,x in enumerate(spl): 
     if x.strip(",'.!")==word or x.strip(',".!')==word: 
      break  
    print(" ".join(spl[ind-10:ind]+spl[ind:ind+11])) 

ans('Snow-White') 

her heart, for she was so angry to hear that Snow-White was yet living. "But now," thought she to herself, "will 
+0

ありがとう:

ここで効率的にitertoolsを使用して、それを行うための一つの方法です!あなたはそのようなインデックスを見つけることができるか分からなかった。 :) – N00programmer

7

このプロセスはKeyword in Context (KWIC)と呼ばれます。

最初のステップは、入力を単語に分割することです。 regular expressions moduleを使用する方法はたくさんありますが、たとえばre.splitまたはre.findallを参照してください。

特定の単語が見つかったら、スライシングを使用して前の10語と後の10語を検索します。

すべての単語のインデックスを作成するには、maxlenを持つdequeがスライディングウィンドウの実装に便利です。私が探していただけで何

from re import finditer 
from itertools import tee, islice, izip, chain, repeat 

def kwic(text, tgtword, width=10): 
    'Find all occurrences of tgtword and show the surrounding context' 
    matches = (mo.span() for mo in finditer(r"[A-Za-z\'\-]+", text)) 
    padded = chain(repeat((0,0), width), matches, repeat((-1,-1), width)) 
    t1, t2, t3 = tee((padded), 3) 
    t2 = islice(t2, width, None) 
    t3 = islice(t3, 2*width, None) 
    for (start, _), (i, j), (_, stop) in izip(t1, t2, t3): 
     if text[i: j] == tgtword: 
      context = text[start: stop] 
      yield context 

print list(kwic(text, 'Snow-White')) 
+0

うわー、面白い。それでも、私はその特定の単語から10プラスマイナスを取る方法を見つけることを試みていました。 Ashiwaniが示したような意味。これはすべての単語の索引を作っているようですが、「雪白」という言葉だけの文章に興味があり、すべての単語ではなく索引を作成しています。少し混乱して):) – N00programmer

+0

問題はありません。テクニックは "Snow-white"のような単一の単語に対しても機能します。*収量*の直前に* tgtword *テストを含めるように回答を編集しました。答えは元のテキストとの相対的な開始点と終了点を正確に知っているため(句読点やスライス点を失う* str.split *に基づく他の解決策)、句読点を保持するという利点があります。 –

関連する問題