3

私にはコーパスがあり、単語があります。コーパス内の単語の出現ごとに、その単語の前の k 単語と後の k 単語を含むリストを取得したいと考えています。私はこれをアルゴリズム的に問題なく実行していますが (以下を参照)、NLTK が私が見逃したニーズに対応する機能を提供しているかどうか疑問に思いました。

def sized_context(word_index, window_radius, corpus):
    """ Returns a list containing the window_size amount of words to the left
    and to the right of word_index, not including the word at word_index.
    """

    max_length = len(corpus)

    left_border = word_index - window_radius
    left_border = 0 if word_index - window_radius < 0 else left_border

    right_border = word_index + 1 + window_radius
    right_border = max_length if right_border > max_length else right_border

    return corpus[left_border:word_index] + corpus[word_index+1: right_border]
4

2 に答える 2

3

これを行う最も簡単な nltk 風の方法は、nltk.ngrams().

words = nltk.corpus.brown.words()
k = 5
for ngram in nltk.ngrams(words, 2*k+1, pad_left=True, pad_right=True, pad_symbol=" "):
    if ngram[k+1].lower() == "settle":
        print(" ".join(ngram))

pad_leftpad_rightすべての単語が見られるようにします。これは、コンコーダンスが複数の文にまたがらないようにする場合に重要です (したがって、多くの境界ケース)。

ウィンドウサイズの句読点を無視したい場合は、スキャンする前にそれを取り除くことができます:

words = (w for w in nltk.corpus.brown.words() if re.search(r"\w", w))
于 2015-06-08T16:42:08.940 に答える