国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

論壇評(píng)論提取論壇內(nèi)容提取論壇用戶(hù)信息提取

Wuv1Up / 2819人閱讀

摘要:何況不影響我們提取評(píng)論內(nèi)容,只需分類(lèi)出來(lái)考慮就行黑體注意下面余弦相似度這個(gè)是我開(kāi)始的時(shí)候想多了大部分情況就是日期評(píng)論用戶(hù)名,后來(lái)我沒(méi)有考慮余弦相似度分類(lèi),代碼少了,精度也沒(méi)有下降。

背景
參加泰迪杯數(shù)據(jù)挖掘競(jìng)賽,這次真的學(xué)習(xí)到了不少東西,最后差不多可以完成要求的內(nèi)容,準(zhǔn)確率也還行。總共的代碼,算上中間的過(guò)程處理也不超過(guò)500行,代碼思想也還比較簡(jiǎn)單,主要是根據(jù)論壇的短文本特性和樓層之間內(nèi)容的相似來(lái)完成的。(通俗點(diǎn)說(shuō)就是去噪去噪去噪,然后只留下相對(duì)有規(guī)律的日期,內(nèi)容)

??PS:(本人長(zhǎng)期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),Message to YuboonaZhang@Yahoo.com。同時(shí)歡迎加入社交媒體數(shù)據(jù)交流群:99918768)

前期準(zhǔn)備

軟件和開(kāi)發(fā)環(huán)境: Pycharm,Python2.7,Linux系統(tǒng)

用的主要Python包: jieba, requests, BeautifulSoup, goose, selenium, PhantomJS, pymongo等(部分軟件的安裝我前面的博客有介紹)

網(wǎng)頁(yè)預(yù)處理

首先因?yàn)榫W(wǎng)站很多是動(dòng)態(tài)的,直接用bs4是獲取不到有些信息的,所以我們使用selenium和phantomjs將文件保存在本地,然后再處理。

相關(guān)的代碼是

def save(baseUrl):
    driver = webdriver.PhantomJS()
    driver.get(baseUrl) # seconds
    try:
        element = WebDriverWait(driver, 10).until(isload(driver) is True)
    except Exception, e:
        print e
    finally:
        data = driver.page_source  # 取到加載js后的頁(yè)面content
    driver.quit()
    return data

由于網(wǎng)頁(yè)中存在著大量的噪音(廣告,圖片等),首先我們需要將與我們所提取內(nèi)容不一致的所有噪聲盡可能去除。我們首先選擇將一些帶有典型噪聲意義的噪聲標(biāo)簽去除,比如script等,方法我們選擇BeautifulSoup來(lái)完成。

代碼大概是這樣

    for element in soup(text=lambda text: isinstance(text, Comment)):
        element.extract()

    [s.extract() for s in soup("script")]
    [s.extract() for s in soup("meta")]
    [s.extract() for s in soup("style")]
    [s.extract() for s in soup("link")]
    [s.extract() for s in soup("img")]
    [s.extract() for s in soup("input")]
    [s.extract() for s in soup("br")]
    [s.extract() for s in soup("li")]
    [s.extract() for s in soup("ul")]

    print (soup.prettify())

處理之后的網(wǎng)頁(yè)對(duì)比

可以看出網(wǎng)頁(yè)噪聲少了很多,但是還是不足以從這么多噪聲中提取出我們所要的內(nèi)容

由于我們不需要標(biāo)簽只需要標(biāo)簽里面的文字,所以我們可以利用BeautifulSoup提取出文字內(nèi)容再進(jìn)行分析

