実用python+phpcmsv 9
臭い足の女の子のブログから回って、役に立つと思って、ブロガーはブログを閉じたようで、残念です.
最近では,結巴分詞後の結果に基づいて,分詞後の集合を2つ比較し,ヤビック距離=集合の交差/集合の並列集合に基づいて,距離が最も大きい上位10の結果を算出し,同義語を考慮した.最後に毎日計算し、データベースに格納し、プログラムで呼び出します.
実用的だと思って、残しておきます.の
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を辞書に入れて、ワンタッチ多値
(3)文章の上位10個の分詞と同義語を比較し,同義語の中に出現するものがあれば,同義語を改めるidを記録する.
このように,各文章が同義語と対比されると,各文章の類似idリストを形成することができる.次に,各文章の類似語リストを交差させることで,2文章にどれだけの分詞が類似しているかを計算できる.
(4)計算した結果,類似文書のidをデータベーステーブルに格納し,カンマで区切る
3、phpcmsテンプレート呼び出し計算した類似文章id
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にアクセスすればいい.
最近では,結巴分詞後の結果に基づいて,分詞後の集合を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にアクセスすればいい.