(一)jieba切词
切词
- 三种模式:
1) 精确模式:试图将句子最精确地切开,适合文本分析;
2)全模式:把句子中所有的可以成词的词语都扫描出来;
3)搜索引擎模式:在精确模式基础上,对长词再次切分,提高召回率。- 用法:
seg_list = jieba.cut(s, cut_all=True)
#全模式
seg_list = jieba.cut(s, cut_all=False)
#精确模式
jieba.lcut
jibe.lcut_for_search
自定义词典
- 语料库,
dict.txt
里录入了两万多条词。- 虽然 jieba 有新词识别能力,但自行添加新词可以保证更高的正确率
- 用法:
jieba.load_userdict(file_name) # file_name
词典格式和dict.txt
一样,一个词占一行;每一行分三部分:词语、词频、词性,用空格隔开。
词频省略时使用自动计算能保证分出该词的词频。
算法
- trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。一个节点的所有子孙都有相同的前缀,根节点对应空字符串,值是词频。
- 基于统计词典,构造一个前缀词典;然后利用前缀词典对输入句子进行切分,得到所有的切分可能,根据切分位置,构造一个有向无环图;通过动态规划算法(从后往前,有向无环图从前指向后,对于一个节点,只知道这个节点会指向后面哪些节点,但是我们很难直接知道有哪些前面的节点会指向这个节点)计算得到最大概率路径,也就得到了最终的切分形式。
- 对于未登录词,利用隐马尔可夫模型进行分词,将分词问题视为一个序列标注问题,其中,句子为观测序列,分词结果为状态序列,有{B、M、E、S}四种状态,分别表示{开始、中间、结束、单个}。首先通过语料训练出隐马尔可夫模型,然后利用Viterbi算法进行求解,最终得到最优的状态序列,然后再根据状态序列,输出分词结果。(齐次马尔科夫性假设,观测独立性假设)
为什么要切词
- 词是最小的有意义的语言成分,英文单词之间有空格,而汉语以字为基本单位,词语之间没有明显的区分。飘红长度计算的时候是关键词在title中才飘红,而不是一个字在title中就飘红。
(二)飘红
把query进行切词,然后对于每个词,如果这个词在title中,飘红长度就加上这个词的长度,如果这个词在describe中,标红长度加上这个词长度*0.6。
def s_longest_common_string_uncontinue2(self, dependlist):
if len(dependlist) != 2:
return -1
sentence1 = urllib.unquote(dependlist[0].strip())
sentence2 = urllib.unquote(dependlist[1].strip())
if len(sentence1) == 0 or len(sentence2) == 0:
return -1
if sentence1 == "\N" or sentence2 == "\N":
return -1
wordlist1 = self.str2word(sentence1)[0]
word1_num = len(wordlist1)
word1_len = len(sentence1)
if word1_num == 0:
return 0
term_len = 0
for ele in wordlist1:
if ele in sentence2:
term_len += len(ele)
return term_len
网友评论