当前位置:文档之家› 自然语言处理在现实生活中运用

自然语言处理在现实生活中运用

//统计GET试卷核心单词以及词频
Map<String,Integer> shlMap=new HashMap<String,Integer>(); //去重計數
//整個詞彙表
StringBuffer WordsTable=new StringBuffer();
List<Word> wordsList = new ArrayList<Word>(); //統計詞頻排序
3原始试卷共计82158个单词
4数据清洗和停用词处理后剩下32011个单词
5去重后总共7895个单词的考察范围
6提取10次以上核心单词623个,即便5次以上不过1500个单词
7性能方面运行25秒是稳定的,这个主要是对7895个单词排序问题耗时比较多
5自然语言常用方法小结(JAVA实现,C#类似):
1实体的基本使用
View Code
2批量读取目录下的文件
复制代码
/**
*对单个文件的读取,并将整个以字符串形式返回
* @param srcfile逐行读取的分隔符号,如:" ", "\t", ","等
* @return sb字符串
*/
public static String readStrFiles(String fileDirPath,String separ){
StringBuffer tarWordSb=new StringBuffer(); //存放去除停用词后的,詞頻指定的單詞;
List<Word> wordList = new ArrayList<Word>(); //統計詞頻排序
int sum=0;//計算非重複單詞個數。
int setnum=10; //設定保存詞頻條件
//根據詞頻結果排序,並進行保存
String fWords= CommontMethod.wordsFre(wordList,tarWordSb);
CommontMethod.writeStrFile(fWords.toString(), tarfilepath,"\n");
System.out.println("篩選出現"+setnum+"次以上的單詞:【"+sum+"】個。已經保存至./getFile/getcoreword.txt下,請查閱!");
//根据字母有序打印
//CommontMethod.init(shlMap);
}
复制代码
4运行结果分析
1程序处理核心代码,其中第一个类存放公共方法(小面小结有),第二个类主函数,如上代码。第三个方法实体类统计词频,这样设计,应对大数据,数据小数组即可。
2处理后得到的结果,核心单词,数据清洗结果,停用词,翻译,最终结果等。
wordsList.add(new Word(entry.getKey(), entry.getValue()));//統計頻率詞彙表
count++;
if(entry.getValue()>setnum){
wordList.add(new Word(entry.getKey(), entry.getValue()));//統計指定頻率詞彙表
String sb=CommontMethod.readStrFiles(srcfilepath, " ").toLowerCase().replaceAll(reg, " ").replaceAll(" +"," ").trim(); //接收清洗后的数据
String[] srcWordsList =sb.split(" "); //按照规则,将单词放在数组里面
String[] Tranlation=CommontMethod.readStrFile("./getFile/Translation.txt", "\n").split("\n");//中文翻译
for(int i=0;i<Tranlation.length&&i<freWords.length;i++){
try{
for(File file:files){//遍历训练集文件
srcFileBr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(file.toString())),"UTF-8"));//读取原文件
StringBuffer sb=new StringBuffer();
BufferedReader srcFileBr=null;
File dir=new File(fileDirPath);
if(dir.exists()&&dir.isDirectory()){
File[] files=dir.listFiles(); //获取所有文件
public static final String srcfilepath="./srcFile"; //待处理的源文件地址
public static final String stopfilepath="./getFile/temp.txt"; //待处理的源文件地址
public static final String tarfilepath="./getFile/getcoreword.txt"; //源文件和目标文件地址
3算法思想和解决方案:
算法思想:
1历年(2002—2010年)GET考试真题,文档格式不一。网上收集
2对所有格式不一的文档进行统计处理成txt文档,格式化(去除汉字/标点/空格等非英文单词)和去除停用词(去除891个停用词)处理。
利用正则表达式去除非英文单词的字符,通过规则的空格分离,停用词表网上一大堆,通过将其与单词比对,不在停用词表的追加存储
System.out.println("2002至2010年GET試卷原始单词數:【"+srcWordsList.length+"】個。");
System.out.println("正在對如:on,of,a等停用詞處理,大約需要30秒,請等候...");
StringBuffer stopWordSb=new StringBuffer(); //存放去除停用词后的
3对清洗后的单词进行去重和词频统计:【去重后7895个单词尺寸】
4显示这10余年考试的词汇量还是很大的,加上停用词,考查词汇量在9000左右,那么常考的应该没那么多。试想下17套试卷中,去除停用词后出现频率大于5的和小于25次【1674个单词】的数据应该是合理的,那么我就指定阈值提取。
5最后一步,中英文翻译(目前通过google工具快速查询,然后合并)。最终效果如下:(处理的最终txt结果和自己word整理的结果)
String line = null;
while((line=srcFileBr.readLine())!=null){
2自然语言处理结果预览:
前面提到本算法是对自然语言中常规英文试卷的处理,那么开始收集原始数据吧。
1历年(2002—2010年)GET考试真题,文档格式不一,包括txt/pdf/word等如下图:
2对所有格式不一的文档进行统计处理成txt文档,格式化(去除汉字/标点/空格等非英文单词)和去除停用词(去除891个停用词)处理后结果如下:【17套试卷原始单词(含重复)82158个,数据清洗处理后32011个】
EglChindSb.append(freWords[i]+"\t"+Tranlation[i]+"\n");
}
CommontMethod.writeStrFile(EglChindSb.toString(),"./getFile/worstable.txt","\n");
System.out.println("整個詞彙表為:【"+count+"】個。已經保存至./getFile/wordstable.txt下,請查閱!");
复制代码
2对原始文件数据清理以及停用词处理
复制代码
//对文本文件预处理
public static void dataCleanFile(String srcfilepath,String stopfilepath){
String reg = "[^a-zA-Z]"; //去除噪音,获取英文单词开始的内容
自然语言处理在现实生活中运用
1需求分析与描述:
首先谈下这款软件的来源和用途吧,本科至今没有挂科记录,很不幸第一次《英语学位英语考试<GET>》挂科了。于是,笔者开始疯狂的做题和背单词,对于GET真题很多单词不认识,抱着有道词典,逐字翻译耗时耗力。再说历来10余年试题考试单词范围是一定的,把出现频率高的单词,所谓核心单词掌握了不就事倍功半了?问题来了,不像四六级词汇或者考研词汇市场有专门卖的。当时就开始设想,如果我收集10余年真题,然后去除所有非单词结构(真题算是结构化数据,有一定规则,比较容易处理。此过程其实就是数据清洗过程)最后把所有单词集中汇总,再去除如:a/an/of/on/frist等停用词(中文文本处理也需要对停用词处理,诸如:的,地,是等)。处理好的单词进行去重和词频统计,最后再利用网络工具对英语翻译。然后根据词频排序。基于以上思路,结合笔者前不久对数据挖掘中分类实现的经验和暑假学习的统计学知识最终上周末(10.31—11.1)花了2天时间搞定,这些自然语言处理的基础方法在分类,聚类等数据挖掘和本体领域构建中都有使用。最后我将其核心方法进行梳理,下面咱们具体展开。
相关主题