Przeglądaj źródła

提交新版本

ChenGanBin 4 lat temu
rodzic
commit
ab63fb9d7b

+ 56 - 22
analyse.py

@@ -3,7 +3,8 @@
 import math
 import jieba
 import re
-
+import os
+import pickle
 
 word_dict = {}
 
@@ -55,15 +56,15 @@ def vector_cos(v_multi, a_v_ss, b_v_ss):
     """
     return v_multi / (math.sqrt(a_v_ss) * math.sqrt(b_v_ss))
 
-def cal_cos(a_word, b_word):
+def cal_cos(a_word, b_word, word_dict):
     """
     计算两个长尾关键词的余弦值
     """
-    a_word_root = cut_word(a_word)
-    b_word_root = cut_word(b_word)
+    # a_word_root = cut_word(a_word)
+    # b_word_root = cut_word(b_word)
 
-    # a_word_root = word_dict[a_word]
-    # b_word_root = word_dict[b_word]
+    a_word_root = word_dict[a_word]
+    b_word_root = word_dict[b_word]
 
     # 合并词根,用于生成词向量
     union_word_root = merge_word_root(a_word_root, b_word_root)
@@ -83,21 +84,51 @@ def cal_cos(a_word, b_word):
     return cos_val
 
 
-# with open(DATA_FILE, "r", encoding="UTF-8") as f:
-#     lines = f.readlines()
-#     for line in lines[:1000000]:
-#         line = line.replace("\n", "")
-#         word_root = cut_word(line)
-#         word_dict[line]=word_root
-
-# key_list = list(word_dict.keys())
-# for i, a_key in enumerate(key_list[:-1]):
-#     for j, b_key in  enumerate(key_list[i+1:]):
-#         if j % 100000 == 0 :
-#             print("正在处理:%d, %d" % (i, j))
-#         cos_val = cal_cos(a_key, b_key)
-#         if cos_val > 0 :
-#             print("%s 与 %s 的余弦值:%d " % (a_key, b_key, cos_val))
+def load_word_root_cache():
+    word_root_cache = {}
+
+    if os.path.exists("./data/pkl/word_root_cache.pkl"):
+        print("存在缓存,开始加载")
+        with open("./data/pkl/word_root_cache.pkl", "rb") as f:
+            word_root_cache = pickle.load(f)
+            return word_root_cache
+
+    print('不存在缓存,开始构建分词字典')
+    with open("./data/分词结果_bak.txt", "r", encoding="UTF-8") as f:
+        lines = f.readlines()
+        for line in lines:
+            index = line.index(",")
+            word_root_cache[line[:index]] = line[index+1:]
+    
+    print("构建完成,保存到本地")
+    with open("./data/pkl/word_root_cache.pkl", "wb") as f:
+        pickle.dump(word_root_cache, f)
+    
+    return word_root_cache
+
+word_dict = load_word_root_cache()
+
+key_list = list(word_dict.keys())
+for i, a_key in enumerate(key_list[:-1]):
+    with open("./data/category/%s.txt" % a_key, "w", encoding="UTF-8") as f:
+        f.write(a_key)
+        f.write("\n\n")
+
+        del_container = []
+        for j, b_key in  enumerate(key_list[i+1:]):
+            if j % 100000 == 0 :
+                print("正在处理:%d, %d" % (i, j))
+            cos_val = cal_cos(a_key, b_key, word_dict)
+            if cos_val > 0.8 :
+                print("%s 与 %s 的余弦值:%f " % (a_key, b_key, cos_val))
+                f.write(b_key)
+                f.write("\n")
+        
+        key_list.remove(a_key)
+        if len(del_container) > 0:
+            print("删除已处理的元素")
+            for item in del_container:
+                key_list.remove(item)
 
 
 
@@ -106,4 +137,7 @@ def cal_cos(a_word, b_word):
 # cos_val = cal_cos(a_word, b_word)
 # print(cos_val)
 # print("的余弦值:%f " % ( cos_val))
-# print(cut_word(b_word))
+# print(cut_word(b_word))
+
+# 1. 使用缓存中的分词
+# 2. 余弦值超过0.8的视为一组

+ 146 - 0
analyse2.py

@@ -0,0 +1,146 @@
+# -*- coding:utf-8 -*-
+
+import os
+import re
+import pickle
+import math
+from multiprocessing import Manager, Process
+
+
+# 分词结果
+CUT_WORD_RESULT = "./data/分词结果_bak.txt"
+
+# 分词缓存
+CUT_WORD_CACHE = "./data/pkl/word_root_cache.pkl"
+
+# 分析保存结果
+ANALYSE_OUTPUT_FILE = "./data/category/%s.txt"
+
+# 正则表达式中的特殊符号
+SPECIAL_SIMBOL = [".", "?", "^", "$", "*", "+", "\\", "[", "]", "|", "{", "}", "(", ")"]
+
+def merge_word_root(word_root_a, word_root_b):
+    """
+    合并词根
+    """
+    return list(set(word_root_a).union(set(word_root_b)))
+
+def gen_word_vector(word_a, word_b, word_root_union):
+    """
+    生成词向量
+    """
+    a_word_vector, b_word_vector = [], []
+    for word in word_root_union:
+        if word in SPECIAL_SIMBOL :
+            word = "\\" + word
+        a_word_vector.append(len(re.findall(word, word_a)))
+        b_word_vector.append(len(re.findall(word, word_b)))
+    return a_word_vector, b_word_vector
+
+def vector_multi(a_vector, b_vector):
+    """
+    向量相乘求和
+    """
+    return sum(map(lambda a_b: a_b[0]*a_b[1], zip(a_vector, b_vector)))
+
+def vector_square_sum(word_vector):
+    """
+    向量平方求和
+    """
+    sum = 0
+    for i in word_vector:
+        sum = sum + i * i
+    return sum
+
+def vector_cos(v_multi, a_v_ss, b_v_ss):
+    """
+    计算余弦值
+    """
+    return v_multi / (math.sqrt(a_v_ss) * math.sqrt(b_v_ss))
+
+def cal_cos(a_word, b_word, word_dict):
+    """
+    计算两个长尾关键词的余弦值
+    """
+    a_word_root = word_dict[a_word]
+    b_word_root = word_dict[b_word]
+
+    # 合并词根,用于生成词向量
+    union_word_root = merge_word_root(a_word_root, b_word_root)
+
+    # 生成词向量
+    a_vector, b_vector = gen_word_vector(a_word, b_word, union_word_root)
+
+    # 词向量相乘求和
+    ab_vector_multi = vector_multi(a_vector, b_vector)
+
+    # 向量平方求和
+    a_vector_squar_sum = vector_square_sum(a_vector)
+    b_vector_squar_sum = vector_square_sum(b_vector)
+
+    cos_val = vector_cos(ab_vector_multi, a_vector_squar_sum, b_vector_squar_sum)
+
+    return cos_val
+
+def process(global_word_root, global_del_cache, a_key, keys):
+    container = []
+    total_num = len(keys)
+    for j, b_key in  enumerate(keys):
+        if j % 100000 == 0 :
+            print("处理进度:%d / %d" % (j, total_num))
+        cos_val = cal_cos(a_key, b_key, global_word_root)
+        if cos_val > 0.8 and b_key not in global_del_cache :
+            print("%s 与 %s 的余弦值:%f " % (a_key, b_key, cos_val))
+            container.append(b_key)
+            global_del_cache.append(b_key)
+
+    with open(ANALYSE_OUTPUT_FILE % a_key, "w", encoding="UTF-8") as f:
+        f.write(a_key)
+        f.write("\n")
+        for b_key in container:
+            f.write(b_key)
+            f.write("\n")
+
+def load_word_root_cache():
+    """
+    加载分词缓存
+    """
+
+    word_root_cache = {}
+
+    if os.path.exists(CUT_WORD_CACHE):
+        print("存在缓存,开始加载")
+        with open(CUT_WORD_CACHE, "rb") as f:
+            word_root_cache = pickle.load(f)
+            return word_root_cache
+
+    print('不存在缓存,开始构建分词字典')
+    with open(CUT_WORD_RESULT, "r", encoding="UTF-8") as f:
+        lines = f.readlines()
+        for line in lines:
+            index = line.index(",")
+            word_root_cache[line[:index]] = line[index+1:]
+    
+    print("构建完成,保存到本地")
+    with open(CUT_WORD_CACHE, "wb") as f:
+        pickle.dump(word_root_cache, f)
+    
+    return word_root_cache
+
+
+def main():
+
+    word_root_cache = load_word_root_cache();
+
+    keys = [key for key in word_root_cache.keys()]
+
+    manager = Manager()
+    global_word_root = manager.dict(word_root_cache)
+    global_del_cache = manager.list()
+
+    p = Process(target=process, args=(global_word_root, global_del_cache, keys[0], keys[1:]))
+    p.join()
+
+
+if __name__ == "__main__":
+    main()

+ 185 - 0
data/category/白凉粉是什么东西.txt

@@ -0,0 +1,185 @@
+白凉粉是什么东西
+
+铁粉是什么东西
+白带是什么东西
+粉粉是什么东西
+什么东西是白的
+白膜是什么东西
+黄白是什么东西
+果粉是什么东西
+粉刺是什么东西
+白莲是什么东西
+血粉是什么东西
+白银是什么东西
+蛋白是什么东西
+白土是什么东西
+臭粉是什么东西
+鸡粉是什么东西
+淀粉是什么东西
+蛋白粉是什么东西
+钛白粉什么东西
+粉虫是什么东西
+冰粉是什么东西
+生粉是什么东西
+瑞粉是什么东西
+粉尘是什么东西
+太粉是什么东西
+食粉是什么东西
+海粉是什么东西
+白胶是什么东西
+太白粉是什么东西
+白术是什么东西
+白粮是什么东西
+白果是什么东西
+粉贝是什么东西
+白子是什么东西
+肠粉是什么东西
+葱白是什么东西
+白洞是什么东西
+藕粉是什么东西
+茭白是什么东西
+干粉是什么东西
+糖粉是什么东西
+水粉是什么东西
+鱼白是什么东西
+磷粉是什么东西
+口白是什么东西
+菊粉是什么东西
+鞋粉是什么东西
+澄粉是什么东西
+白柑是什么东西
+白矾是什么东西
+牙粉是什么东西
+粉葛是什么东西
+什么东西是白色
+粉刺白色东西是什么
+黑粉是什么东西
+面粉是什么东西
+太白粉水是什么东西
+粉嫩是什么东西
+白薯是什么东西
+石粉是什么东西
+凉薯是什么东西
+肽粉是什么东西
+粉瘤是什么东西
+粉扑是什么东西
+麻粉是什么东西
+白芷是什么东西
+白练是什么东西
+凉粉是什么东西做的
+醋白是什么东西
+矿粉是什么东西
+钼粉是什么东西
+凉是什么东西
+粉末是什么东西
+结粉是什么东西
+白酱是什么东西
+白浆是什么东西
+烟粉是什么东西
+薤白是什么东西
+白凉粉是什么东西做的
+什么东西是米白
+钛白粉是什么东西
+小粉是什么东西
+粉沫是什么东西
+墨粉是什么东西
+什么东西是粉
+白条是什么东西
+白虎是什么东西
+凉粉是什么东西
+花粉是什么东西
+海白是什么东西
+凉霸是什么东西
+什么东西是凉的
+骨粉是什么东西
+白点是什么东西
+粉云是什么东西
+什么东西是黑白
+草粉是什么东西
+药粉是什么东西
+什么东西是凉性
+白水是什么东西
+金粉是什么东西
+白斑是什么东西
+云粉是什么东西
+发粉是什么东西
+菌粉是什么东西
+炸粉是什么东西
+白沫是什么东西
+根粉是什么东西
+蜜粉是什么东西
+丁粉是什么东西
+粉底是什么东西
+粉姜是什么东西
+白宝是什么东西
+粉画是什么东西
+白油是什么东西
+奥粉是什么东西
+墙粉是什么东西
+白羊是什么东西
+牛粉是什么东西
+白云是什么东西
+羊粉是什么东西
+白盐是什么东西
+散粉是什么东西
+鱼粉是什么东西
+上白面粉是什么东西
+白灰是什么东西
+铜粉是什么东西
+白蜡是什么东西
+粉饼是什么东西
+白碱是什么东西
+饼粉是什么东西
+葛粉是什么东西
+铅粉是什么东西
+羊白是什么东西
+铑粉是什么东西
+该粉是什么东西
+白泥是什么东西
+什么东西是白心
+蛋白粉是些什么东西
+什么东西是凉肠
+白霍是什么东西
+白榉是什么东西
+白菌是什么东西
+干的白凉粉是什么东西
+凉粉熬的是什么东西
+隥粉是什么东西
+粉醇是什么东西
+凉粉是什么东西做了
+老凉粉是什么东西
+粉欧是什么东西
+食用的白凉粉是什么东西
+直粉是什么东西
+白望是什么东西
+白凉粉是什么东西制做的
+白氿是什么东西
+奶白是什么东西
+肝蛋白粉是什么东西
+花生凉粉是什么东西
+奴粉是什么东西
+白宇是什么东西
+白粉学校是什么东西
+粉贴是什么东西
+5白是什么东西
+凉粉浆是什么东西
+铲粉是什么东西
+白凉粉是什么东西怎么用
+白腿是什么东西
+梨白粉病是什么东西
+白塘是什么东西
+请问白凉粉是什么东西做的
+罩粉是什么东西
+白醋是什么东西
+炸东西粉是什么
+米粉是什么东西
+芯粉是什么东西
+白糠是什么东西
+s粉是什么东西
+白色粉刺是什么东西
+果冻白凉粉是什么东西啊
+吸的白粉是什么东西
+鸟粉是什么东西
+虎粉是什么东西
+白色粉圆是什么东西
+肩粉是什么东西

+ 44 - 0
data/category/腋下长了一个小疙瘩是什么东西.txt

@@ -0,0 +1,44 @@
+腋下长了一个小疙瘩是什么东西
+
+下巴长了一个东西是什么
+腋下长个东西是什么
+腋下长了一个小肉芽什么东西
+腋下长了个大疙瘩很疼是什么东西
+食指下面长了一个疙瘩是什么东西
+腋下长了小疙瘩是什么东西不疼
+下嘴唇长了个疙瘩是什么东西
+腋下长一小疙瘩很痛是什么东西
+腋下长了个坨是什么东西
+腋下痒长了一个疙瘩是什么东西
+脖子长了一个小疙瘩是什么东西
+腋下长了一个小肉球什么东西
+腋下长了个小软块是什么东西
+脚上长了个小疙瘩是什么东西
+腋下长几个小疙瘩是什么东西
+手臂长了一个小疙瘩是什么东西
+腋下长小红疙瘩是什么东西
+舌头长了个小疙瘩是什么东西
+腋下长了一个小长条是什么东西
+肋骨下面长了一个疙瘩是什么东西
+腋下长了一个圆疙瘩是什么东西
+脚根部长了一个小疙瘩是什么东西
+下巴长了个疙瘩是什么东西
+腋窝前长了一个小疙瘩是什么东西
+腋下偶尔长一个小疙瘩是什么东西
+副乳长了一个小疙瘩是什么东西
+腋下长了一条小疙瘩是什么东西
+腋下长了一个小硬包是什么东西
+腋下皮下长了小疙瘩是什么东西
+腋下长了一个小黑疙瘩是什么东西
+腋窝里面长了个小疙瘩是什么东西
+腋下长了几个小疙瘩什么东西
+腋下长了一团小疙瘩是什么东西
+胳肢窝长了一个小疙瘩是什么东西
+胸上长了一个小疙瘩是什么东西
+腋下长了一片红小疙瘩是什么东西
+腋下长了几个硬疙瘩是什么东西
+腋下长了几个个小疙瘩是什么东西
+下面长了个小疙瘩是什么东西
+腋下长了一些小红疙瘩是什么东西
+腋下长了一串小疙瘩是什么东西
+腋下长了个小疙瘩是什么原因