4

私はかなりの量の SO に潜んでいて、かなりの量の検索と読み取りを行ってきましたが、プログラミング全般の初心者であることも告白しなければなりません。私は学びながら学ぼうとしているので、Python の NLTK で遊んでいます。以下のスクリプトでは、マルチスクリーン出力の最初の画面となるものだけを記述することを除いて、すべてを機能させることができます。少なくとも、それが私が考えている方法です。

スクリプトは次のとおりです。

#! /usr/bin/env python

import nltk

# First we have to open and read the file:

thefile = open('all_no_id.txt')
raw = thefile.read()

# Second we have to process it with nltk functions to do what we want

tokens = nltk.wordpunct_tokenize(raw)
text = nltk.Text(tokens)

# Now we can actually do stuff with it:

concord = text.concordance("cultural")

# Now to save this to a file

fileconcord = open('ccord-cultural.txt', 'w')
fileconcord.writelines(concord)
fileconcord.close()

出力ファイルの先頭は次のとおりです。

Building index...
Displaying 25 of 530 matches:
y .   The Baobab Tree : Stories of Cultural Continuity The continuity evident 
 regardless of ethnicity , and the cultural legacy of Africa as well . This Af

530 件の一致全体をファイルに書き込むために、ここで何が欠けていますか?

4

2 に答える 2

5

text.concordance(self, word, width=79, lines=25)manualに従って他のパラメーターがあるようです。

コンコーダンスインデックスのサイズを抽出する方法はありませんが、コンコーダンス印刷コードにはこの部分があるようです: 、したがって、最後の引数としてlines = min(lines, len(offsets))単純に渡すことができます:sys.maxint

concord = text.concordance("cultural", 75, sys.maxint)

追加した:

元のコードを今見ても、以前は機能していた方法がわかりません。text.concordance何も返しませんが、すべてをstdoutusingに出力しますprint。したがって、簡単なオプションは、次のように stdout をファイルにリダイレクトすることです。

import sys

....

# Open the file
fileconcord = open('ccord-cultural.txt', 'w')
# Save old stdout stream
tmpout = sys.stdout
# Redirect all "print" calls to that file
sys.stdout = fileconcord
# Init the method
text.concordance("cultural", 200, sys.maxint)
# Close file
fileconcord.close()
# Reset stdout in case you need something else to print
sys.stdout = tmpout

別のオプションは、それぞれのクラスを直接使用し、テキスト ラッパーを省略することです。ここからビットをコピーして、ここからビットと組み合わせるだけで完了です。

于 2012-06-15T03:49:21.707 に答える
2

アップデート:

これは、ntlk ユーザーグループのオプション ファイルに text.concordance 出力を書き込む ことがわかりました。それは2010年のもので、次のように述べています。

Text クラスのドキュメントには次のように書かれています。代わりに、適切な分析関数またはクラスを直接使用してください。」

それ以降、パッケージに何も変更がない場合は、これが問題の原因である可能性があります。

- - 以前 - -

writelines()を使用してファイルに書き込むことに問題はありません。

file.writelines(シーケンス)

文字列のシーケンスをファイルに書き込みます。シーケンスは、文字列 (通常は文字列のリスト) を生成する任意の反復可能なオブジェクトにすることができます。戻り値はありません。(名前は readlines() と一致するように意図されています 。writelines() は行区切りを追加しません。)

イタリック体の部分に注意してください。別のエディターで出力ファイルを調べましたか? おそらくデータはそこにありますが、行末セパレータがないために正しくレンダリングされていませんか?

この部分が、出力したいデータを生成していると確信していますか?

 concord = text.concordance("cultural")

私はに慣れていないnltkので、問題の考えられる原因を排除する一環として尋ねているだけです。

于 2012-06-15T03:06:39.740 に答える