自然语言处理在现实生活中运用_第1页
自然语言处理在现实生活中运用_第2页
自然语言处理在现实生活中运用_第3页
自然语言处理在现实生活中运用_第4页
自然语言处理在现实生活中运用_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、. .自然语言处理在现实生活中运用1 需求分析与描述: 首先谈下这款软件的来源和用途吧,本科至今没有挂科记录,很不幸第一次"英语学位英语考试<GET>"挂科了。于是,笔者开场疯狂的做题和背单词,对于GET真题很多单词不认识,抱着有道词典,逐字翻译耗时耗力。再说历来10余年试题考试单词范围是一定的,把出现频率高的单词,所谓核心单词掌握了不就事倍功半了?问题来了,不像四六级词汇或者考研词汇市场有专门卖的。当时就开场设想,如果我收集10余年真题,然后去除所有非单词构造真题算是构造化数据,有一定规那么,比较容易处理。此过程其实就是数据清洗过程最后把所有单词集中汇总,再去

2、除如:a/an/of/on/frist等停用词中文文本处理也需要对停用词处理,诸如:的,地,是等。处理好的单词进展去重和词频统计,最后再利用网络工具对英语翻译。然后根据词频排序。 基于以上思路,结合笔者前不久对数据挖掘中分类实现的经历和暑假学习的统计学知识最终上周末10.3111.1花了2天时间搞定,这些自然语言处理的根底方法在分类,聚类等数据挖掘和本体领域构建中都有使用。最后我将其核心方法进展梳理,下面咱们具体展开。2 自然语言处理结果预览:前面提到本算法是对自然语言中常规英文试卷的处理,那么开场收集原始数据吧。1 历年20022021年GET考试真题,文档格式不一,包括txt/pdf/wo

3、rd等如以下图:2 对所有格式不一的文档进展统计处理成txt文档,格式化去除汉字/标点/空格等非英文单词和去除停用词去除891个停用词处理后结果如下:【17套试卷原始单词含重复82158个,数据清洗处理后32021个】3 对清洗后的单词进展去重和词频统计:【去重后7895个单词尺寸】4 显示这10余年考试的词汇量还是很大的,加上停用词,考察词汇量在9000左右,那么常考的应该没那么多。试想下17套试卷中,去除停用词后出现频率大于5的和小于25次【1674个单词】的数据应该是合理的,那么我就指定阈值提取。5 最后一步,中英文翻译目前通过google工具快速查询,然后合并。最终效果如下:处理的最终

4、txt结果和自己word整理的结果3 算法思想和解决方案:算法思想:1历年20022021年GET考试真题,文档格式不一。网上收集2 对所有格式不一的文档进展统计处理成txt文档,格式化去除汉字/标点/空格等非英文单词和去除停用词去除891个停用词处理。利用正那么表达式去除非英文单词的字符,通过规那么的空格别离,停用词表网上一大堆,通过将其与单词比对,不在停用词表的追加存储3 对清洗后的单词进展去重和词频统计通过Map统计词频,实体存储:单词-词频。数组也可以,只是面对特别大的数据,数组存在越界问题。排序:根据词频或者字母4 提取核心词汇,大于5的和小于25次的数据,可以自己制定阈值。遍历li

5、st<实体>列表时候,通过获取实体的词频属性控制选取词汇表尺寸。5 最后一步,中英文翻译。将批量单词通过google翻译,可以获取常用意思,对于发音,词义,词性等没有处理。这里也是可以改进地方,其实也很简单,后面详解,最后自己讲结果在word里面排版。4 Java语言对需*现详解: 1 文件保存路径定义复制代码 public static final String stopWordTable ="./getFile/partStopWord.txt" /停用词词表文件地址 public static final String srcfilepath="

6、./srcFile" /待处理的源文件地址 public static final String stopfilepath="./getFile/temp.txt" /待处理的源文件地址 public static final String tarfilepath="./getFile/getcoreword.txt" /源文件和目标文件地址复制代码2 对原始文件数据清理以及停用词处理复制代码 /对文本文件预处理 public static void dataCleanFile(String srcfilepath,String stopfil

