(3.2)将分词和去停用词后的评论文本基于“环境、卫生、价格、服务”分类...
酒店評論情感分析系統(tǒng)(三)——
將分詞和去停用詞后的評論文本基于“環(huán)境、衛(wèi)生、價格、服務(wù)”分類
思想:
將進行了中文分詞和去停用詞之后得到的詞或短語按序存在一個數(shù)組(iniArray)中,從中找出所有和“環(huán)境、衛(wèi)生、價格、服務(wù)”四個方面相關(guān)的詞或短語,并記錄下其位置信息(sortRefNum)。然后按照位置信息,對每一個標記出的關(guān)鍵詞,記錄下從當前關(guān)鍵詞起到下一個關(guān)鍵詞止的信息,放入一個String型的數(shù)組中(midArray),最后將此數(shù)組中的關(guān)鍵詞再分別基于“環(huán)境、衛(wèi)生、價格、服務(wù)”四個方面分類(fourClass)。
前提條件:
1)? 此步驟是在【(3.1)用ictclas4j進行中文分詞,并去除停用詞】后所得到的文本基礎(chǔ)上的實驗;
2)? 在sentence文件目錄中的srcFile目錄下,須自己建立以下幾個額外的詞庫:
?
EnvironmentRef:與環(huán)境相關(guān)的相關(guān)詞匯,比如:交通,設(shè)施等;
HealthRef:與衛(wèi)生相關(guān)的相關(guān)詞匯,比如:衛(wèi)生,臟等;
PriceRef:與價錢相關(guān)的相關(guān)詞匯,比如:收費,價格等;
ServiceRef:與服務(wù)相關(guān)的相關(guān)詞匯,比如:服務(wù),態(tài)度等
RefWords:以上四個相關(guān)詞表的總和。
代碼實現(xiàn):
新建一個class(如:Fenlei.java)
?
1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.util.HashSet; 8 import java.util.Set; 9 10 11 public class Fenglei { 12 13 //將分詞和去停用詞的結(jié)果提取出來 14 String destFile = "." + File.separator + "destFile" + File.separator + "酒店評論.txt"; 15 public static final String RefWord = "." + File.separator + "srcFile" + File.separator + "RefWords.txt"; 16 public static final String EnvironmentRef = "." + File.separator + "srcFile" + File.separator + "EnvironmentRef.txt"; 17 public static final String HealthRef = "." + File.separator + "srcFile" + File.separator + "HealthRef.txt"; 18 public static final String PriceRef = "." + File.separator + "srcFile" + File.separator + "PriceRef.txt"; 19 public static final String ServiceRef = "." + File.separator + "srcFile" + File.separator + "ServiceRef.txt"; 20 21 public void fenlei(){ 22 try{ 23 //讀取原文件和相關(guān)詞表 24 BufferedReader srcBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(destFile)))); 25 BufferedReader refBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(RefWord)))); 26 BufferedReader environmentRefBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(EnvironmentRef)))); 27 BufferedReader healthRefBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(HealthRef)))); 28 BufferedReader priceRefBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(PriceRef)))); 29 BufferedReader serviceRefBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(ServiceRef)))); 30 31 //將分詞去停用詞后的單詞,按序放在String數(shù)組中 32 String paragraph = null; 33 String[] iniArray = null; 34 for(; (paragraph = srcBr.readLine()) != null;){ 35 iniArray = paragraph.split(" "); 36 } 41 42 Set<String> refWordSet = getSet(refBr); //相關(guān)詞匯集 43 Set<String> environmentSet = getSet(environmentRefBr); 44 Set<String> healthSet = getSet(healthRefBr); 45 Set<String> priceSet = getSet(priceRefBr); 46 Set<String> serviceSet = getSet(serviceRefBr); 47 48 //用一個int數(shù)組refNum存放分析文本中尋找相關(guān)關(guān)鍵詞 49 int[] refNum = new int[iniArray.length]; 50 int refNumcount = 0; 51 for(int i = 0; i< iniArray.length; i++){ 52 if(refWordSet.contains(iniArray[i])){ 53 refNum[refNumcount++] = i; 54 } 55 } 56 57 //對refNum數(shù)組進行排序 58 int[] sortRefNum = new int[refNumcount]; 59 bubble(refNum); 60 for(int i = refNum.length-refNumcount,j=0;j<refNumcount;i++,j++){ 61 sortRefNum[j] = refNum[i]; 62 } 63 64 //對屬于同一相關(guān)的短語進行記錄 65 String[] midArray = new String[refNumcount]; 66 int midArrayCount = 0; 67 for(int i=0; i<refNumcount-1; i++){ 68 int j=sortRefNum[i]; 69 midArray[midArrayCount] = ""; 70 for(;j < sortRefNum[i+1];j++ ){ 71 if(iniArray[j] != null){ 73 midArray[midArrayCount] += iniArray[j].toString()+" "; 74 } 75 } 76 midArrayCount++; 77 } 78 midArray[midArrayCount] = ""; 79 for(int i = sortRefNum[refNumcount-1];i < iniArray.length;i++){ 80 midArray[midArrayCount] += iniArray[i].toString()+" "; 81 } 82 83 //對相關(guān)短語屬于同一大類的短語進行合并整理,如“光線”類和“隔音”應(yīng)該同屬于“環(huán)境”類 84 String[] fourClass = new String[4]; 85 fourClass[0] = "環(huán)境: "; 86 fourClass[1] = "衛(wèi)生: "; 87 fourClass[2] = "價格: "; 88 fourClass[3] = "服務(wù): "; 89 for(int j=0;j<=midArrayCount;j++){ 90 if(environmentSet.contains(iniArray[sortRefNum[j]])){ //0-環(huán)境 91 fourClass[0] += midArray[j].toString()+" "; 92 }else{ 93 if(healthSet.contains(iniArray[sortRefNum[j]])){ //1-衛(wèi)生 94 fourClass[1] += midArray[j].toString()+" "; 95 }else{ 96 if(priceSet.contains(iniArray[sortRefNum[j]])){ //2-價格 97 fourClass[2] += midArray[j].toString()+" "; 98 }else{ 99 if(serviceSet.contains(iniArray[sortRefNum[j]])){ //3-服務(wù) 100 fourClass[3] += midArray[j].toString()+" "; 101 } 102 } 103 } 104 } 105 } 106 }catch(FileNotFoundException e){ 107 // TODO Auto-generated catch block 108 e.printStackTrace(); 109 } catch(Exception e){ 110 e.printStackTrace(); 111 } 112 } 113 114 //冒泡排序 115 public int[] bubble(int[] array) { 116 int temp = 0; 117 for (int i = array.length - 1; i > 0; --i) { 118 for (int j = 0; j < i; j++) { 119 if (array[j] > array[j+1]) { 120 temp = array[j]; 121 array[j] = array[j+1]; 122 array[j+1] = temp; 123 } 124 } 125 } 126 return array; 127 } 128 129 130 //詞匯表的集合 131 public Set<String> getSet(BufferedReader br){ 132 Set<String> wordSet = new HashSet<String>(); //用來放詞匯的集合 133 String word = null; 134 try { 135 for(; (word = br.readLine()) != null;){ 136 wordSet.add(word); 137 } 138 } catch (IOException e) { 139 // TODO Auto-generated catch block 140 e.printStackTrace(); 141 } 142 return wordSet; 143 } 144 145 public static void main(String[] args){ 146 new Fenglei().fenlei(); 147 } 149 }?
運行效果:
源評論文本:
總體評價:性價比很高,交通便利,周邊吃喝玩樂設(shè)施齊全,對面就是家樂福。但是前臺男客服服務(wù)態(tài)度很一般,酒店光線太暗看不清,總感覺臟臟的,并且隔音效果一般,有一點點吵,導(dǎo)致晚上睡覺不踏實。對于價錢,三星級價格有點高,一次性用品要收費,覺得很不合理。
?
分詞和去停用詞后的文本:
總體 評價 性 價 高 交通 便利 周邊 吃喝玩樂 設(shè)施 齊全 對面 家樂福 前臺 男客 服 服務(wù) 態(tài)度 一般 酒店 光線 太 暗 不 清 總 感覺 臟臟 隔音 效果 一般 一點點 吵 導(dǎo)致 晚上 睡覺 不 踏實 價錢 三星級 價格 點 高 一次性 用品 收費 覺得 不 合理
?
midArray數(shù)組中的內(nèi)容:
交通 便利 周邊 吃喝玩樂
設(shè)施 齊全 對面 家樂福 前臺 男客 服
服務(wù)
態(tài)度 一般 酒店
光線 太 暗 不 清 總 感覺
臟臟
隔音 效果 一般 一點點 吵 導(dǎo)致 晚上 睡覺 不 踏實
價錢 三星級
價格 點 高 一次性 用品
收費 覺得 不 合理
?
按“環(huán)境、衛(wèi)生、價格、服務(wù)”分類后的結(jié)果:
環(huán)境:交通 便利 周邊 吃喝玩樂? 設(shè)施 齊全 對面 家樂福 前臺 男客 服? 光線 太 暗 不 清 總 感覺? 隔音 效果 一般 一點點 吵 導(dǎo)致 晚上 睡覺 不 踏實?
衛(wèi)生: 臟臟?
價格: 價錢 三星級? 價格 點 高 一次性 用品? 收費 覺得 不 合理?
服務(wù): 服務(wù)? 態(tài)度 一般 酒店?
?
缺點:
此實驗的分類效果一般,對于源文本的輸入格式有一定的限制,比如對于“前臺男客服服務(wù)態(tài)度很一般”這一句,最終的分類結(jié)果變?yōu)椤碍h(huán)境: 前臺 男客 服;服務(wù): 服務(wù)? 態(tài)度 一般”。故,此實驗只是作為一種思想的體現(xiàn),如有更好的文本細分的想法,歡迎留言探討!
轉(zhuǎn)載于:https://www.cnblogs.com/CherishFX/p/4038448.html
總結(jié)
以上是生活随笔為你收集整理的(3.2)将分词和去停用词后的评论文本基于“环境、卫生、价格、服务”分类...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Core Audio音频基础概述
- 下一篇: 上传大文件:在 System.Web.H