用戶(hù)畫(huà)像(三)|通過(guò)用戶(hù)對(duì)不同文章的不同行為(瀏覽、點(diǎn)贊、評(píng)論、分享)提取用戶(hù)標(biāo)簽

最近我們對(duì)我們平臺(tái)的用戶(hù)進(jìn)行了一個(gè)用戶(hù)標(biāo)簽提取,這中間的主要流程如下圖3-1所示:

圖3-1

一、梳理做用戶(hù)畫(huà)像需要的數(shù)據(jù)
用戶(hù)畫(huà)像是基于業(yè)務(wù)數(shù)據(jù)而進(jìn)行的,如果前期沒(méi)有考慮好這一點(diǎn),那么在真正實(shí)操時(shí)會(huì)發(fā)現(xiàn)做分析需要的數(shù)據(jù)存在不同的業(yè)務(wù)表里面,甚至有些數(shù)據(jù)根本沒(méi)有保存。所以,在做用戶(hù)畫(huà)像之前最需要做的事就是梳理清楚到底需要哪些數(shù)據(jù),如果業(yè)務(wù)上沒(méi)有保存,那么就增加保存,如果數(shù)據(jù)非常分散,最好是集中保存下,否則后面隨著數(shù)據(jù)越來(lái)越大,從多個(gè)業(yè)務(wù)表里面匯總數(shù)據(jù)也是一個(gè)非常麻煩的事。
如上圖,如果我們要獲取的是用戶(hù)點(diǎn)贊、評(píng)論、分享、瀏覽的數(shù)據(jù),那么可以使用AOP把用戶(hù)做這些請(qǐng)求的數(shù)據(jù)記錄到一個(gè)日志里面。例如:

字段名 字段說(shuō)明 示例
user_id 用戶(hù)id 1
operation_type 行為類(lèi)型 1-點(diǎn)贊、2-評(píng)論、3-分享、4-瀏覽
operation_content_id 內(nèi)容idt 1
operation_time 操作時(shí)間 2018.4.17

接下來(lái)就是對(duì)內(nèi)容id進(jìn)行去重,可以直接使用Set去重,去重之后可以去內(nèi)容表里面通過(guò)內(nèi)容id獲取到內(nèi)容的URL地址,因?yàn)槲覀兊膬?nèi)容是不保存在本地的,所以需要通過(guò)內(nèi)容的URL去第三方平臺(tái)拿信息。

二、通過(guò)URL獲取內(nèi)容的標(biāo)題和正文
對(duì)于一篇文章來(lái)說(shuō),標(biāo)題和正文是最有價(jià)值的,對(duì)于提取標(biāo)簽這個(gè)事來(lái)說(shuō),也是需要標(biāo)題和正文的。提取的方式有很多,比如可以單獨(dú)寫(xiě)針對(duì)不同平臺(tái)的爬蟲(chóng)進(jìn)行提取信息,但是這樣的成本很大。為了保證提取的內(nèi)容確實(shí)是正文,也不能簡(jiǎn)單的使用driver.find_element_by_xpath('//body').text的方式,因?yàn)檫@樣取出來(lái)的數(shù)據(jù)有很多干擾信息,會(huì)把整個(gè)頁(yè)面的所有信息都獲取出來(lái)當(dāng)作正文,包括推薦的內(nèi)容,包括廣告...頁(yè)面上呈現(xiàn)的所有內(nèi)容。代碼如下:

# 爬取文章內(nèi)容
driver = chrome_dirver()
driver.set_page_load_timeout(20)
# 假設(shè)文章的URL存放在article.json文件中
with open('article.json') as f:
    article = f.read()
    article = json.loads(article)
    for k, v in article.iteritems():
        try:
            article_id = k
            article_url = v
            driver.get(v)
            article_title = driver.title
            article_info = driver.find_element_by_xpath('//body').text
            # 這里已經(jīng)獲取到文章標(biāo)題和正文   
        except Exception as e:
            print e
            continue
    driver.close()
    driver.quit()

GitHub上有牛人寫(xiě)了一個(gè)基于行塊分布函數(shù)的通用網(wǎng)頁(yè)正文抽取算法的Python版本。我們通過(guò)測(cè)試發(fā)現(xiàn)準(zhǔn)確性是還可以的,GitHub地址https://github.com/chrislinan/cx-extractor-python

三、通過(guò)百度的自然語(yǔ)言算法AipNlp計(jì)算出所有文章的標(biāo)簽及對(duì)應(yīng)權(quán)重
獲取到文章的標(biāo)題和正文之后,就是需要提取這篇文章的標(biāo)簽以及標(biāo)簽的權(quán)重。當(dāng)然我們可以自己使用開(kāi)源的分詞算法,但是如果沒(méi)有“詞語(yǔ)-有效標(biāo)簽”的庫(kù),就是把文章的分詞做好之后也很難提取有效的標(biāo)簽。我們這邊考慮的是使用百度的自然語(yǔ)言算法AipNlp來(lái)幫助我們做這個(gè)事。為什么使用百度云,而不使用騰訊云或者阿里云?因?yàn)轵v訊的“詞語(yǔ)-有效標(biāo)簽”庫(kù)偏社交,阿里的“詞語(yǔ)-有效標(biāo)簽”偏電商,百度就是庫(kù)是最全的。
使用百度云中的自然語(yǔ)言處理SDK很簡(jiǎn)單,可以直接查看他的SDK文檔,有Python、Java、PHP、Node各種語(yǔ)言的。
例如使用Java的,先增加maven依賴(lài):

