大數據之路【第十二篇】:數據挖掘--NLP文本相似度

来源:https://www.cnblogs.com/hackerer/archive/2019/09/03/11453569.html
-Advertisement-
Play Games

一、詞頻 TF • 假設:如果一個詞很重要,應該會在文章中多次出現 • 詞頻——TF(Term Frequency):一個詞在文章中出現的次數 • 也不是絕對的!出現次數最多的是“的”“是”“在”,這類最常用的詞,叫做停用詞(stop words)• 停用詞對結果毫無幫助,必須過濾掉的詞 • 過濾掉 ...


一、詞頻----TF

• 假設:如果一個詞很重要,應該會在文章中多次出現


• 詞頻——TF(Term Frequency):一個詞在文章中出現的次數


• 也不是絕對的!出現次數最多的是“的”“是”“在”,這類最常用的詞,叫做停用詞(stop words)

• 停用詞對結果毫無幫助,必須過濾掉的詞


• 過濾掉停用詞後就一定能接近問題麽?


• 進一步調整假設:如果某個詞比較少見,但是它在這篇文章中多次出現,那麽它很可能反映了這篇文章的特性,正是我們所需要的關鍵詞

二、反文檔頻率----IDF

• 在詞頻的基礎上,賦予每一個詞的權重,進一步體現該詞的重要性,


• 最常見的詞(“的”、“是”、“在”)給予最小的權重


• 較常見的詞(“國內”、“中國”、“報道”)給予較小的權重


• 較少見的詞(“養殖”、“維基”)


• 將TF和IDF進行相乘,就得到了一個詞的TF-IDF值,某個詞對文章重要性越高,該值越大,於是排在前面的幾個詞,就是這篇文章的關鍵詞。


計算步驟

 

 

 

三、LCS定義

• 最長公共子序列(Longest Common Subsequence)
• 一個序列S任意刪除若幹個字元得到的新序列T,則T叫做S的子序列
• 兩個序列X和Y的公共子序列中,長度最長的那個,定義為X和Y的最長公共子序列
    – 字元串12455與245576的最長公共子序列為2455
    – 字元串acdfg與adfc的最長公共子序列為adf
• 註意區別最長公共子串(Longest Common Substring)
   – 最長公共子串要求連接 

四、LCS作用

• 求兩個序列中最長的公共子序列演算法
    –   生物學家常利用該演算法進行基金序列比對,以推測序列的結構、功能和演化過程。
• 描述兩段文字之間的“相似度”
    –   辨別抄襲,對一段文字進行修改之後,計算改動前後文字的最長公共子序列,將除此子序列
外的部分提取出來,該方法判斷修改的部分

五、求解---暴力窮舉法

• 假定字元串X,Y的長度分別為m,n;

• X的一個子序列即下標序列{1,2,……,m}嚴格遞增子序列,因此,X共有2^m 個不同子序列;同理,Y有2^n 個不同子序列;

• 窮舉搜索法時間複雜度O(2 ^m ∗ 2^n );


• 對X的每一個子序列,檢查它是否也是Y的子序列,從而確定它是否為X和Y的公共子序列,並且在檢查過程中選出最長的公共子序列;

• 複雜度高,不可用!

六、求解---動態規劃法

• 字元串X,長度為m,從1開始數;


• 字元串Y,長度為n,從1開始數;


• X i =<x 1 ,……,x i >即X序列的前i個字元(1<=i<=m)(X i 計作“字元串X的i首碼”)


• Y i =<y 1 ,……,y i >即Y序列的前i個字元(1<=j<=n)(Y j 計作“字元串Y的j首碼”)


• LCS(X,Y)為字元串X和Y的最長公共子序列,即為Z=<z 1 ,……,z k >


• 如果x m = y n (最後一個字元相同),則:X ? 與Y n 的最長公共子序列Z k 的最後一個字元必定為x m (= y n )

• Zk= x m = y n

七、LCS總結分析

 

• 屬於動態規劃問題!

 

 

八、數據結構----二維數組

• 使用二維數組C[m,n]
• C[i,j]記錄序列X i 和Y j 的最長公共子序列的長度
– 當i=0或j=0時,空虛了是X i 和Y j 的最長公共子序列,故C[i,j]=0

 

 

 例子:

• X =<A, B, C, B, D, A, B>
• Y=<B, D, C, A, B, A>

 

 

 

 mr_lcs mapreduce

##map.py

# -*- coding: utf-8 -*-
#!/usr/bin/python

import sys

def cal_lcs_sim(first_str, second_str):
    len_vv = [[0] * 50] * 50

    first_str = unicode(first_str, "utf-8", errors='ignore')
    second_str = unicode(second_str, "utf-8", errors='ignore')

    len_1 = len(first_str.strip())
    len_2 = len(second_str.strip())

    #for a in first_str:
        #word = a.encode('utf-8')

    for i in range(1, len_1 + 1):
        for j in range(1, len_2 + 1):
            if first_str[i - 1] == second_str[j - 1]:
                len_vv[i][j] = 1 + len_vv[i - 1][j - 1]
            else:
                len_vv[i][j] = max(len_vv[i - 1][j], len_vv[i][j - 1])

    return float(float(len_vv[len_1][len_2] * 2) / float(len_1 + len_2))


for line in sys.stdin:
    ss = line.strip().split('\t')
    if len(ss) != 2:
        continue
    first_str = ss[0].strip()
    second_str = ss[1].strip()

    sim_score = cal_lcs_sim(first_str, second_str)
    print '\t'.join([first_str, second_str, str(sim_score)])
#run.sh

HADOOP_CMD="/usr/local/src/hadoop-1.2.1/bin/hadoop"
STREAM_JAR_PATH="/usr/local/src/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar"

INPUT_FILE_PATH_1="/lcs_input.data"
OUTPUT_PATH="/lcs_output"

$HADOOP_CMD fs -rmr -skipTrash $OUTPUT_PATH

# Step 1.
$HADOOP_CMD jar $STREAM_JAR_PATH \
    -input $INPUT_FILE_PATH_1 \
    -output $OUTPUT_PATH \
    -mapper "python map.py" \
    -jobconf "mapred.reduce.tasks=0" \
    -jobconf  "mapred.job.name=mr_lcs" \
    -file ./map.py

 

mr_tfidf mapreduce

 

 

##red.py
#!/usr/bin/python

import sys
import math

current_word = None
count_pool = []
sum = 0

docs_cnt = 508

for line in sys.stdin:
    ss = line.strip().split('\t')
    if len(ss) != 2:
        continue

    word, val = ss

    if current_word == None:
        current_word = word

    if current_word != word:
        for count in count_pool:
            sum += count
        idf_score = math.log(float(docs_cnt) / (float(sum) + 1))
        print "%s\t%s" % (current_word, idf_score)

        current_word = word
        count_pool = []
        sum = 0

    count_pool.append(int(val))


for count in count_pool:
    sum += count
idf_score = math.log(float(docs_cnt) / (float(sum) + 1))
print "%s\t%s" % (current_word, idf_score)

 

##run.sh

HADOOP_CMD="/usr/local/src/hadoop-1.2.1/bin/hadoop"
STREAM_JAR_PATH="/usr/local/src/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar"

INPUT_FILE_PATH_1="/tfidf_input.data"
OUTPUT_PATH="/tfidf_output"

$HADOOP_CMD fs -rmr -skipTrash $OUTPUT_PATH

# Step 1.
$HADOOP_CMD jar $STREAM_JAR_PATH \
    -input $INPUT_FILE_PATH_1 \
    -output $OUTPUT_PATH \
    -mapper "python map.py" \
    -reducer "python red.py" \
    -file ./map.py \
    -file ./red.py

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SELECT select的完整語法: 上述如果都有:執行順序from->where->group by->having->order by->limit->select 列的結果顯示 1、去掉重覆的數據:distinct(針對於記錄而言,不是針對於列的數據而言) 2、運算符:+、-、*、/、%(只 ...
  • 1.一個問題 InnoDB一棵B+樹可以存放多少行數據?這個問題的簡單回答是:約2千萬。為什麼是這麼多呢?因為這是可以算出來的,要搞清楚這個問題,我們先從InnoDB索引數據結構、數據組織方式說起。 我們都知道電腦在存儲數據的時候,有最小存儲單元,這就好比我們今天進行現金的流通最小單位是一毛。在計 ...
  • 定義 各類別的出現概率不均衡的情況 如信用風險中正常用戶遠多於逾期、違約用戶;流失風險中留存用戶多於流失用戶 隱患 降低對少類樣本的靈敏性。但我們建模就是要找到這少類樣本,所以必須對數據加以處理,來提高靈敏性。 解決方案 1. 過採樣 對壞的人群提高權重,即複製壞樣本,提高壞樣本的占比。 優點: 簡 ...
  • 前面說到了 Flink的TaskManager啟動(源碼分析) 啟動了TaskManager 然後 Flink的Job啟動JobManager端(源碼分析) 說到JobManager會將轉化得到的TDD發送到TaskManager的RPC 這篇主要就講一下,Job在TaskManager端是如何啟動 ...
  • 流式計算分為無狀態和有狀態兩種情況。無狀態計算觀察每個獨立的事件,Storm就是無狀態的計算框架,每一條消息來了以後和前後都沒有關係,一條是一條。比如我們接收電力系統感測器的數據,當電壓超過240v就報警,這就是無狀態的數據。但是如果我們需要同時判斷多個電壓,比如三相電路,我們判斷三相電都高於某個值 ...
  • 原因:使用負載均衡的時候,第一次請求phpMyAdmin主頁的時候web01進行處理,頁面返回的cookie存放在web01上.填寫用戶名密碼提交之後,是web02進行處理的,此時給頁面的cookie不是web01上的cookie,所以會報錯 解決方法:將cookie都放到單獨的資料庫redis中 ...
  • javascript當中火狐的firebug如何單步調試程式 ...
  • python連接mysql的客戶端 MySQL註入問題 之前我們進行用戶名密碼認證是先將用戶名和密碼保存到一個文件中,然後通過讀文件裡面的內容,來和客戶端發送過來的用戶名密碼進行匹配,現在我們學了資料庫,我們可以將這些用戶數據保存到資料庫中,然後通過資料庫裡面的數據來對客戶端進行用戶名和密碼的認證。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...