7、epath) String reg = "a-zA-Z" /去除噪音,获取英文单词开场的内容 String sb=montMethod.readStrFiles(srcfilepath, " ").toLowerCase().replaceAll(reg, " ").replaceAll(" +"," ").trim(); /接收清洗后的数据 String srcWordsList =sb.split(" "); /按照规那么,将单词放在数组里面 System.out.pri

8、ntln("2002至2021年GET試卷原始单词數:【"+srcWordsList.length+"】個。"); System.out.println("正在對如:on,of,a等停用詞處理,大約需要30秒,請等候."); StringBuffer stopWordSb=new StringBuffer(); /存放去除停用词后的 for(int i=0;i<srcWordsList.length;i+) if(IsStopWord(srcWordsListi)=false) stopWordSb.append(srcWord

9、sListi.toString().trim()+"n"); /不是停用词,那么追加字符串 String stopWordsList =stopWordSb.toString().split("n"); System.out.println("對單詞集停用詞處理結束,核心單詞共計:【"+stopWordsList.length+"】個。已經保存至./getFile/temp.txt下,請查閱!"); montMethod.writeStrFile(stopWordSb.toString(), stopfilepat

10、h, "n"); /将预处理后并标注的数据,指定位置保存 复制代码3 处理后的数据进展核心单词汇总和词频统计复制代码 /统计词频 public static void countWordNums(String stopfilepath,String tarfilepath) /统计GET试卷核心单词以及词频 Map<String,Integer> shlMap=new HashMap<String,Integer>(); /去重計數 /整個詞彙表 StringBuffer WordsTable=new StringBuffer(); List<

