10

私はPythonを初めて使用し、助けが必要です!私はPythonNLTKテキスト分類で練習していました。これが私が http://www.laurentluce.com/posts/twitter-sentiment-analysis-using-python-and-nltk/で練習しているコード例です

私はこれを試しました

from nltk import bigrams
from nltk.probability import ELEProbDist, FreqDist
from nltk import NaiveBayesClassifier
from collections import defaultdict

train_samples = {}

with file ('positive.txt', 'rt') as f:
   for line in f.readlines():
       train_samples[line]='pos'

with file ('negative.txt', 'rt') as d:
   for line in d.readlines():
       train_samples[line]='neg'

f=open("test.txt", "r")
test_samples=f.readlines()

def bigramReturner(text):
    tweetString = text.lower()
    bigramFeatureVector = {}
    for item in bigrams(tweetString.split()):
        bigramFeatureVector.append(' '.join(item))
    return bigramFeatureVector

def get_labeled_features(samples):
    word_freqs = {}
    for text, label in train_samples.items():
        tokens = text.split()
        for token in tokens:
            if token not in word_freqs:
                word_freqs[token] = {'pos': 0, 'neg': 0}
            word_freqs[token][label] += 1
    return word_freqs


def get_label_probdist(labeled_features):
    label_fd = FreqDist()
    for item,counts in labeled_features.items():
        for label in ['neg','pos']:
            if counts[label] > 0:
                label_fd.inc(label)
    label_probdist = ELEProbDist(label_fd)
    return label_probdist


def get_feature_probdist(labeled_features):
    feature_freqdist = defaultdict(FreqDist)
    feature_values = defaultdict(set)
    num_samples = len(train_samples) / 2
    for token, counts in labeled_features.items():
        for label in ['neg','pos']:
            feature_freqdist[label, token].inc(True, count=counts[label])
            feature_freqdist[label, token].inc(None, num_samples - counts[label])
            feature_values[token].add(None)
            feature_values[token].add(True)
    for item in feature_freqdist.items():
        print item[0],item[1]
    feature_probdist = {}
    for ((label, fname), freqdist) in feature_freqdist.items():
        probdist = ELEProbDist(freqdist, bins=len(feature_values[fname]))
        feature_probdist[label,fname] = probdist
    return feature_probdist



labeled_features = get_labeled_features(train_samples)

label_probdist = get_label_probdist(labeled_features)

feature_probdist = get_feature_probdist(labeled_features)

classifier = NaiveBayesClassifier(label_probdist, feature_probdist)

for sample in test_samples:
    print "%s | %s" % (sample, classifier.classify(bigramReturner(sample)))

しかし、このエラーが発生するのはなぜですか?

    Traceback (most recent call last):
  File "C:\python\naive_test.py", line 76, in <module>
    print "%s | %s" % (sample, classifier.classify(bigramReturner(sample)))
  File "C:\python\naive_test.py", line 23, in bigramReturner
    bigramFeatureVector.append(' '.join(item))
AttributeError: 'dict' object has no attribute 'append'
4

1 に答える 1

16

バイグラム特徴ベクトルは、ユニグラム特徴ベクトルとまったく同じ原理に従います。したがって、あなたが言及したチュートリアルと同じように、使用するドキュメントのいずれかにバイグラム機能が存在するかどうかを確認する必要があります。

バイグラムの特徴とその抽出方法については、以下のコードを記述しました。それらを採用するだけで、チュートリアルの変数「ツイート」を変更できます。

import nltk
text = "Hi, I want to get the bigram list of this string"
for item in nltk.bigrams (text.split()): print ' '.join(item)

それらを印刷する代わりに、「ツイート」リストに追加するだけで、準備完了です。これが十分に役立つことを願っています。それ以外の場合は、まだ問題がある場合はお知らせください。

感情分析などのアプリケーションでは、一部の研究者は単語をトークン化して句読点を削除する傾向があり、他の研究者はそうではないことに注意してください。経験から、句読点を削除しない場合、ナイーブベイズはほぼ同じように機能しますが、SVMの精度は低下することがわかっています。このようなものをいじって、データセットで何がうまく機能するかを判断する必要があるかもしれません。

編集1:

「Pythonによる自然言語処理」という本がありますので、お勧めします。バイグラムの例といくつかの演習が含まれています。しかし、それがなくてもこのケースを解決できると思います。バイグラムの特徴を選択する背後にある考え方は、単語Aがコーパスに表示され、その後に単語Bが表示される確率を知りたいということです。

「私はトラックを運転します」

単語ユニグラム機能はこれらの4つの単語のそれぞれであり、単語バイグラム機能は次のようになります。

[「私は運転する」、「運転する」、「トラック」]

次に、これら3つを機能として使用します。したがって、以下のコード関数は、文字列のすべてのバイグラムを。という名前のリストに入れますbigramFeatureVector

def bigramReturner (tweetString):
  tweetString = tweetString.lower()
  tweetString = removePunctuation (tweetString)
  bigramFeatureVector = []
  for item in nltk.bigrams(tweetString.split()):
      bigramFeatureVector.append(' '.join(item))
  return bigramFeatureVector

removePunctuation独自の関数を作成する必要があることに注意してください。上記の関数の出力として得られるのは、バイグラム特徴ベクトルです。あなたはそれをあなたが言及したチュートリアルでユニグラム特徴ベクトルが扱われるのとまったく同じように扱うでしょう。

于 2012-12-24T21:56:23.290 に答える