文本倾向性分析

package test;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;

public class OpinionAnalyser {
    //倾向词表
    public Vector <Word> words=new Vector <Word>();
    //修饰词表
    public Vector <Word> adjectives=new Vector <Word>();
    //描述词表
    public Vector <Word> descriptions=new Vector <Word>();
    //正面句子数
    public int posCount;
    //负面句子数
    public int negCount;

    static String SERVER="59.77.233.*";
    static String USER="";
    static String PASSWORD="";
    static String DATABASE="skycent";

    //负面词的权重,为2表示负面词是正面词权重的两倍
    static int NEG_WEIGHT=2;
    static int TITLE_WEIGHT=10;

    private static int atoi(String s)
    {
        return Integer.parseInt(s);
    }

    //读取数据库初始化三个词表和其他成员变量
    public void OpinionAnalyser() throws SQLException
    {
        ConnDB conndb;
        PreparedStatement stmt = null;
//        PreparedStatement stmt = null;
        ResultSet rs = null;
        conndb = new ConnDB(SERVER, USER, PASSWORD, DATABASE);
        conndb.executeUpdate("SET NAMES ‘utf8mb4‘");

        //获取倾向性词表
        String strSQL = "select word,polar,weight from twordlist";
        try {
            stmt = conndb.getConnection().prepareStatement(strSQL);
            rs = stmt.executeQuery();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        //            处理空集情况
        if (rs.next() == false) {
            System.out.println("twordlist没有词!");
            }
        else{
            rs.previous();
            }
        while(rs.next())
        {
            int polar=atoi(rs.getString("polar"));
            int weight=atoi(rs.getString("weight"));
        //    System.out.println(polar+" "+weight+" "+rs.getString("word"));
            Word tmp=new Word(rs.getString("word"),polar,weight);
            words.addElement(tmp);
        //    System.out.println(polar+" "+weight);
        }

        //获取描述词表
        strSQL = "select word,type from twordlist_ms";
        try {
            stmt = conndb.getConnection().prepareStatement(strSQL);
            rs = stmt.executeQuery();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        //            处理空集情况
        if (rs.next() == false) {
            System.out.println("twordlist_ms没有词!");
            }
        else{
            rs.previous();
            }
        while(rs.next())
        {
            int polar=atoi(rs.getString("type"));
        //    System.out.println(polar+" "+rs.getString("word"));
            Word tmp=new Word(rs.getString("word"),polar,0);
            descriptions.addElement(tmp);    

        }

        //获取修饰词表
        strSQL = "select word,polar,weight from twordlist_xs";
        try {
            stmt = conndb.getConnection().prepareStatement(strSQL);
            rs = stmt.executeQuery();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        //            处理空集情况
        if (rs.next() == false) {
            System.out.println("twordlist_xs没有词!");
            }
        else{
            rs.previous();
            }
        while(rs.next())
        {
            int polar=atoi(rs.getString("polar"));
            int weight=atoi(rs.getString("weight"));
        //    System.out.println(polar+" "+weight+" "+rs.getString("word"));
            Word tmp=new Word(rs.getString("word"),polar,weight);
            adjectives.addElement(tmp);    

        }
        posCount=0;
        negCount=0;

        conndb.close();
    }

    //句子倾向性得分
    public int sentenceScore(String sentence)
    {
        int opinionScore=0;
        //是否出现倾向词
        int opinionPosition=0;

        for(int i=0;i<words.size();i++)
        {
            //找到倾向性词表
            opinionPosition=sentence.indexOf(words.get(i).getWord());
        //    System.out.println(opinionPosition);

            if(opinionPosition!=-1)
            {
                //是否出现修饰词+倾向词
                int flag=0;
                for(int j=0;j<adjectives.size();j++)
                {
                    StringBuffer wordPair=new StringBuffer();
                    wordPair.append(adjectives.get(j).getWord());
                    wordPair.append(words.get(i).getWord());
                    int pairPosition =0;
                    pairPosition=sentence.indexOf(wordPair.toString());

                    if(pairPosition!=-1)
                    {
                    //    System.out.println("yeyeyeyey");
                        flag=1;
                        int tmpScore=words.get(i).getWeight()*adjectives.get(j).getWeight()*words.get(i).getPolar()*adjectives.get(j).getPolar();

                        if(tmpScore>0)
                            opinionScore +=tmpScore;
                        else
                            opinionScore +=tmpScore*NEG_WEIGHT;
                    }
                }
                //没出现修饰词只计算倾向次本身的权重
                if(flag==0)
                {
                //    System.out.println(opinionPosition);
                //    System.out.println("nnnnnnnnnnnnn");
                    if(words.get(i).getPolar()==1)
                    {
                        opinionScore+=words.get(i).getWeight()*words.get(i).getPolar();
                //        System.out.println(words.get(i).getWord());
                //        System.out.println("wwwwwwwww");
                    }
                    else if(words.get(i).getPolar()==-1)
                    {
                        opinionScore+=words.get(i).getWeight()*words.get(i).getPolar()*NEG_WEIGHT;
                //        System.out.println(words.get(i).getWord());
                    }
                }
            }
        }
        //System.out.println("最后得分:"+opinionScore);
        return opinionScore;
    }

    //计算一般新闻的倾向性
    public void opinion(Set<String> keyword,String text,String title)
    {
        posCount=0;
        negCount=0;
        System.out.println("opinion");
        //计算title的倾向性
        shortTextOpinion(keyword,title);

        Set<String> sentences = new HashSet();
        String[] array=text.split(" ");
        //System.err.println(array.length);
        for(int i=0;i<array.length;i++)
        {
            sentences.add(array[i]);
        }
        Iterator KwordIter=keyword.iterator();
        Iterator senIter=sentences.iterator();
        while(KwordIter.hasNext())
        {
            String kwordIt=KwordIter.next().toString();
            while(senIter.hasNext())
            {
                String senIt=senIter.next().toString();
            //    String kwordIt=KwordIter.next().toString();
                if((senIt.indexOf(kwordIt))!=-1)
                {
                    //单个句子倾向性得分
                    int value=sentenceScore(senIt);
                    if(value>0)
                        posCount++;
                    else if(value<0)
                        negCount +=NEG_WEIGHT;
                }
            }
        }
    }

    //计算短文本如微博的倾向性
    public void shortTextOpinion(Set<String> keyword,String text)
    {
        System.out.println("shortTextOpinion");
        posCount=0;
        negCount=0;

        int kwordP=0;
        int owordP=0;

        Iterator kwordIter=keyword.iterator();
        while(kwordIter.hasNext())
        {
            String kwordIt=kwordIter.next().toString();
            kwordP=text.indexOf(kwordIt);
            //文本中存在关键词
            if(kwordP!=-1)
            {
                int opinionScore=0;
                int pairPosition=0;

                StringBuffer wordPair=new StringBuffer();

                for(int i=0;i<words.size();i++)
                {
                    owordP=text.indexOf(words.get(i).getWord());
                    if(owordP!=-1)
                    {
                        //是否出现词对
                        int flag=0;
                        for(int j=0;j<adjectives.size();j++)
                        {
                            wordPair.append(adjectives.get(j).getWord());
                            wordPair.append(words.get(i).getWord());
                            pairPosition=text.indexOf(wordPair.toString());
                            if(pairPosition!=-1)
                            {
                                flag=1;
                                int tmpScore=words.get(i).getWeight()*adjectives.get(j).getWeight()*words.get(i).getPolar()*adjectives.get(j).getPolar();
                                if(tmpScore>0)
                                    opinionScore +=tmpScore;
                                else
                                    opinionScore +=NEG_WEIGHT*tmpScore;
                            }
                        }
                        if(flag==0)
                        {
                            if(words.get(i).getPolar()==1)
                                opinionScore +=words.get(i).getWeight()*words.get(i).getPolar();
                            else if(words.get(i).getPolar()==-1)
                                opinionScore +=NEG_WEIGHT*words.get(i).getWeight()*words.get(i).getPolar();
                        }
                    }
                }
                if(opinionScore>0)
                    posCount +=TITLE_WEIGHT;
                else if(opinionScore<0)
                    negCount +=TITLE_WEIGHT*NEG_WEIGHT;
            }
        }
    }

    //media=3为微博采用短文本倾向性,第二个参数为空
    public void analyse(int media,Set<String> keyword,String text,String title)
    {
        if(media ==3)
        {
            System.out.println("media=3");
            shortTextOpinion(keyword,title);
        }
        else
        {
            System.out.println("media=1");
            opinion(keyword,text,title);
        }
    }

    //最终倾向性
    public int getPolar()
    {
        if(posCount>negCount)
            return 1;
        else if(negCount>posCount)
            return -1;
        else
            return 0;
    }

    public static void main(String[] args) throws SQLException
    {
        OpinionAnalyser a=new OpinionAnalyser();
        a.OpinionAnalyser();
        a.sentenceScore("好不好!");
        String str="心情很好";
        System.out.println("文本倾向性:"+a.sentenceScore(str));
        //String text="兴业证券正面临着暴跌!需要采取一定的措施来进行抵御!";
        //Set <String> keyword = new HashSet();
        //keyword.add("兴业证券");
        //keyword.add("金融危机");
        //String title="兴业证券面临金融危机";

        //a.analyse(1, keyword, text, title);
        //System.out.println("该文本最后倾向性:"+a.getPolar());
    }

}
时间: 2024-11-10 08:09:05

文本倾向性分析的相关文章

(5)【整合】基于机器学习的酒店评论文本倾向性分析

酒店评论情感分析系统(五)—— [整合]基于机器学习的酒店评论文本倾向性分析 本文主要是对之前的第三.四节所介绍的各分块进行整合. 流程: 对GUI界面输入的评论文本,先进行中文分词和去停用词,然后再按“环境,价格,卫生,服务”四个方面分类:同时通过调用LingPipe中的DynamicLMClassifier,对已标注的“中文情感挖掘酒店评论语料”库的学习,构造一个基本极性分析的分类器.最后用此分类器分别对整个评论文本给出总体评价和对四个方面分别给出相应的情感评价. 环境: 1. 操作系统:w

(1)文本倾向性分析综述

酒店评论情感分析系统(一)——文本倾向性分析综述 题目:对酒店的评论进行文本倾向性分析,分析对酒店的评价(包括总评和细评,细评包括价格.卫生.服务.环境四个方面)是褒还是贬. 在学<搜索引擎>这门课的时候,老师布置的一个小型project.本科的时候一直没接触过这块,所以现在只能是从一只菜鸟一步步慢慢摸索.想在学习的过程中,对搜索引擎,文本倾向性分析,网络舆情有个初步的认识与了解. 由于处在摸索阶段,所以文中难免会出现一些表述错误.公式错误.理解错误等等,故千万不要认为里面的思路都正确,如发现

主题模型及其在文本情感分析中的应用

随着Web2.0技术的出现和发展,互联网上(包括门户网站.电子商务网站.社交网站.音/视频分享网站.论坛.博客.微博等)产生了海量的.由用户发表的对于诸如人物.事件.产品等目标实体的评论信息.例如,下面这两个短文本评论:(1)“比较了多个智能手机后选择了8150,性价比还可以.另外,就是考虑到它是3.7的屏幕,大小比较合适,否则携带很不方便.”(京东商城用户,2011.11.25):(2)“我以前在杭州做二手房地产,用温州炒房客的话说:全世界房价降了,杭州的房价永远不会降,因为他们有一道坚不可摧

LSTM 文本情感分析/序列分类 Keras

LSTM 文本情感分析/序列分类 Keras 请参考 http://spaces.ac.cn/archives/3414/ neg.xls是这样的 pos.xls是这样的neg=pd.read_excel('neg.xls',header=None,index=None) pos=pd.read_excel('pos.xls',header=None,index=None) #读取训练语料完毕 pos['mark']=1 neg['mark']=0 #给训练语料贴上标签 pn=pd.concat

python实例:三国演义TXT文本词频分析

0x00 前言 找不到要写什么东西了!今天有个潭州大牛讲师  说了个  文本词频分析 我基本上就照抄了一遍 中间遇到一些小小的问题 自我百度 填坑补全了  如下 : 效果演示 0x01   准备环境及介绍 python3.x版本   随意 安装jieba库 pip install jieba jieba三种模式: 1.精准模式 lcut函数,返回一个分词列表 2.全模式 3.搜索引擎模式 词频: <单词>:<出现次数>的键值对 IPO描述 imput output process

文本情感分析(一):基于词袋模型(VSM、LSA、n-gram)的文本表示

现在自然语言处理用深度学习做的比较多,我还没试过用传统的监督学习方法做分类器,比如SVM.Xgboost.随机森林,来训练模型.因此,用Kaggle上经典的电影评论情感分析题,来学习如何用传统机器学习方法解决分类问题. 通过这个情感分析的题目,我会整理做特征工程.参数调优和模型融合的方法,这一系列会有四篇文章.这篇文章整理文本特征工程的内容. 文本的特征工程主要包括数据清洗.特征构造.降维和特征选择等. 首先是数据清洗,比如去停用词.去非字母汉字的特殊字符.大写转小写.去掉html标签等. 然后

文本情感分析(二):基于word2vec和glove词向量的文本表示

上一篇博客用词袋模型,包括词频矩阵.Tf-Idf矩阵.LSA和n-gram构造文本特征,做了Kaggle上的电影评论情感分类题. 这篇博客还是关于文本特征工程的,用词嵌入的方法来构造文本特征,也就是用word2vec词向量和glove词向量进行文本表示,训练随机森林分类器. 一.训练word2vec词向量 Kaggle情感分析题给出了三个数据集,一个是带标签的训练集,共25000条评论,一个是测试集,无标签的,用来做预测并提交结果,这两个数据集是上一篇文章里我们用过的. 此外还有一个无标签的数据

文本情感分析的基础在于自然语言处理、情感词典、机器学习方法等内容。以下是我总结的一些资源。

词典资源:SentiWordNet<知网>中文版中文情感极性词典 NTUSD情感词汇本体下载 自然语言处理工具和平台:哈尔滨工业大学社会计算与信息检索研究中心isnowfy/snownlp · GitHub 汉语分词:自然语言处理与信息检索共享平台 NLPIR.orgfxsjy/jieba · GitHub 语料资源:信息分类与情感发现 课程:斯坦福大学自然语言处理第七课"情感分析(Sentiment Analysis)" 网站和博客:Text Classification

【转】用python实现简单的文本情感分析

import jieba import numpy as np # 打开词典文件,返回列表 def open_dict(Dict='hahah',path = r'/Users/zhangzhenghai/Downloads/Textming/'): path = path + '%s.txt' %Dict dictionary = open(path, 'r', encoding='utf-8') dict = [] for word in dictionary: word = word.st