Python NLTK:朴素贝叶斯-在何处/如何添加ngrams?

Python NLTK:朴素贝叶斯-在何处/如何添加ngrams?,python,nlp,classification,nltk,sentiment-analysis,Python,Nlp,Classification,Nltk,Sentiment Analysis,我正在tweets 3 labels=pos、neg、neutral上做一个分类任务,为此我在NLTK中使用了朴素贝叶斯。我还想加入ngrams和bigrams。我曾尝试将它们添加到代码中,但似乎没有找到合适的位置。目前看来,无论我在哪里添加bigrams,我都在破坏代码。有人能帮我吗,或者帮我转到一个教程 我的unigrams代码如下。如果您需要有关数据集外观的任何信息,我很乐意提供 import nltk import csv import random import nltk.class

我正在tweets 3 labels=pos、neg、neutral上做一个分类任务,为此我在NLTK中使用了朴素贝叶斯。我还想加入ngrams和bigrams。我曾尝试将它们添加到代码中,但似乎没有找到合适的位置。目前看来,无论我在哪里添加bigrams,我都在破坏代码。有人能帮我吗,或者帮我转到一个教程

我的unigrams代码如下。如果您需要有关数据集外观的任何信息,我很乐意提供

import nltk
import csv
import random 
import nltk.classify.util, nltk.metrics
import codecs
import re, math, collections, itertools
from nltk.corpus import stopwords
from nltk.classify import NaiveBayesClassifier
from nltk.probability import FreqDist, ConditionalFreqDist 
from nltk.util import ngrams
from nltk import bigrams
from nltk.metrics import BigramAssocMeasures
from nltk.collocations import BigramCollocationFinder
from nltk.tokenize import word_tokenize
from nltk.stem.snowball import SnowballStemmer
from nltk.tokenize import WordPunctTokenizer

tokenizer = WordPunctTokenizer()
stemmer = SnowballStemmer("english", ignore_stopwords = True)
stopset = set(stopwords.words('english'))

stopset.add('username')
stopset.add('url')
stopset.add('percentage')
stopset.add('number')
stopset.add('at_user')
stopset.add('AT_USER')
stopset.add('URL')
stopset.add('percentagenumber')


inpTweets = []
##with open('sanders.csv', 'r', 'utf-8') as f:   #input sanders    
##    reader = csv.reader(f, delimiter = ';')    
##    for row in reader: 
##        inpTweets.append((row))
reader = codecs.open('...sanders.csv', 'r', encoding='utf-8-sig') #input classified tweets
for line in reader:
    line = line.rstrip()
    row = line.split(';')
    inpTweets.append((row))    

def processTweet(tweet):
    tweet = tweet.lower()
    tweet = re.sub('((www\.[^\s]+)|(https?://[^\s]+))','URL',tweet)
    tweet = re.sub('@[^\s]+','AT_USER',tweet)
    tweet = re.sub('[\s]+', ' ', tweet)
    tweet = re.sub(r'#([^\s]+)', r'\1', tweet)
    tweet = tweet.strip('\'"')
    return tweet

def replaceTwoOrMore(s):
    #look for 2 or more repetitions of character and replace with the character itself
    pattern = re.compile(r"(.)\1{1,}", re.DOTALL)
    return pattern.sub(r"\1\1", s)


def preprocessing(doc): 
    tokens = tokenizer.tokenize(doc)
    bla = []
    for x in tokens:
        if len(x)>2:
            if x not in stopset:
                val = re.search(r"^[a-zA-Z][a-zA-Z0-9]*$", x)
                if val is not None:
                    x = replaceTwoOrMore(x)
                    x = processTweet(x)
                    x = x.strip('\'"?,.')
                    x = stemmer.stem(x).lower()
                    bla.append(x)
    return bla

xyz = []

for lijn in inpTweets:
    xyz.append((preprocessing (lijn[0]),lijn[1]))
random.shuffle(xyz)

featureList = []
k = 0
while k in range (0, len(xyz)):
    featureList.extend(xyz[k][0])
    k = k + 1

fd = nltk.FreqDist(featureList)
featureList = list(fd.keys())[2000:]

def document_features(doc):    
    features = {}
    document_words = set(doc)
    for word in featureList:
        features['contains(%s)' % word] = (word in document_words)
    return features


featuresets =  nltk.classify.util.apply_features(document_features, xyz)

training_set, test_set = featuresets[2000:], featuresets[:2000]

classifier = nltk.NaiveBayesClassifier.train(training_set)

一个有趣的方法是使用a,它允许您将标记器链接在一起:通过这种方式,您可以训练一个n-gram标记器和一个朴素的Bayes,并将它们链接在一起。

您的代码使用2000个最常见的单词作为分类特征。只需选择要使用的Bigram,并将其转换为document_features中的功能。像“包含狗”这样的功能将像“包含狗”一样工作。

sanders.csv看起来如何?你能给我一个数据片段吗?@alvas sanders文件,当我把它加载到Python中时,也就是说,当我把它加载到inpTweets中时,是一个列表,看起来像这样:[['tweet1','Mountain1'],['tweet2','Mountain2']…]。例如:[为了纪念史蒂夫·乔布斯,用户名是“史蒂夫url”,“中立”,“用户名什么时候更新我在twitter上看不到mac表情符号”,“中立”]。Sanders集合中使用的三个标签是pos、neg和neutralI。我不认为分类器会后退——为什么会后退?从我发布的链接的评论来看:如果标记者无法确定指定标记的标记,则会参考其后退标记者。你仍然在谈论标记者;问题是关于量词。