for string in soup.stripped_strings:
    print(string)
    with open(os.path.join(os.getcwd())+"/data/3.txt", "a") as f:
        f.writelines(string.encode("utf-8")+"
")

可以看出來(lái)還是非常雜亂,但是又是十分有規(guī)律的。我們可以發(fā)現(xiàn)每個(gè)樓層中的文本內(nèi)容實(shí)質(zhì)上都差不多,可以說(shuō)重復(fù)的很多,而且都是一些特定的詞,比如: 直達(dá)樓層, 板凳,沙發(fā),等這類(lèi)的詞,所以我們需要將這些詞刪掉然后再進(jìn)行分析

我所用的方法是利用jieba分詞來(lái)對(duì)獲取的網(wǎng)頁(yè)文本進(jìn)行分詞,統(tǒng)計(jì)出出現(xiàn)詞頻最高的詞,同時(shí)也是容易出現(xiàn)在噪聲文章中的詞語(yǔ),代碼如下

import jieba.analyse

text = open(r"./data/get.txt", "r").read()

dic = {}
cut = jieba.cut_for_search(text)

for fc in cut:
    if fc in dic:
        dic[fc] += 1
    else:
        dic[fc] = 1
blog = jieba.analyse.extract_tags(text, topK=1000, withWeight=True)

for word_weight in blog:
    # print (word_weight[0].encode("utf-8"), dic.get(word_weight[0], "not found"))
    with open("cut.txt", "a") as f:
        f.writelines(word_weight[0].encode("utf-8") + "    " + str(dic.get(word_weight[0], "not found")) + "
")

統(tǒng)計(jì)出來(lái)然后經(jīng)過(guò)我們測(cè)試和篩選得出的停用詞有這些

回帖
積分
帖子
登錄
論壇
注冊(cè)
離線(xiàn)
時(shí)間
作者
簽到
主題
精華
客戶(hù)端
手機(jī)
下載
分享

目前統(tǒng)計(jì)的詞大約200左右。

然后還有去除重復(fù)文本的工作

# 去重函數(shù)
def remove_dup(items):
    pattern1 = re.compile(r"發(fā)表于")
    pattern2 = re.compile("d{4}-d{1,2}-d{1,2} d{2}:d{2}:d{2}")
    pattern3 = re.compile("d{1,2}-d{1,2} d{2}:d{2}")
    pattern4 = re.compile("d{4}-d{1,2}-d{1,2} d{2}:d{2}")
    pattern5 = re.compile(r"[^0-9a-zA-Z]{7,}")

    # 用集合來(lái)作為容器,來(lái)做一部分的重復(fù)判斷依據(jù),另外的部分由匹配來(lái)做
    # yield用于將合適的文本用生成器得到迭代器,這樣就進(jìn)行了文本的刪除,在函數(shù)外面
    # 可以用函數(shù)進(jìn)行文本的迭代
    seen = set()
    for item in items:
        match1 = pattern1.match(item)
        match2 = pattern2.match(item)
        match3 = pattern3.match(item)
        match4 = pattern4.match(item)
        match5 = pattern5.match(item)
        if item not in seen or match1 or match2 or match3 or match4 or match5:
            yield item
        seen.add(item)  # 向集合中加入item,集合會(huì)自動(dòng)化刪除掉重復(fù)的項(xiàng)目

在經(jīng)過(guò)觀(guān)察處理后的網(wǎng)頁(yè)文本,我們發(fā)現(xiàn)還有一項(xiàng)噪聲無(wú)法忽略,那就是純數(shù)字。因?yàn)榫W(wǎng)頁(yè)文本中有很多純數(shù)字但是又不重復(fù),比如點(diǎn)贊數(shù)等,所以我準(zhǔn)備用正則匹配出純數(shù)字然后刪除。但是這樣就會(huì)出現(xiàn)問(wèn)題...因?yàn)橛行┯脩?hù)名是純數(shù)字的,這樣我們會(huì)把用戶(hù)名刪掉的。為了解決這個(gè)問(wèn)題我們使用保留字符數(shù)大于7的純數(shù)字,這樣既刪除了大部分的沒(méi)用信息又盡可能的保留了用戶(hù)名

相關(guān)的代碼如下

