关键词抽取算法
① 短信关键字过滤算法有哪些
bool CKeyWordManager::find(const std::string &key){ for (int n = 0; n < key.length (); ++n) { for (int i = 1; i < m_keyWordMaxLength && i + n < key.length (); ++i) { set <string>::iterator it = m_keWordList.find (key.substr (n, i)); if (it != m_keyWordList.end ()) return true; } } return false;}
② simhash 怎么把关键字变为二进制
原理
simhash值的生成图解如下
大概花三分钟看懂这个图就差不多怎么实现这个simhash算法了。特别简单。谷歌出品嘛,简单实用。
算法过程大概如下:
将Doc进行关键词抽取(其中包括分词和计算权重),抽取出n个(关键词,权重)对, 即图中的(feature, weight)们。 记为 feature_weight_pairs = [fw1, fw2 … fwn],其中 fwn = (feature_n,weight_n`)。
hash_weight_pairs = [ (hash(feature), weight) for feature, weight infeature_weight_pairs ] 生成图中的(hash,weight)们, 此时假设hash生成的位数bits_count = 6(如图);
然后对 hash_weight_pairs 进行位的纵向累加,如果该位是1,则+weight,如果是0,则-weight,最后生成bits_count个数字,如图所示是[13, 108, -22, -5, -32, 55], 这里产生的值和hash函数所用的算法相关。
[13,108,-22,-5,-32,55] -> 110001这个就很简单啦,正1负0。
到此,如何从一个doc到一个simhash值的过程已经讲明白了。 但是还有一个重要的部分没讲,
‘simhash值的海明距离计算’
二进制串A 和 二进制串B 的海明距离 就是
③ 如何通过聚类或其他算法实现一组名词的抽象,也可以说是关键词的提取
public class Main_UI4 {
private static String[] names=new String[]{"组织机构代码","公司代码","学校代码","车辆牌照","公司牌照","学生姓名","道路运政"};
public void fun(String xname){
System.out.println(xname+":");
for(String name:names){
if(name.indexOf(xname)>0){
System.out.print(name+"\t");
}
}
System.out.println();
}
public static void main(String[] args) {
new Main_UI4().fun("代码");
new Main_UI4().fun("牌照");
}
}
④ “关键词”提取都有哪些方案
仅从词语角度分析,1.2句banana是重复出现的,3.4句kitten是重复出现的。但其实可以发现1.2句主要跟食物有关,3.4句主要跟动物有关,而food、animal两个词在四句话里均未出现,有没有可能判断出四句话中所包含的两个主题呢,或者当两篇文章共有的高频词很少,如一篇讲banana,一篇讲orange,是否可以判断两篇文章都包含food这个主题呢,如何生成主题、如何分析文章的主题,这就是topic-model所研究的内容。对文本进行LSA(隐形语义分析)。在直接对词频进行分析的研究中,可以认为通过词语来描述文章,即一层的传递关系。而topic-model则认为文章是由主题组成,文章中的词,是以一定概率从主题中选取的。不同的主题下,词语出现的概率分布是不同的。比如”鱼雷“一词,在”军事“主题下出现的概率远大于在”食品”主题下出现的概率。即topic-model认为文档和词语之间还有一层关系。首先假设每篇文章只有一个主题z,则对于文章中的词w,是根据在z主题下的概率分布p(w|z)生成的。则在已经选定主题的前提下,整篇文档产生的概率是而这种对每篇文章只有一个主题的假设显然是不合理的,事实上每篇文章可能有多个主题,即主题的选择也是服从某概率分布p(t)的因此根据LDA模型,所有变量的联合分布为表示topic下词的分布,表示文档下topic的分布。是第m个文档的单词总数。和表示词语和topic的概率分布先验参数。而学习LDA的过程,就是通过观察到的文档集合,学习的过程。
⑤ seo中提取关键字,怎么去分析
记住一个概念:四处一词
如何让搜索引擎知道你这个页面的关键词是哪个呢?从四个地方:
第一处:当前页面的标题上出现这个关键词;
第二处:当前页面关键词标签、描述标签里出现这个关键词(如果是英文关键词,请在URL里也出现);
第三处:当前页面的内容里,多次出现这个关键词,并在第一次出现时,加粗;
第四处:其他页面的锚文本里,出现这个关键词(内链和外链)。
⑥ simhash中如何抽取文本关键字及权重
传统的Hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上仅相当于伪随机数产生算法。传统的hash算法产生的两个签名,如果原始内容在一定概率下是相等的;如果不相等,除了说明原始内容不相等外,不再提供任何信息,因为即使原始内容只相差一个字节,所产生的签名也很可能差别很大。所以传统的Hash是无法在签名的维度上来衡量原内容的相似度,而SimHash本身属于一种局部敏感哈希算法,它产生的hash签名在一定程度上可以表征原内容的相似度。
⑦ 根据关键词检索论文用什么推荐算法最合适
必须在Ei Compendex 数据库中进行检索。
第一步:选择检索字段为“Subject/Title/Abstract”;
第二步:在检索框中输入关键词,点击“Search”按钮,得到检索结果;
第三步:在检索结果页面左栏点击“Country”,选择“China”,在左栏上方点击“Limit to”按钮,得到中国人发表的论文;
第四步:在检索结果左栏下方点击“Source Title”按钮,查看中国人习惯发表适合你的关键词的期刊。
如果需要进一步了解这些期刊的信息,可在“谷歌”中搜索。也可在“雅虎”中搜索。
⑧ 怎么在一堆图片中抓取关键词
可以用抽取方法。
有监督无监督抽取方法:无监督关键词提取方法主要有三类:基于统计特征的关键词提取(TF,TF-IDF);基于词图模型的关键词提取(PageRank,TextRank);基于主题模型的关键词提取(LDA)基于统计特征的关键词提取算法的思想是利用文档中词语的统计信息抽取文档的关键词;基于词图模型的关键词提取首先要构建文档的语言网络图,然后对语言进行网络图分析,在这个图上寻找具有重要作用的词或者短语,这些短语就是文档的关键词;基于主题关键词提取算法主要利用的是主题模型中关于主题分布的性质进行关键词提取;
将关键词抽取过程视为二分类问题,先提取出候选词,然后对于每个候选词划定标签,要么是关键词,要么不是关键词,然后训练关键词抽取分类器。当新来一篇文档时,提取出所有的候选词,然后利用训练好的关键词提取分类器,对各个候选词进行分类,最终将标签为关键词的候选词作为关键词。
⑨ 把测试集里的文本用tfidf算法提取出关键词,求个java代码
//直接粘贴就行。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.border.EtchedBorder;
import javax.swing.filechooser.FileFilter;
public class Application2 extends JFrame implements Cloneable{
public Application2(){
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(800,700);
this.setLayout(new BorderLayout());
keyWords1=new String[]{"那么","还是","sdf"};
keyWords2=new String[]{"所以","而且",};
input=new JTextArea();
JPanel ip=new JPanel();
ip.setLayout(new BorderLayout());
ip.add(input,BorderLayout.CENTER);
ip.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "输入文本"));
output1=new JTextArea();
JPanel o1p=new JPanel();
o1p.setLayout(new BorderLayout());
o1p.add(output1,BorderLayout.CENTER);
o1p.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "以下为"));
output2=new JTextArea();
JPanel o2p=new JPanel();
o2p.setLayout(new BorderLayout());
o2p.add(output2,BorderLayout.CENTER);
o2p.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "以下为"));
JSplitPane split1=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,o1p,o2p);
split1.setDividerLocation(350);
JSplitPane split2=new JSplitPane(JSplitPane.VERTICAL_SPLIT,ip,split1);
split2.setDividerLocation(300);
this.add(split2,BorderLayout.CENTER);
open=new JButton("导入");
open.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JFileChooser chooser=new JFileChooser(".");
chooser.setMultiSelectionEnabled(false);
chooser.addChoosableFileFilter(new FileFilter(){
@Override
public boolean accept(File file) {
if(file.isDirectory())
return true;
int length=file.getName().length();
if(length<5)
return false;
if(file.getName().substring(length-4).equals(".txt"))
return true;
return false;
}
@Override
public String getDescription() {
return "文本文件";
}
});
chooser.showOpenDialog(Application2.this);
File file=chooser.getSelectedFile();
if(file==null)
return;
try {
Scanner sc=new Scanner(file);
String text="";
while(sc.hasNextLine())
text+=sc.nextLine()+"\n";
input.setText(text);
String[] array=getSentences();
output1.setText(getKeySentences(keyWords1,array));
output2.setText(getKeySentences(keyWords2,array));
}catch (IOException e1) {
e1.printStackTrace();
}
}
});
save=new JButton("导出");
save.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JFileChooser chooser=new JFileChooser(".");
chooser.setMultiSelectionEnabled(false);
chooser.addChoosableFileFilter(new FileFilter(){
@Override
public boolean accept(File file) {
if(file.isDirectory())
return true;
int length=file.getName().length();
if(length<5)
return false;
if(file.getName().substring(length-4).equals(".txt"))
return true;
return false;
}
@Override
public String getDescription() {
return "文本文件";
}
});
chooser.showSaveDialog(Application2.this);
File file=chooser.getSelectedFile();
if(file==null)
return;
try {
PrintWriter pw=new PrintWriter(file);
pw.print(output1.getText());
pw.flush();
pw.print(output2.getText());
pw.flush();
}catch (IOException e1) {
e1.printStackTrace();
}
}
});
JPanel buttonPane=new JPanel();
buttonPane.add(open);
buttonPane.add(save);
this.add(buttonPane,BorderLayout.SOUTH);
}
public String[] getSentences(){
ArrayList<String> set=new ArrayList<String>();
int length=input.getText().length();
for(int i=0,last=0;i<length;i++){
String s=String.valueOf(input.getText().charAt(i));
if(s.equals("\n"))
last=i+1;
if(s.equals(".")||s.equals(",")||s.equals("。")||s.equals("。")||s.equals("!")||s.equals("?")||s.equals("?")||s.equals("!")||s.equals(",")){
set.add(input.getText().substring(last,i)+s);
last=i+1;
}
}
return set.<String>toArray(new String[set.size()]);
}
public String getKeySentences(String[] key,String[] sentences){
String result="";
A: for(int i=0;i<sentences.length;i++){
for (int k = 0; k < key.length; k++)
if (sentences[i].contains(key[k].subSequence(0, key[k].length()))) {
result += sentences[i] + "\n";
continue A;
}
}
return result;
}
private JTextArea input;
private JTextArea output1;
private JTextArea output2;
private JButton open;
private JButton save;
private String[] keyWords1;
private String[] keyWords2;
public static void main(String... args){
EventQueue.invokeLater(new Runnable(){
public void run(){
new Application2().setVisible(true);
}
});
}
}
⑩ 全文检索算法,请问谁能给我点头绪落,不懂啊。。
全文检索技术
全文检索是指索引程序扫描文章中的每个词并建立对应索引,记录该词出现的位置和次数。当通过搜索引擎查询时,检索程序就在记录的索引进行查找并返回给用户。全文检索又分为基于字的全文索引和基于词的全文索引。基于字的全文索引会对内容中的每个字建立索引并记录,此方法查全率高,但查准率低,特别是对于中文,有时搜索马克,会列出马克思的结果。基于词的全文索引是把一个词语作为一个单位进行索引记录,并能处理同义词。搜索引擎有自己的词库,当用户搜索时,搜索引擎会从词库中抽取关键词作为索引项,这样可以大大提高检索的准确率。
中文分词技术
一直以来大家都比较熟悉网络,网络有自己的中文分词技术。一般采用的包括正向最大匹配,反向最大匹配,最佳匹配法,专家系统方法等。其中最大正向匹配是最常用的分词解决方案,它采用机械式算法,通过建立词典并进行正向最大匹配对中文进行分词。举个简单的例子比如搜索“北京大学在哪里”,则返回结果很多都是包含北京大学,北大等词语的网页,搜索引擎就是采用正向最大匹配去判断,把北京大学当做一个词语来索引记录并返回。当然,正向最大匹配也有不完整性,比如长度过长的词语,搜索引擎有时无法准确的分词,或者对前后都相互关联的词无法准确分词。例如“结合成分子时”,会被返回结合、成分、子时,而有时我们想要的关键词是“分子”。
很多时候网络都会根据自己词库中词语的权重进行拆分,权重的计算基于生活各个方面,比较复杂,搜索引擎要做的就是返回用户最想要的结果,有时站长们做网站要站在用户的角度去考虑问题,其实这也是站在搜索引擎的角度考虑问题,不论在确定目标关键词或者是长尾关键词时,都可以根据中文分词的原理来选择,这样可以最大化的减少无用功。
分词原理不断在变化,不断在更新,我们应该继续学习,只有掌握了本质才能抓住实质。