在Python中,有没有一种NLP库中的方法可以合并单词来表示它们是积极的?

ff29svar  于 2023-02-15  发布在  Python
关注(0)|答案(1)|浏览(124)

我已经尝试对此进行调查,但无法找到任何可能的方法来实现我的设想。作为示例,我尝试分组的术语是"No complaints",当查看此单词时,"No"是在 * stopwords *(我已手动从 * stopwords * 中删除,以确保其包含在数据中)期间拾取的。但是,在情感分析过程中,这两个单词都将被选为 * 否定 * 单词。我想将它们组合在一起,以便将它们归类为 * 中性 * 或 * 肯定 *。是否可以手动将它们组合在一起,并决定如何在情感分析中对其进行分析?
我已经找到了一种使用POS标签和分块对单词进行分组的方法,但这种方法将标签组合在一起或多词表达式,并不一定能在情感分析中正确地提取它们。
当前代码(使用POS标记):

from nltk.corpus import stopwords
from nltk.sentiment import SentimentIntensityAnalyzer
from nltk.stem import PorterStemmer, WordNetLemmatizer
from nltk.tokenize import word_tokenize, sent_tokenize, MWETokenizer
import re, gensim, nltk
from gensim.utils import simple_preprocess
import pandas as pd

d = {'text': ['no complaints', 'not bad']}
df = pd.DataFrame(data=d)

stop = stopwords.words('english')
stop.remove('no')
stop.remove('not')
def sent_to_words(sentences):
    for sentence in sentences:
        yield(gensim.utils.simple_preprocess(str(sentence), deacc=True))  # deacc=True removes punctuations
data_words = list(sent_to_words(df))

def remove_stopwords(texts):
    return [[word for word in simple_preprocess(str(doc)) if word not in stop_words] for doc in texts]
data_words_nostops = remove_stopwords(data_words)

txt = df
txt = txt.apply(str)

#pos tag
words = [word_tokenize(i) for i in sent_tokenize(txt['text'])]
pos_tag= [nltk.pos_tag(i) for i in words]

#chunking
tagged_token = nltk.pos_tag(tokenized_text)
grammar = "NP : {<DT>+<NNS>}"
phrases = nltk.RegexpParser(grammar)
result = phrases.parse(tagged_token)
print(result)

sia = SentimentIntensityAnalyzer()
def find_sentiment(post):
    if sia.polarity_scores(post)["compound"] > 0:
        return "Positive"
    elif sia.polarity_scores(post)["compound"] < 0:
        return "Negative"
    else:
        return "Neutral"
    
df['sentiment'] = df['text'].apply(lambda x: find_sentiment(x))

df['compound'] = [sia.polarity_scores(x)['compound'] for x in df['text']]
df

输出:

(S
  0/CD
  (NP no/DT complaints/NNS)
  1/CD
  not/RB
  bad/JJ
  Name/NN
  :/:
  text/NN
  ,/,
  dtype/NN
  :/:
  object/NN)

    |text           |sentiment  |compound
    |:--------------|:----------|:--------
0   |no complaints  |Negative   |-0.5994
1   |not bad        |Positive   | 0.4310

我知道我目前的代码没有在情感分析中加入POS标记和分块,但是你可以看到单词"没有抱怨"的组合,但是它的当前情感和情感评分是负的(-0.5994),目的是使用POS标记并将情感指定为积极的...如果可能的话!

bxfogqkk

bxfogqkk1#

选项1

使用VADER情感分析代替,它似乎比nltk更好地处理这样的习惯用法(NLTK实际上合并了VADER,但在这种情况下似乎表现不同)。除了安装VADER之外,不需要更改代码中的任何内容,如说明中所述,然后按如下所示在代码中导入库(同时删除一个from nltk.sentiment...

from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer

使用VADER,您应该得到以下结果:我添加了一个额外的习惯用法(即"no worries"),如果使用nltk的sentiment,它也会得到负分。

text            sentiment   compound
0   no complaints   Positive    0.3089
1   not bad         Positive    0.4310
2   no worries      Positive    0.3252

选项2

修改NLTK的词典,如here所述;然而,它可能并不总是工作(因为可能只接受单个单词,而不是成语)。示例如下:

new_words = {
    'no complaints': 3.0
}
sia = SentimentIntensityAnalyzer()
sia.lexicon.update(new_words)

相关问题