1. 对文章等需要搜索的数据进行分词处理,识别出每个文章的关键词,并构建倒排索引,存储在数据库中。
常见的分词方法主要有:
1. 基于定界符的分词:
利用空格、逗号等定界符将句子切分,如“好/会计/有/没有/试用版/的”。简单但无法处理没有定界符的词,效果较差。
好/会计/有/没有/试用版/的
2. 基于词典的分词:
使用词典查找句子中最长的词或词组进行切分,如“好会计/有/没有/试用版/的”。需要词典支持,对新词处理较弱
word_dict = ["好会计", "试用版"]
sentence = "好会计有没有试用版的"
result = []
i = 0
while i < len(sentence):
# 找最长词匹配
longest_word = ""
for word in word_dict:
if sentence[i:i+len(word)] == word:
longest_word = word
if longest_word:
result.append(longest_word)
i += len(longest_word)
else:
result.append(sentence[i])
i += 1
print("/ ".join(result))
3. 基于N元文法的分词:
使用N元文法构建出所有的可能切分,然后选择概率最高的切分,如“好会计/有/没有/试用版/的”。需要训练语料构建模型,计算量较大。
好会计/有/没有/试用版/的
4. 基于HMM的分词:
使用HMM模型判断切分位置的概率,选择概率最高的切分,如“好会计/有/没/有/试用/版/的”。需要训练模型,效果较好但计算复杂。
好会计/有/没/有/试用/版/的
5. 基于CRF的分词:
在HMM的基础上,引入语料标注的概率进行全局最优解决,可以得到“好会计/有/没有/试用版/的”的切分结果。训练代价高但效果较优。
好会计/有/没有/试用版/的
6. 基于深度学习的分词:使用神经网络进行端到端的分词,可以学到词与上下文的表示,效果优于统计方法。对句子“好会计有没有试用版的?”,不同方法的具体分词
好会计/有/没有/试用版/的
在分词领域,有几个比较好的开源实现方案:
1. Jieba - 是一个结巴分词工具,可以用于中文文本的分词,支持Python和C++两种语言版本,性能较高,分词结果较为准确,社区支持度也较好。
github.com/fxsjy/jieba](link.zhihu.com/?target=htt…)
2. HanLP - 是一个中文分词工具包(支持词性标注和命名实体识别),提供了一系列中文NLP工具,支持Java和Python,效果较优,但学习曲线稍高。
github.com/hankcs/HanLP](link.zhihu.com/?target=htt…)
3. THULAC - 由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文分词工具包,支持Python和C++,分词速度和效果都较优,但stopsword词表较小。
github.com/thunlp/THULAC](link.zhihu.com/?target=htt…)
4. IKAnalyzer - 采用了特有的“正向迭代最长匹配算法“,支持中文,日语和韩语,提供了Analyzer和Tokenizer两个分词算法,支持Java,效果较好,但不支持其他语言。
github.com/kedou/ik-analyzer](link.zhihu.com/?target=htt…)
5. SnowNLP - 是一个Python下的中文文本处理工具,提供分词、词性标注、情感分析等功能,使用简单,但分词效果稍差,只支持Python。
github.com/isnowfy/snownlp](link.zhihu.com/?target=htt…)
6. FudanNLP - 复旦大学自然语言处理实验室开源的一套中文NLP工具包,包含分词、词性标注、NER等多个模块,支持Java和Python two,效果较优,社区活跃度一般。
github.com/FudanNLP/fnlp](link.zhihu.com/?target=htt…)
2. 根据词频等计算每个关键词与文章等权重,也存储在数据库中。
分词
知识id
权重
好会计
1
0.9
有没有
2
0.8
试用版
3
0.7
权重计算
1. TF-IDF:
词频(Term Frequency)与逆文档频率(Inverse Document Frequency)的组合。
-
TF:某词在一篇文档中出现的频率,表示词与文档的相关度。TF值越大,表示词与文档越相关。
-
IDF:ln(总文档数/包含词的文档数)。IDF值越大,表示词越具有区分度。
-
权重:TF * IDF。权重值越大,表示词与文档的关联程度越大。
2. BM25:
与TF-IDF类似,但在计算TF时针对不同文档长度进行了调整,并考虑词频饱和的影响,得到更准确的TF值。权重计算公式较TF-IDF复杂。
3. 词频:
直接采用词在文档中出现的次数作为权重。简单但无法衡量词的区分度,易受长文档影响。
4. 词性与位置:
- 考虑词性(如名词)以及出现位置(如标题)等因素赋予权重。但需进行词性标注和位置识别,实现难度较大。任何一种权重计算方法都需要进行如下步骤:
- 1. 统计词频:统计词在每个文档中的出现次数。
- 2. 计算TF:根据词频和文档长度计算TF值。常用公式有:-TF = 词频 / 文档总词数;TF = 1 + log(词频) (平滑处理)
- 3. 计算IDF:统计包含该词的文档数,然后计算IDF = ln(总文档数/包含词的文档数)
- 4. 权重计算:根据所选方法(如TF-IDF)计算权重。权重 = TF * IDF
- 5. 存储与索引:将权重信息存储,以便于搜索时排序与匹配。
3. 用户输入搜索词后,进行分词得到多个关键词。
4. 在倒排索引中找到包含所有关键词的文章列表。
5. 根据关键词与文章的权重计算每个文章的得分。得分越高表示匹配度越高。
6. 对文章列表按得分排序,返回排名最高的TOP N篇文章。
7. 新数据加入需要重新构建索引和计算权重,实现实时搜索。