4

Jep はまだ Python をいじっています。

選択した単語とコンテキストのトピックを見つけるツールである Gensim を試してみることにしました。

そこで、テキストのセクションで単語を見つけて、それと一緒に 20 の単語を抽出し (その特定の単語の前の 10 単語とその特定の単語の後の 10 単語のように)、それを他のそのような抽出と一緒に保存して、Gensim がその上で実行します。

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

混乱している方のために (ここは午前 1 時なので混乱している可能性があります)、例を示します。

それが終わるやいなや、白雪姫がまだ生きていると聞いてとても怒っていたので、彼女のすべての血が彼女の心臓に流れ込みました。「でも今は、彼女を完全に破壊するようなものを作ろうかな」と彼女は考えました。そう言って、彼女は自分が理解した術で毒入りの櫛を作り、変装して年老いた未亡人の姿をとった。彼女は 7 つの丘を越えて 7 人の小人の家に行き、[15] ドアをノックして、「今日は良い商品が売られています!」と叫びました。

単語が白雪姫である場合、この部分を抽出したいと思います。

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

白雪姫の前後に10語。

これが nltk で実行でき、より簡単な場合は、白雪姫が登場する文の前後の文を代わりに取得するのも十分クールです。

誰かが私を助けてくれれば、2つの解決策のうちの1つに満足するでしょう。

これがGensimでもできるなら...そしてその方が簡単なら、私もそれで満足です. したがって、3つの方法のいずれでも問題ありません...頭が真っ白なので、これがどのように行われるかを試してみたいだけです。

4

3 に答える 3

8

このプロセスは、キーワード イン コンテキスト (KWIC)と呼ばれます。

最初のステップは、入力を単語に分割することです。正規表現モジュールを使用してそれを行う方法はたくさんあります。たとえば、 re.splitまたはre.findallを参照してください。

特定の単語を見つけたら、スライスを使用して前後の 10 単語を見つけます。

すべての単語のインデックスを構築するには、maxlen を使用した両端キューがスライディング ウィンドウの実装に便利です。

itertoolsを使用して効率的に行う方法の 1 つを次に示します。

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'))
于 2012-05-11T23:20:20.547 に答える
7
text = """
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 = text.split()

def ans(word):
    for ind, x in enumerate(spl):
       if x.strip(",'\".!") == word:
           break
    return " ".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
于 2012-05-11T23:05:46.340 に答える