<dependency>
    <groupId>com.baidu.aip</groupId>
    <artifactId>java-sdk</artifactId>
    <version>${version}</version>
</dependency>

再就是使用,最簡(jiǎn)單的樣例如下:

public class Sample {
    //設(shè)置APPID/AK/SK
    public static final String APP_ID = "你的 App ID";
    public static final String API_KEY = "你的 Api Key";
    public static final String SECRET_KEY = "你的 Secret Key";

    public static void main(String[] args) {
        // 初始化一個(gè)AipNlp
        AipNlp client = new AipNlp(APP_ID, API_KEY, SECRET_KEY);

        // 調(diào)用接口
        String title = "一面APP是一款非常有意思的社交APP";
        String content = "一面是一款基于文字、視頻、圖片的形式,網(wǎng)羅各類(lèi)資訊、音樂(lè)、運(yùn)動(dòng)、旅行、周邊生活信息、打折促銷(xiāo)等內(nèi)容的社交平臺(tái)。在一面上,你可以創(chuàng)建各種類(lèi)型的主題,和家人、戀人、朋友、同事、同學(xué)、鄰居、同伴等一起訂閱專(zhuān)屬信息。真正做到關(guān)心你關(guān)心的人關(guān)心的一切,讓內(nèi)容共享溫暖我們的社交關(guān)系。";

        JSONObject res = client.keyword(title, content);
    }
}

Body請(qǐng)求示例:

{
    "title":"一面APP是一款非常有意思的社交APP",
    "content": "一面是一款基于文字、視頻、圖片的形式,網(wǎng)羅各類(lèi)資訊、音樂(lè)、運(yùn)動(dòng)、旅行、周邊生活信息、打折促銷(xiāo)等內(nèi)容的社交平臺(tái)。在一面上,你可以創(chuàng)建各種類(lèi)型的主題,和家人、戀人、朋友、同事、同學(xué)、鄰居、同伴等一起訂閱專(zhuān)屬信息。真正做到關(guān)心你關(guān)心的人關(guān)心的一切,讓內(nèi)容共享溫暖我們的社交關(guān)系。"
}

返回示例:

{
    "log_id": 4457308639853058292,
    "items": [
        {
            "score": 0.997762,
            "tag": "社交"
        },
        {
            "score": 0.861775,
            "tag": "資訊"
        },
        {
            "score": 0.845657,
            "tag": "訂閱"
        }
    ]
}

四、通過(guò)用戶(hù)、行為類(lèi)型、文章的關(guān)系,計(jì)算出每個(gè)用戶(hù)的標(biāo)簽及權(quán)重
例如:點(diǎn)贊?rùn)?quán)重為0.8、評(píng)論權(quán)重為0.9、分享權(quán)重為1.0、瀏覽權(quán)重為0.3。那就是根據(jù)這個(gè)用戶(hù)對(duì)哪些文章以何種行為進(jìn)行了關(guān)聯(lián),把該文章的標(biāo)簽關(guān)聯(lián)到這個(gè)用戶(hù)上即可,具體的算法我在用戶(hù)畫(huà)像(一)|計(jì)劃制定講過(guò),大致如下:

3.6、總結(jié)
綜合上述分析,用戶(hù)畫(huà)像的數(shù)據(jù)模型,可以概括為下面的公式:
用戶(hù)標(biāo)識(shí) + 時(shí)間 + 行為類(lèi)型 + 接觸點(diǎn)(網(wǎng)址+內(nèi)容)
某用戶(hù)因?yàn)樵谑裁磿r(shí)間、某個(gè)地點(diǎn)、對(duì)某個(gè)對(duì)象,做了什么事。所以會(huì)打上XX標(biāo)簽。
用戶(hù)標(biāo)簽的權(quán)重可能隨時(shí)間的增加而衰減,因此定義時(shí)間為衰減因子r,行為類(lèi)型、網(wǎng)址決定了權(quán)重,內(nèi)容決定了標(biāo)簽,進(jìn)一步轉(zhuǎn)換為公式:
標(biāo)簽權(quán)重=衰減因子×行為權(quán)重×位置權(quán)重
當(dāng)然,很多時(shí)候標(biāo)簽本身也是有權(quán)重的。
如:用戶(hù)A,昨天在發(fā)現(xiàn)頻道瀏覽“2018年必看驚悚恐怖片之一:XXX電影”的主題內(nèi)容。
我們?yōu)檫@個(gè)內(nèi)容打的標(biāo)簽為:恐怖 0.6,電影 0.8
時(shí)間:因?yàn)槭亲蛱斓男袨?,假設(shè)衰減因子為:r=0.95
行為類(lèi)型:瀏覽行為記為權(quán)重1
地點(diǎn):在發(fā)現(xiàn)頻道為 0.6(相比在我的-我創(chuàng)建的主題中的0.9)
則用戶(hù)偏好標(biāo)簽是:電影,權(quán)重是0.95*0.6 * 1=0.57,即,用戶(hù)A:恐怖 0.57、電影 0.57。最后再乘以標(biāo)簽自己的權(quán)重。

上述模型權(quán)重值的選取只是舉例參考,具體的權(quán)重值需要根據(jù)業(yè)務(wù)需求二次建模,這里強(qiáng)調(diào)的是如何從整體思考,去構(gòu)建用戶(hù)畫(huà)像模型,進(jìn)而能夠逐步細(xì)化模型。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容