st = []
    for stop_word in stop_words:
        st.append(stop_word.strip("
"))
    t = tuple(st)
    # t,元組,和列表的區(qū)別是,不能修改使用(,,,,),與【,,,】列表不同
    lines = []
    # 刪除停用詞和短數(shù)字實(shí)現(xiàn)
    for j in after_string:
        # 如果一行的開(kāi)頭不是以停用詞開(kāi)頭,那么讀取這一行
        if not j.startswith(t):
            # 如何一行不全是數(shù)字,或者這行的數(shù)字?jǐn)?shù)大于7(區(qū)別無(wú)關(guān)數(shù)字和數(shù)字用戶(hù)名)讀取這一行
            if not re.match("d+$", j) or len(j) > 7:
                lines.append(j.strip())
                # 刪除所有空格并輸出
                print (j.strip())

處理之后的文本如下,規(guī)律十分明顯了

接下來(lái)就是我們進(jìn)行內(nèi)容提取的時(shí)候了

內(nèi)容提取

內(nèi)容提取無(wú)非是找到評(píng)論塊,而評(píng)論塊在上面我們的圖中已經(jīng)十分清晰了,我們自然而然的想到根據(jù)日期來(lái)區(qū)分評(píng)論塊。經(jīng)過(guò)觀(guān)察,所有的論壇中日期的形式只有5種(目前只看到5種,當(dāng)然后期可以加上)。我們可以用正則匹配出日期所在的行,根據(jù)兩個(gè)日期所在行數(shù)的中間所夾的就是評(píng)論內(nèi)容和用戶(hù)名來(lái)完成我們的評(píng)論內(nèi)容提取。

傳入我們處理后的文本然后就匹配出日期所在行數(shù)

# 匹配日期返回get_list
def match_date(lines):
    pattern1 = re.compile(r"發(fā)表于")
    pattern2 = re.compile("d{4}-d{1,2}-d{1,2} d{2}:d{2}:d{2}")
    pattern3 = re.compile("d{1,2}-d{1,2} d{2}:d{2}")
    pattern4 = re.compile("d{4}-d{1,2}-d{1,2} d{2}:d{2}")
    pattern5 = re.compile(r"發(fā)表日期")

    pre_count = -1
    get_list = []

    # 匹配日期文本
    for string in lines:
        match1 = pattern1.match(string)
        match2 = pattern2.match(string)
        match3 = pattern3.match(string)
        match4 = pattern4.match(string)
        match5 = pattern5.match(string)
        pre_count += 1
        if match1 or match2 or match3 or match4 or match5:
            get_dic = {"count": pre_count, "date": string}
            get_list.append(get_dic)

    # 返回的是匹配日期后的信息
    return get_list

因?yàn)橛谢靥蜎](méi)有回帖處理方式也不一樣所以我們需要分類(lèi)進(jìn)行討論。因?yàn)槲覀冎涝u(píng)論的內(nèi)容是在兩個(gè)匹配日期的中間,這樣就有一個(gè)問(wèn)題就是最后一個(gè)評(píng)論的內(nèi)容區(qū)域不好分。但是考慮到大部分的最后一個(gè)回帖都是一行我們可以暫取值為3(sub==3,考慮一行評(píng)論和一行用戶(hù)名),后來(lái)想到一種更為科學(xué)的方法,比如判斷后面幾行的文本密度,如果很小說(shuō)明只有一行評(píng)論的可能性更大。

下面的代碼是獲取日期所在行數(shù)和兩個(gè)日期之間的行數(shù)差

# 返回my_count
def get_count(get_list):
    my_count = []
    date = []
    # 獲取時(shí)間所在行數(shù)
    for i in get_list:
        k, t = i.get("count"), i.get("date")
        my_count.append(k)
        date.append(t)
    if len(get_list) > 1:
        # 最后一行暫時(shí)取3
        my_count.append(my_count[-1] + 3)
        return my_count
    else:
        return my_count

