私は次のコードを持っています
import nltk, os, json, csv, string, cPickle
from scipy.stats import scoreatpercentile
lmtzr = nltk.stem.wordnet.WordNetLemmatizer()
def sanitize(wordList):
answer = [Word.translate(None, string.punctuation) for Word in wordList]
answer = [lmtzr.lemmatize(Word.lower()) for Word in answer]
return answer
words = []
for filename in json_list:
words.extend([sanitize(nltk.Word_tokenize(' '.join([Tweet['text']
for Tweet in json.load(open(filename,READ))])))])
私が書いたとき、私は別のtesting.pyファイルで2-4行目をテストしました
import nltk, os, json, csv, string, cPickle
from scipy.stats import scoreatpercentile
wordList= ['\'the', 'the', '"the']
print wordList
wordList2 = [Word.translate(None, string.punctuation) for Word in wordList]
print wordList2
answer = [lmtzr.lemmatize(Word.lower()) for Word in wordList2]
print answer
freq = nltk.FreqDist(wordList2)
print freq
コマンドプロンプトは['the'、 'the'、 'the']を返します。これは私が望んだものです(句読点を削除します)。
ただし、まったく同じコードを別のファイルに配置すると、pythonは、
File "foo.py", line 8, in <module>
for Tweet in json.load(open(filename, READ))])))])
File "foo.py", line 2, in sanitize
answer = [Word.translate(None, string.punctuation) for Word in wordList]
TypeError: translate() takes exactly one argument (2 given)
json_listは、すべてのファイルパスのリストです(このリストが有効であることを印刷して確認しました)。別のファイルでテストするだけですべてが完全に機能するため、このTypeErrorについて混乱しています。
Python 3のPython 2で行っていたのと同じことを行うことだけが目的であれば、句読点と数字を捨てるためにPython 2.0で行っていたことです。 :
text = text.translate(None, string.punctuation)
text = text.translate(None, '1234567890')
これは、私のPython 3.0と同等のものです。
text = text.translate(str.maketrans('','',string.punctuation))
text = text.translate(str.maketrans('','','1234567890'))
基本的には、「何も何も変換しない」(最初の2つのパラメーター)と言い、句読点や数字をNone
に変換します(つまり、それらを削除します)。
あなたの問題はstr.translate
とunicode.translate
の違いに関係していると思います(これらはPython 2とPython 3のstr.translate
の違いでもあります)。テストコードが通常の8ビットunicode
インスタンスを使用している間に、元のコードがstr
インスタンスを送信していると思われます。
str
はテキストデータを処理するためのはるかに優れたタイプであるため、Unicode文字列を通常のunicode
インスタンスに変換することはお勧めしません(そしてそれは未来です!)。代わりに、新しいunicode.translate
構文に適応する必要があります。通常のstr.translate
(Python 2)では、オプションのdeletechars
引数を渡すことができ、その中の文字は文字列から削除されます。 unicode.translate
(およびPython 3のstr.translate
)の場合、追加の引数は許可されなくなりましたが、値からNone
を含む変換テーブルエントリが出力から削除されます。
問題を解決するには、適切な変換テーブルを作成する必要があります。変換テーブルは、Unicodeの序数(つまり、int
s)から序数、文字列、またはNone
への辞書マッピングです。それらを作成するためのヘルパー関数は、Python 2にstring.maketrans
(およびPython 3としてstr
タイプのメソッド)として存在しますが、Python 2バージョンでは、気になるケースを処理しません(None
値をテーブルに入れます)。 {ord(c): None for c in string.punctuation}
などの適切な辞書を自分で作成できます。
これが翻訳の仕組みです:
yourstring.translate(str.maketrans(fromstr, tostr, deletestr))
fromstr
の文字をtostr
の同じ位置の文字に置き換え、deletestr
にあるすべての文字を削除します。 fromstr
およびtostr
は空の文字列にすることができ、deletestr
パラメーターは省略できます。
例:
str="preetideepak12345aeiou"
>>> str.translate(str.maketrans('abcde','12345','p'))
出力:
'r55ti4551k1234515iou'
ここに:
a is translated to 1
b is translated to 2
c is translated to 3 and so on
and p is deleted from string.
Python 3.0:
_text = text.translate(str.maketrans('','','1234567890'))
_
static str.maketrans(x [、y [、z]])
この静的メソッドは、
str.translate()
に使用可能な変換テーブルを返します。
引数が1つしかない場合、Unicodeの序数(整数)または文字(長さ1の文字列)をUnicodeの序数、文字列(任意の長さ)またはNone
にマッピングする辞書でなければなりません。その後、文字キーは序数に変換されます。
2つの引数がある場合、それらは等しい長さの文字列である必要があり、結果の辞書では、x
の各文字はy
の同じ位置の文字にマップされます。 3番目の引数がある場合、文字列でなければならず、その文字は結果のNone
にマップされます。
https://docs.python.org/3/library/stdtypes.html?highlight=maketrans#str.maketrans