11、Word> wordsList = new ArrayList<Word>(); /統計詞頻排序 StringBuffer tarWordSb=new StringBuffer(); /存放去除停用词后的,詞頻指定的單詞; List<Word> wordList = new ArrayList<Word>(); /統計詞頻排序 int sum=0;/計算非重複單詞個數。 int setnum=10; /設定保存詞頻條件 shlMap=montMethod.countWords(shlMap, stopfilepath.trim(), " &q

12、uot;); int count=0; for (Map.Entry<String, Integer> entry : shlMap.entrySet() if(entry.getValue()>0) wordsList.add(new Word(entry.getKey(), entry.getValue();/統計頻率詞彙表 count+; if(entry.getValue()>setnum) wordList.add(new Word(entry.getKey(), entry.getValue();/統計指定頻率詞彙表 sum+; /詞彙表大小 StringB

13、uffer EglChindSb=new StringBuffer(); /存放中英对照词表; String freWords= montMethod.wordsFre(wordsList,WordsTable).split("n"); /根據詞頻結果排序,並進行保存 String Tranlation=montMethod.readStrFile("./getFile/Translation.txt", "n").split("n");/中文翻译 for(int i=0;i<Tranlation.lengt

14、h&&i<freWords.length;i+) EglChindSb.append(freWordsi+"t"+Tranlationi+"n"); montMethod.writeStrFile(EglChindSb.toString(),"./getFile/worstable.txt","n"); System.out.println("整個詞彙表為:【"+count+"】個。已經保存至./getFile/wordstable.txt下,請查閱!"

15、); /根據詞頻結果排序,並進行保存 String fWords= montMethod.wordsFre(wordList,tarWordSb); montMethod.writeStrFile(fWords.toString(), tarfilepath,"n"); System.out.println("篩選出現"+setnum+"次以上的單詞:【"+sum+"】個。已經保存至./getFile/getcoreword.txt下,請查閱!"); /根据字母有序打印 /montMethod.init(shlMa

16、p); 复制代码4 运行结果分析1 程序处理核心代码,其中第一个类存放公共方法小面小结有,第二个类主函数,如上代码。第三个方法实体类统计词频,这样设计,应对大数据,数据小数组即可。2 处理后得到的结果,核心单词,数据清洗结果,停用词,翻译,最终结果等。3 原始试卷共计82158个单词4 数据清洗和停用词处理后剩下32021个单词5 去重后总共7895个单词的考察范围6 提取10次以上核心单词623个,即便5次以上不过1500个单词7 性能方面运行25秒是稳定的,这个主要是对7895个单词排序问题耗时比较多5 自然语言常用方法小结JAVA实现,C#类似:1 实体的根本使用 View Code2

17、批量读取目录下的文件复制代码 /* * 对单个文件的读取,并将整个以字符串形式返回 * param srcfilepath 读取文件的地址 * param separ 逐行读取的分隔符号,如:" ", "t", ","等 * return sb 字符串 */ public static String readStrFiles(String fileDirPath,String separ) StringBuffer sb=new StringBuffer(); BufferedReader srcFileBr=null; File d

18、ir=new File(fileDirPath); if(dir.exists()&&dir.isDirectory()File files=dir.listFiles(); /获取所有文件 try for(File file:files)/遍历训练集文件 srcFileBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(file.toString(),"UTF-8");/读取原文件 String line = null; while(line=srcFileB

19、r.readLine()!=null) if(line.length()>0) sb.append(line.trim()+separ); srcFileBr.close(); catch(Exception ex) System.out.println(ex.getMessage(); else System.out.println("你选择的不是目录文件"); return sb.toString().trim(); 复制代码3 读取单个文件复制代码 /* * 对单个文件的读取,并将整个以字符串形式返回 * param srcfilepath 读取文件的地址 *

20、param separ 逐行读取的分隔符号,如:" ", "t", ","等 * return sb 字符串 */ public static String readStrFile(String srcfilepath,String separ) StringBuffer sb=new StringBuffer(); try BufferedReader srcFileBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(srcfilepa

21、th),"UTF-8");/读取原文件 String line = null; while(line=srcFileBr.readLine()!=null) if(line.length()>0) sb.append(line.trim()+separ); srcFileBr.close(); catch(Exception ex) System.out.println(ex.getMessage(); return sb.toString().trim(); 复制代码4 文件预处理,并以字符串结果返回复制代码 /* * 对文件的读取,并将整个以字符串形式返回 * p

22、aram shlMap 传入的map集合 * param tarfilepath 读取文件的地址 * param separ 逐行读取的分隔符号,如:" ", "t", ","等 * return sb 字符串 */ public static Map<String,Integer> countWords(Map<String,Integer> tarMap,String tarfilepath,String separ) StringBuffer sb=new StringBuffer(); try /读取原

23、文件 BufferedReader srcFileBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(tarfilepath),"UTF-8"); /对读入的文本进展预处理 String paragraph = null; while(paragraph=srcFileBr.readLine()!=null&&paragraph.length()>0) String words = paragraph.split(separ); /遍历所有单词 for(S

24、tring word:words) if(tarMap.containsKey(word) tarMap.put(word, tarMap.get(word)+1); else tarMap.put(word, 1); srcFileBr.close(); catch(Exception ex) System.out.println(ex.getMessage(); return tarMap; 复制代码5 指定保存文件复制代码 /* * 将字符串写到指定文件中 * param str 待写入的字符串 * param tarfilepath 目标文件路径 * param separ 逐行读取的

25、分隔符号,如:" ", "t", ","等 */ public static void writeStrFile(String str,String tarfilepath,String separ) try OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File(tarfilepath), "UTF-8");/ 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windo

26、ws上是gbk writer.append(str+separ);/ 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入 writer.close();/关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉 catch(Exception ex) System.out.println(ex.getMessage(); 复制代码6 词频排序中英文通用复制代码 /* * 根據單詞詞頻排序 * param wordList 存放單詞和詞頻 * param tarWordSb 存放排序后的結果 * return */ public static String wordsF

27、re(List<Word> wordList,StringBuffer tarWordSb) Collections.sort(wordList, new parator<Word>() Override public int pare(Word word1, Word word2) if(word1.getFrequence()>word2.getFrequence() return -1; else if(word1.getFrequence()<word2.getFrequence() return 1; else return 0; ); for (

28、Word word : wordList) tarWordSb.append(word.print().append("n"); return tarWordSb.toString(); 复制代码7 根据字符有序排列复制代码 /* * 根据字符有序排列 * param shlMap */ public static void init(Map<String,Integer> shlMap) List<Map.Entry<String, Integer>> mHashMapEntryList=new ArrayList<Map.Ent

29、ry<String,Integer>>(shlMap.entrySet(); System.out.println("-> 排序前的顺序"); for (int i = 0; i < mHashMapEntryList.size(); i+) System.out.println(mHashMapEntryList.get(i); Collections.sort(mHashMapEntryList, new parator<Map.Entry<String,Integer>>() Override publicintpare(Map.Entry<String,Integer>firstMapEntry, Map.Entry<Str

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论