# 獲取兩個(gè)時(shí)間所在的行數(shù)差
def get_sub(my_count):
    sub = []
    for i in range(len(my_count) - 1):
        sub.append(my_count[i + 1] - my_count[i])
    return sub

接下來(lái)就要分類(lèi)討論了

如果只有樓主沒(méi)有評(píng)論(即my——count==1),這個(gè)時(shí)候我們可以使用開(kāi)源的正文提取軟件goose來(lái)提取正文。

如果有評(píng)論我們就需要根據(jù)sub的值來(lái)進(jìn)行分類(lèi)如果sub==2占多數(shù)(或者說(shuō)比sub==3)占的多,那么我們就認(rèn)為可能是用戶(hù)名被刪掉,刪掉的原因有很多,比如去重的時(shí)候有人在樓中樓回復(fù)了導(dǎo)致用戶(hù)名重復(fù)被刪除,有可能該網(wǎng)站的標(biāo)簽比較特殊用戶(hù)名在去標(biāo)簽的時(shí)候刪除等,情況比較復(fù)雜且出現(xiàn)的頻率不太高,暫未考慮。何況不影響我們提取評(píng)論內(nèi)容,只需分類(lèi)出來(lái)考慮就行


注意:下面余弦相似度這個(gè)是我開(kāi)始的時(shí)候想多了!大部分情況就是:日期-評(píng)論-用戶(hù)名,后來(lái)我沒(méi)有考慮余弦相似度分類(lèi),代碼少了,精度也沒(méi)有下降。這里不刪是想留下一個(gè)思考的過(guò)程。代碼看看就好,最后有修改后的源碼。

還有就是最常見(jiàn)的內(nèi)容,就是sub==3占多數(shù)的情況。因?yàn)榇蟛糠值脑u(píng)論都是一行文本,所以我們需要考慮的的是sub==3的時(shí)候獲取的評(píng)論文本在哪一行。通俗來(lái)說(shuō)就是這三行的內(nèi)容是日期-評(píng)論-用戶(hù)名,還是日期-用戶(hù)名-評(píng)論呢?雖然大部分是第一種情況,但是第二種情況我們也不能忽略。怎么判斷這兩種情況呢?這確實(shí)讓我思考了很長(zhǎng)一段時(shí)間,后來(lái)想到可以用余弦相似度來(lái)解決這個(gè)問(wèn)題.科普余弦相似度可以看這里。簡(jiǎn)單來(lái)說(shuō)就是用戶(hù)名的長(zhǎng)度都是相似的,但是評(píng)論的內(nèi)容長(zhǎng)度差異就非常大了。比如用戶(hù)名長(zhǎng)度都是7個(gè)字符左右,但是評(píng)論的長(zhǎng)度可以數(shù)百,也可以只有一個(gè)。所以我們可以?xún)蓛杀容^余弦相似度,然后取平均,相似度大的就是用戶(hù)名了。這樣我們就可以區(qū)分出評(píng)論內(nèi)容進(jìn)行提取了!這就是主要的思想。剩下的就是代碼的實(shí)現(xiàn)了。

簡(jiǎn)單貼一下相關(guān)的代碼

# 利用goose獲取正文內(nèi)容
def goose_content(my_count, lines, my_url):
    g = Goose({"stopwords_class": StopWordsChinese})
    content_1 = g.extract(url=my_url)
    host = {}
    my_list = []
    host["content"] = content_1.cleaned_text
    host["date"] = lines[my_count[0]]
    host["title"] = get_title(my_url)
    result = {"post": host, "replys": my_list}
    SpiderBBS_info.insert(result)

# 計(jì)算余弦相似度函數(shù)
def cos_dist(a, b):
    if len(a) != len(b):
        return None
    part_up = 0.0
    a_sq = 0.0
    b_sq = 0.0
    for a1, b1 in zip(a, b):
        part_up += a1 * b1
        a_sq += a1 ** 2
        b_sq += b1 ** 2
    part_down = math.sqrt(a_sq * b_sq)
    if part_down == 0.0:
        return None
    else:
        return part_up / part_down

