web-dev-qa-db-ja.com

str.translateはTypeErrorを返します-Translateは1つの引数(2つ指定)を受け取り、Python 2

私は次のコードを持っています

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について混乱しています。

48
carebear

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に変換します(つまり、それらを削除します)。

82
drchuck

あなたの問題はstr.translateunicode.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の序数(つまり、ints)から序数、文字列、またはNoneへの辞書マッピングです。それらを作成するためのヘルパー関数は、Python 2にstring.maketrans(およびPython 3としてstrタイプのメソッド)として存在しますが、Python 2バージョンでは、気になるケースを処理しません(None値をテーブルに入れます)。 {ord(c): None for c in string.punctuation}などの適切な辞書を自分で作成できます。

69
Blckknght

これが翻訳の仕組みです:

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.
6
Preeti Duhan

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

4
ChuQuan