実用python+phpcmsv 9

6678 ワード

臭い足の女の子のブログから回って、役に立つと思って、ブロガーはブログを閉じたようで、残念です.
最近では,結巴分詞後の結果に基づいて,分詞後の集合を2つ比較し,ヤビック距離=集合の交差/集合の並列集合に基づいて,距離が最も大きい上位10の結果を算出し,同義語を考慮した.最後に毎日計算し、データベースに格納し、プログラムで呼び出します.
#               ,          ,        =       /      ,         10   ,       。      ,     ,     。
# coding=utf-8
import sys
reload(sys)
import MySQLdb
sys.setdefaultencoding('utf-8')
sys.path.append('../')
import jieba
jieba.initialize()
jieba.load_userdict("userdict.txt")
import jieba.analyse
import re
import operator
import string
f_ex = open('words.txt','rb')  #   
f_out = open('output.txt','wb')
words = [line.strip() for line in f_ex.readlines()]  #python       
conn = MySQLdb.connect(host="localhost",user="root",passwd="",db="root",charset="utf8")
cursor = conn.cursor()
cursor.execute("select a.id,a.title,a.description from v9_ask_a a limit 10")
data = cursor.fetchall()   #     
for x in data:
    f_out.write(str(x[0]).decode("utf-8")+'\t'+str(x[1]).decode("utf-8")+'\t')
    title = str(x[1]).decode("utf-8")
    tags_title = jieba.analyse.extract_tags(title, topK=10)
    for title_ex in tags_title:
        for title_word in words:
            if title_word.decode('gbk') == title_ex:
                title_ex = ''
        if title_ex != '':
            f_out.write(title_ex+'|')
    f_out.write('\r
') f_ex.close() f_out.close() cursor.execute("select * from v9_similar")  # similar = cursor.fetchall() newdata = {} for similardata in similar:     wordslist = similardata[1].decode("utf-8").split(',')     for wordx in wordslist:         newdata.setdefault(similardata[0],[]).append(wordx)  # , f_out = file('output.txt','rb') result = f_out.readlines() list1 = [] list2 = [] for x in result:     relate_table = x.split('\t')     list1.append(relate_table[0])     list2.append(relate_table[2]) list3 = dict(zip(list1,list2))    # 2 dic = {} for x in list3:     similarnum1 = []     list3x = list3[x].decode("utf-8")     new1 = list3x.split('|')     for new1x in new1:         for b in newdata:             for c in newdata[b]:                 if c.decode("utf-8") == new1x:                     similarnum1.append(b)  # id 1     for y in list3:         similarnum2 = []         if list3[x] != list3[y]:             list3y = list3[y].decode("utf-8")             new2 = list3y.split('|')             for new2x in new2:                 for e in newdata:                     for f in newdata[e]:                         if f.decode("utf-8") == new2x:                             similarnum2.append(e)  # id 2             jiao = len(list(set(new1)&set(new2)))   # 2             bing = len(list(set(new1)|set(new2)))   # 2             simlen = len(list(set(similarnum1)&set(similarnum2)))  #             jiao+=simlen             bing-=simlen             result = float(jiao)/float(bing)   #             dic.setdefault(x, { })[y] = result  # , dic2 = {} for x in dic:     dic1 = dic[x]     sorted_x = sorted(dic1.iteritems(), key=lambda dic1 : dic1[1], reverse=True)    #     sorted_x = sorted_x[0:10]   # 10     for y in sorted_x:         y = str(y)         z = y.split("'")[1]         dic2.setdefault(x, []).append(z) for x in dic2:     y = ",".join(dic2[x])   #     x = string.atoi(x)  #     value = [y,x]     cursor.execute('update v9_ask_a set relate_id=%s where id=%s',value)     conn.commit() cursor.close() conn.close()

実用的だと思って、残しておきます.の
1、phpcmsの設定拡張子にワークフローを追加してから、欄の発表を審査する必要がある2、pythonの相関計算の相関を計算する方法はtf-idfと余弦の類似性を使うことができる.http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html私はしばらくヤビック距離=集合の交差/集合の並列(英語名は不明)を用い,同義語を考慮した.まず文章を分詞し,結巴分詞が持参したtf−idfで最も重要な10個の分詞を抽出し,その後さらに比較して計算する.ヤビック距離計算は何も言うことはありませんが、計算するときに同義語をどう考えるかを話します.(1)データベース内にテーブルv 9_を新規作成するsimilar、それから2つのフィールドがあります:id、words、wordsは同義語を格納して、カンマで区切ります.(2)idとwordsを辞書に入れて、ワンタッチ多値
cursor.execute("select * from v9_similar")
similar = cursor.fetchall()
newdata = {}     //newdata         
for similardata in similar:
    wordslist =similardata[1].decode("utf-8").split(',')
    for wordx in wordslist:
        newdata.setdefault(similardata[0],[]).append(wordx)

(3)文章の上位10個の分詞と同義語を比較し,同義語の中に出現するものがあれば,同義語を改めるidを記録する.
for x in list3:  //                , "|"  
    similarnum1 = []
    list3x = list3[x].decode("utf-8")
    new1 = list3x.split('|')
    for new1x in new1:
        for b in newdata:
            for c in newdata:
                if c.decode("utf-8") == new1x:
                    similarnum1.append(b) //      ,   id      

このように,各文章が同義語と対比されると,各文章の類似idリストを形成することができる.次に,各文章の類似語リストを交差させることで,2文章にどれだけの分詞が類似しているかを計算できる.
jiao = len(list(set(new1)&set(new2)))
bing = len(list(set(new1)|set(new2)))
simlen = len(list(set(similarnum1)&set(similarnum2)))
//simlen           ID     
jiao+=simlen      //        simlen
bing-=simlen      //        simlen
result = float(jiao)/float(bing)

(4)計算した結果,類似文書のidをデータベーステーブルに格納し,カンマで区切る
    value = [y,x]
    cursor.execute('update v9_news set relate=%s where id=%s',value)

3、phpcmsテンプレート呼び出し計算した類似文章id
{pc:get sql="select * from v9_news where (id=$id and status=99)"}
  {loop $data $uu}
    {if $uu[relate] != ''} //      ,           ,         ,    
      {php $URLid=explode(',',$uu[relate]);}     //     id     , ID
         {loop $URLid $ab}
            {pc:get sql="select * from v9_news where id=$ab"}
               {loop $data $bc}
                  <a href="{$bc[url]}" target="_blank">{$bc[title]}</a>
               {/loop}
           {/pc}
       {/loop}
    {/if}
  {/loop}
{/pc}

4、pythonはランダムに監査状態の文章を取り、statusフィールドを99(監査状態が1)に設定すれば、発行できます.
生成された静的html記事であれば、レビュー済みの静的ページが生成されていない記事を一括生成する必要があります.
phpcms/modules/content/ディレクトリのcreate_を変更する必要がありますhtml.php
phpcms/modules/content/class/下url.class.php,html.class.php
次にmvcフレームワークに基づいて、パラメータを伝達すればいいです.
http://www.baidu.com/index.php?m=content&c=create_html&a=showzd&dosubmit=1&s=1&modelid=27&siteid=10&str=1093
5、最後のステップはpythonタイミング更新スクリプトをlinuxサーバに掛け、静的ページタイミングを生成してそのurlにアクセスすればいい.