# 判斷評(píng)論內(nèi)容在哪一行(可能在3行評(píng)論塊的中間,可能在三行評(píng)論塊的最后)
def get_3_comment(my_count, lines):
    get_pd_1 = []
    get_pd_2 = []
    # 如果間隔為3取出所在行的文本長(zhǎng)度
    test_sat_1 = []
    test_sat_2 = []
    for num in range(len(my_count)-1):
        if my_count[num+1] - 3 == my_count[num]:
            pd_1 = (len(lines[my_count[num]]), len(lines[my_count[num]+2]))
            get_pd_1.append(pd_1)
            pd_2 = (len(lines[my_count[num]]), len(lines[my_count[num]+1]))
            get_pd_2.append(pd_2)

    for i_cos in range(len(get_pd_1)-1):
        for j_cos in range(i_cos+1, len(get_pd_1)):
            # 計(jì)算文本余弦相似度
            test_sat_1.append(cos_dist(get_pd_1[j_cos], get_pd_1[i_cos]))
            test_sat_2.append(cos_dist(get_pd_2[j_cos], get_pd_2[i_cos]))

    # 計(jì)算余弦相似度的平均值
    get_mean_1 = numpy.array(test_sat_1)
    print (get_mean_1.mean())
    get_mean_2 = numpy.array(test_sat_2)
    print (get_mean_2.mean())

    # 比較大小返回是否應(yīng)該按
    if get_mean_1.mean() >= get_mean_2.mean():
        return 1
    elif get_mean_1.mean() < get_mean_2.mean():
        return 2

# 獲取評(píng)論內(nèi)容
def solve__3(num, my_count, sub, lines, my_url):
    # 如果get_3_comment()返回的值是1,那么說(shuō)明最后一行是用戶(hù)名的可能性更大,否則第一行是用戶(hù)名的可能性更大
    if num == 1:
        host = {}
        my_list = []
        host["content"] = "".join(lines[my_count[0]+1: my_count[1]+sub[0]-1])
        host["date"] = lines[my_count[0]]
        host["title"] = get_title(my_url)
        for use in range(1, len(my_count)-1):
            pl = {"content": "".join(lines[my_count[use] + 1:my_count[use + 1] - 1]), "date": lines[my_count[use]],
                  "title": get_title(my_url)}
            my_list.append(pl)

        result = {"post": host, "replys": my_list}
        SpiderBBS_info.insert(result)

    if num == 2:
        host = {}
        my_list = []
        host["content"] = "".join(lines[my_count[0]+2: my_count[1]+sub[0]])
        host["date"] = lines[my_count[0]]
        host["title"] = get_title(my_url)
        for use in range(1, len(my_count) - 1):
            pl = {"content": "".join(lines[my_count[use] + 2:my_count[use + 1]]), "date": lines[my_count[use]],
                  "title": get_title(my_url)}
            my_list.append(pl)

        result = {"post": host, "replys": my_list}
        SpiderBBS_info.insert(result)

展望

提取的準(zhǔn)確率應(yīng)該要分析更多的bbs網(wǎng)站,優(yōu)化刪除重復(fù)詞(太粗暴),優(yōu)化停用詞,針對(duì)短文本沒(méi)回復(fù)情況的優(yōu)化,準(zhǔn)確提取樓主的用戶(hù)名等,無(wú)奈時(shí)間太緊無(wú)法進(jìn)一步優(yōu)化。才疏學(xué)淺,剛學(xué)了幾個(gè)月python,代碼難免有不合理的地方,望各位提出寶貴意見(jiàn)。

撒一波廣告

本人長(zhǎng)期出售抓取超大量微博數(shù)據(jù)的代碼,并提供微博數(shù)據(jù)打包出售,Message to YuboonaZhang@Yahoo.com

