信息检索库

irlib的Python项目详细描述


信息检索库
==


==我开始编写这个库,作为我的"信息检索和自然语言处理"(ir和nlp)的一部分<;http://www.uea.ac.uk/study/module/mod detail/cmpsmb29>;``东英吉利大学的模块<;http://www.uea.ac.uk/>;`。它主要用于检测评论垃圾邮件(机器学习-分类)。但是,它有更多的功能,如"向量空间模型(vsm)"<;http://en.wikipedia.org/wiki/vector_space_model>;`````,以及一些其他的ir功能,如标记化、n-grams、词干和pos(词性)标记。

要在您的计算机上安装python,可能需要另一个**可选的**模块,`nltk<;http://nltk.org/>;`
只有在词干和词性(词性)标记时才需要这个模块


要安装包,请编写::



代码组织
----


首先,代码分为以下主要组件:

。矩阵.py
指标。py
。分类器.py
。预处理器.py
。配置。py
。superlist.py

matrix.py:这是实现文档(矢量空间)索引的地方。


metrics.py:距离度量(余弦和欧几里德距离)。


classifier.py:在这里实现以下分类器:

*rocchio:rocchio classifier
*k nn:k-nn classivier
*bayes:naive bayes分类器

解析标记、词干和词性标记的re-files实现了
这里应该实现更多的特征选择算法(如互信息增益)。


和metrics.py,
但是您可能会发现preprocessor.py也很有用:

es:
prep=preprocessor()
mx=matrix()
metric=metric s()


为简单起见,假设您有一个文本文件tweets.txt,
,每一行代表一个单独的tweet(文档)。

我们将逐行阅读该文件,然后使用prepocessor将行标记为单词。
ngram_标记器有更多选项,例如生成bigrams,
将标记转换为较低的空间,词干和转换为pos。
但是,我们现在将坚持使用默认选项。
然后将文档加载到vsm中,又名矩阵。
关于频率和do_padding选项的更多信息,请参见:

fd=open('tweets.txt','r')
对于fd.readlines()中的行:
terms=prep.ngram_tokenizer(text=line)
mx.add_doc(doc id='some-unique-identifier',
doc terms=terms,
frequency=true,
do_padding=true)

ry.
我们还需要将查询中使用的术语与从文档中读取的术语对齐,
也就是说,我们需要将它们放在等长列表中,并忽略查询中的术语
在读取文档时以前看不到的::


terms=prep.ngram_tokenizer(text=q)
q_vector=query矢量(项,频率=假)

最后,为了得到与我们的查询最匹配的文档,
我们可以在矩阵中的所有文档上循环,并找到距离最小的文档。
我们只在这里显示循环,您可以很容易地比较距离,
并根据文档的相关性对文档进行排序,如果您想:

self.mx.docs中的文档:
distance=metric.euclid_vectors(doc['terms',q_vectors)

即,如果术语在文档中出现n次,则其频率为n。如果为false,则我们使用多变量(bernoulli)模式,
即,如果术语在文档中出现至少一次,则其频率为1
否则其频率为零。
如前所述,您通常需要多项式模式,
我们只是把bernoulli模式放在朴素的贝叶斯分类器上,每次添加新文档时,我们都会看到新的术语,因此如果术语表示矩阵中的列,文档表示行,那么我们可能会以长度大于订单行的新行结束。re是将较旧行的长度与较新行的长度对齐。
因此,您可以对每个新文档将其设置为true,
或在完成后调用mx.do_padding()。

请稍等,还有两个注意事项:

*在上一个示例中,我们尚未将vsm转换为tf.idf,
但是,通常需要这样做。因此,在加载文档和执行搜索之前,您必须调用以下方法:


mx.tf-idf()

assification
--------


您的代码应该执行以下操作:


*读取和分析配置文件::

目录:sample.conf
config=configuration(config_file='your_file.conf')
config.load_configuration()

*启动预处理器::

ern='\w+',lower=true,stem=false,pos=false,ngram=2)


评估模块:

/>ev=evaluation(config=config,fold=myfold)

*选择并启动所需的分类器[rocchio,knn或naive bayes]:

se=true或false
fold,请参见上面的详细信息
配置类和计算类的对象
ml=naivebayes(verbose=verbose,fold=myfold,config=confi)g,ev=ev)

*training::

#文档ID:您可以任意调用它
您应该告诉分类器该文档属于哪个类
;这应该与配置文件
ml中提到的类相同。添加文档(文档ID=文档ID,文档类=类名称,文档术语=术语)

*some house keeping::

你应该首先调用do padding来对齐和潮汐读取数据
ml.do_padding()

G::

就像在培训中一样,您可以使用预处理器
terms=prep.ngram_tokenizer(text=file_data)

评估结果:

行为
--

+name:tarek amr
+twitter:@gr33nda

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
试图读取字段“java”。lang.反对安卓。util。一对首先   gradle对java的影响。属性作为任务的输入?   java我的return语句不起作用。我做错了什么?   java通用同步代码块[无对象锁定]   macos Java小程序游戏不能在Mac上运行,即使它可以在PC上运行   java Firebase GeoFire设置位置未在服务中工作   java排序字符串对象   java通过JLabel上传背景图像(jpg)后,如何将图像缩放到它所在的面板上?   java无法连接到jsp中的数据库   java如何在整个ant taskdef操作的执行过程中拥有一个singleton类实例   java如何在按键事件中检查JTtextField中的字符串数字验证器   如何最好地输出大型单行XML文件(使用Java/Eclipse)?   内存不足,Java运行时环境无法在Java应用程序中继续运行   java Hibernate连接错误:组织上的NullPointerException。冬眠hql。阿斯特。HqlSqlWalker。createFromJoinElement   linux将参数从shell脚本传递到java类   java对于接受多个参数的setter是否有类似于@JsonCreator的注释?   java在链表中添加节点