python搜索文本文件中的中文词汇并输出词汇所在行的内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python搜索文本文件中的中文词汇并输出词汇所在行的内容相关的知识,希望对你有一定的参考价值。

参考技术A for lnum, line in enumerate(open('ur path')):
if 'key' in line:
print(lnum, line)追问

你这个不能找中文的啊,我的文本有中文,有数字 我要根据中文找出内容。

追答

中文就涉及编码了,用二进制字符串就ok了;

参考技术B 文本文件的编码(encoding)是什么?utf8/utf16/utf32?GB2312/GBK/GB18030?
根据不同的编码规则,判断字符是否处在汉字的区位即可。

全文检索引擎Apache Lucene词汇表和架构

1)基本词汇:

文档 document):索引和搜索时使用的主要数据载体,包含一个或多个存有数据的字段。 可以看成相当于RDBMS的表记录(record

字段 field):文档的一部分,包含名称和值两部分。 可以相当于RDBMS的列(column)

term):一个搜索单元,表示文本中的一个词。

标记 token):表示在字段文本中出现的词,由这个词的文本、开始和结束偏移量以及类型组成。

 

Apach Lucene将所有信息写到一个倒排索引(inverted index)的数据结构中,其中的数据是面向词而不是面向文档的,倒排索引建立了索引中词和文档之间的映射。

举个例子,有以下三篇文档的标题字段需要被索引:

Elasticsearch Server 1.0 (document 1)

Mastering Elasticsearch (document 2)

Apache Solr 4 Cookbook (document 3)

 

那么简化版的索引可以看成是这样的:

计数

文档

1.0

1

1>

1>

4

1

3>

3>

Apache

3>

3>

Cookbook

1

3>

3>

Elasticsearch

2

1>,2>

2>1>

Mastering

2>

2>

Server

1>

1>

 Solr

3>

3>

每一个词指向包含它的文档编号。这样就可以执行一种非常高效且快速的搜索,比如基于词的查询。此外,每个词有一个计数,告诉Lucene该词出现的频率。实际Lucene创建的索引要比这个复杂及先进许多,创建的额外文件包含了词向量(term vector),文档值(doc value)等信息。

 

每个索引分为多个“写一次,读多次”(write once and read many time)的段(segment)。多个段可以通过段合并 segments merge)合并在一起。当强制段合并或者Lucene决定合并时,这些小段就会由Lucene合并成更大的一些段。合并需要I/O。在合并时,不再需要的信息将被删除(例如,被删除的文档)。除此之外,检索大段比检索存有相同数据的多个小段速度更快。

 

2)输入数据分析:

传入的文档中的数据怎样转化成倒排索引,查询文本怎样变成可被搜索的词?这个数据转化过程被称为分析(analyze)。分析的工作由分析器analyzer 完成,它由一个 分词器 tokenizer)和零个或多个标记过滤器(token filter)组成,也可以有零个或多个字符映射器(character mapper)。

Lucene中的分词器把文本分割成多个标记,基本就是词加上一些额外信息,比如该词在原始文本中的位置和长度。分词器的处理结果称为 标记流 token stream),它是一个接一个的标记,准备被过滤器处理。以下是一些过滤器例子。

小写过滤器(lowercase filter):把所有的标记变成小写。

同义词过滤器(synonyms filter):基于基本的同义词规则,把一个标记换成另一个同义的标记。

多语言词干提取过滤器(multiple language stemming filter):减少标记(实际上是标记中的文本部分),得到词根或者基本形式,即词干。

 

建立索引时,Lucene会使用你选择的分析器来处理你的文档内容。不同的字段可以使用不同的分析器,也可以不分析字段。

查询时,查询将被分析。但是,也可以选择不分析。记住这一点很关键,因为一些Elasticsearch查询被分析,一些则不然。例如,前缀和词查询不被分析,匹配查询则被分析。可以在被分析查询和不被分析查询两者中选择非常有用。有时,可能希望查询一个未经分析的字段,而有时则希望有全文搜索的分析。如果我们查询LightRed这个词,标准分析器分析这个查询后,会去查询lightred;如果我们使用不经分析的查询类型,则会明确地查询LightRed这个词。索引应该和查询词匹配。如果它们不匹配,Lucene不会返回所需文档。

 

3)评分(scoring)和查询相关性:

得分是根据文档和查询的匹配度使用计分公式计算的结果。默认情况下,Apache Lucene使用TF/IDFterm frequency/inverse document frequency,词频/逆向文档频率)评分机制,这是一种计算文档在我们查询上下文中相关度的算法。当然,它不是唯一可用的算法。ElasticsearchLucene计算的分数值越高,意味着文档越相关。一些参数(比如boost)、不同的查询类型、不同的评分算法,都会影响得分的计算。



引用:Marek Rogoziński; Rafał Kuć. Elasticsearch服务器开发(第2版)人民邮电出版社


以上是关于python搜索文本文件中的中文词汇并输出词汇所在行的内容的主要内容,如果未能解决你的问题,请参考以下文章

Python TfidfVectorizer 抛出:空词汇;也许文件只包含停用词”

python 自然语言处理____词典资源

全文检索引擎Apache Lucene词汇表和架构

爬虫小案例:联想词汇搜索

201671030126 词频统计软件项目报告

进阶实验5-3.3 基于词频的文件相似度 (30分)-哈希