個(gè)人博客

8aoy1.cn

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41111.html

相關(guān)文章

  • 論壇評(píng)論提取論壇內(nèi)容提取論壇用戶(hù)信息提取

    摘要:何況不影響我們提取評(píng)論內(nèi)容,只需分類(lèi)出來(lái)考慮就行黑體注意下面余弦相似度這個(gè)是我開(kāi)始的時(shí)候想多了大部分情況就是日期評(píng)論用戶(hù)名,后來(lái)我沒(méi)有考慮余弦相似度分類(lèi),代碼少了,精度也沒(méi)有下降。 背景 參加泰迪杯數(shù)據(jù)挖掘競(jìng)賽,這次真的學(xué)習(xí)到了不少東西,最后差不多可以完成要求的內(nèi)容,準(zhǔn)確率也還行。總共的代碼,算上中間的過(guò)程處理也不超過(guò)500行,代碼思想也還比較簡(jiǎn)單,主要是根據(jù)論壇的短文本特性和樓層之間...

    Pikachu 評(píng)論0 收藏0
  • 論壇評(píng)論提取論壇內(nèi)容提取論壇用戶(hù)信息提取

    摘要:何況不影響我們提取評(píng)論內(nèi)容,只需分類(lèi)出來(lái)考慮就行黑體注意下面余弦相似度這個(gè)是我開(kāi)始的時(shí)候想多了大部分情況就是日期評(píng)論用戶(hù)名,后來(lái)我沒(méi)有考慮余弦相似度分類(lèi),代碼少了,精度也沒(méi)有下降。 背景 參加泰迪杯數(shù)據(jù)挖掘競(jìng)賽,這次真的學(xué)習(xí)到了不少東西,最后差不多可以完成要求的內(nèi)容,準(zhǔn)確率也還行。總共的代碼,算上中間的過(guò)程處理也不超過(guò)500行,代碼思想也還比較簡(jiǎn)單,主要是根據(jù)論壇的短文本特性和樓層之間...

    clasnake 評(píng)論0 收藏0
  • Python爬蟲(chóng)實(shí)戰(zhàn)(1):爬取Drupal論壇帖子列表

    摘要:,引言在即時(shí)網(wǎng)絡(luò)爬蟲(chóng)項(xiàng)目?jī)?nèi)容提取器的定義一文我們定義了一個(gè)通用的網(wǎng)絡(luò)爬蟲(chóng)類(lèi),期望通過(guò)這個(gè)項(xiàng)目節(jié)省程序員一半以上的時(shí)間。本文將用一個(gè)實(shí)例講解怎樣使用這個(gè)爬蟲(chóng)類(lèi)。我們將爬集搜客老版論壇,是一個(gè)用做的論壇。 showImg(https://segmentfault.com/img/bVxTdG); 1,引言 在《Python即時(shí)網(wǎng)絡(luò)爬蟲(chóng)項(xiàng)目: 內(nèi)容提取器的定義》一文我們定義了一個(gè)通用的pyt...

    李文鵬 評(píng)論0 收藏0
  • Python爬蟲(chóng)實(shí)戰(zhàn)(2):爬取京東商品列表

    摘要:,源代碼爬取京東商品列表,以手機(jī)商品列表為例示例網(wǎng)址版本京東手機(jī)列表源代碼下載位置請(qǐng)看文章末尾的源。,抓取結(jié)果運(yùn)行上面的代碼,就會(huì)爬取京東手機(jī)品類(lèi)頁(yè)面的所有手機(jī)型號(hào)價(jià)格等信息,并保存到本地文件京東手機(jī)列表中。 showImg(https://segmentfault.com/img/bVxXHW); 1,引言 在上一篇《python爬蟲(chóng)實(shí)戰(zhàn):爬取Drupal論壇帖子列表》,爬取了一個(gè)用...

    shevy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<