我已经尝试对此进行调查,但无法找到任何可能的方法来实现我的设想。作为示例,我尝试分组的术语是"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标记并将情感指定为积极的...如果可能的话!
1条答案
按热度按时间bxfogqkk1#
选项1
使用VADER情感分析代替,它似乎比nltk更好地处理这样的习惯用法(NLTK实际上合并了VADER,但在这种情况下似乎表现不同)。除了安装VADER之外,不需要更改代码中的任何内容,如说明中所述,然后按如下所示在代码中导入库(同时删除一个
from nltk.sentiment...
)使用VADER,您应该得到以下结果:我添加了一个额外的习惯用法(即"no worries"),如果使用nltk的sentiment,它也会得到负分。
选项2
修改NLTK的词典,如here所述;然而,它可能并不总是工作(因为可能只接受单个单词,而不是成语)。示例如下: