Что такое TF-IDF рассказано в этих прекрасных видео с Coursera (Web Intelligence and Big Data):
TF-IDF
TF-IDF Example
Я же покажу реализацию извлечения ключевых слов с помощью этой метрики на F#:
Результат:
TF-IDF
TF-IDF Example
Я же покажу реализацию извлечения ключевых слов с помощью этой метрики на F#:
#if INTERACTIVE #r @"..\packages\HtmlAgilityPack.1.4.6\lib\Net45\HtmlAgilityPack.dll" #endif open System open System.Collections.Generic open System.Collections.Concurrent open System.Linq open System.Text open System.Text.RegularExpressions open System.IO open System.Net open Microsoft.FSharp.Control.WebExtensions open HtmlAgilityPack let makeTFMap (text : string array) = let dict = new Dictionary<_, _>() for word in text do if dict.ContainsKey word then dict.[word] <- dict.[word] + 1 else dict.Add(word, 1) dict let IDF (uniqueTokens : string array) = let logWebSizeEstimate = Math.Log(5e10, 2.) let dict = new ConcurrentDictionary<_, _>() seq { for word in uniqueTokens -> async { let req = WebRequest.Create(@"http://www.google.com/search?q=" + word) :?> HttpWebRequest req.Timeout <- 5000 req.UserAgent <- "Mozilla/4.1 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" let! resp = req.AsyncGetResponse() use stream = (resp :?> HttpWebResponse).GetResponseStream() use reader = new StreamReader(stream) let! html = reader.AsyncReadToEnd() let doc = new HtmlDocument() doc.LoadHtml html let stats = doc.DocumentNode.SelectSingleNode(@"//div[@id = 'resultStats']").InnerText let numStr = Regex.Match(stats, @"[0-9,]+").Value.Replace(",", "") let idf = logWebSizeEstimate - Math.Log(float numStr, 2.) dict.AddOrUpdate(word, idf, (fun _ _ -> 0.)) |> ignore } } |> Async.Parallel |> Async.RunSynchronously |> ignore dict let TF_IDF (tf : Dictionary<_, _>) (idf : ConcurrentDictionary<_, _>) = let uniqueTokens = tf.Keys.ToArray() dict [ for word in uniqueTokens -> word, float tf.[word] * idf.[word] ] let analyze (text : string) = let tokens = text.Split([|' '; '\n'; '\t'; '.'|], StringSplitOptions.RemoveEmptyEntries) let tf = makeTFMap tokens TF_IDF tf (IDF <| tf.Keys.ToArray()) let printTop text num = let results = analyze text let hot10 = Array.sortBy (fun (kvp : KeyValuePair<_, _>) -> kvp.Value) (results.ToArray()) |> Array.rev |> Seq.take num for kvp in hot10 do printfn "%s has TF-IDF of %f" kvp.Key kvp.ValueПример использования:
let article = "Акции протеста против антиисламского фильма распространяются по всему миру: демонстрации прошли в Ливии, Йемене, Египте, Ираке, Тунисе и других странах. Власти Афганистана и Пакистана закрыли доступ к YouTube, дабы попытаться не допустить просмотра скандального фильма. Участники акций протеста считают, что размещенный в интернете неким 52-летним американцем из Калифорнии любительский фильм, оскорбляет пророка Мухаммеда. При штурме американского посольства в Ливии во время акции протеста во вторник погиб американский посол." printTop article 10(Текст взят из этой статьи BBC)
Результат:
протеста has TF-IDF of 30.083060
антиисламского has TF-IDF of 18.183107
штурме has TF-IDF of 15.472137
американцем has TF-IDF of 14.996109
Йемене, has TF-IDF of 14.777763
оскорбляет has TF-IDF of 14.299300
скандального has TF-IDF of 14.253497
Тунисе has TF-IDF of 14.058740
размещенный has TF-IDF of 13.757642
неким has TF-IDF of 13.116506
Real: 00:00:09.695, CPU: 00:00:01.248, GC gen0: 41, gen1: 16, gen2: 1
Комментариев нет:
Отправить комментарий