ความถี่ระยะ / ความถี่เอกสารผกผัน (TF / IDF): น้ำหนัก


12

ฉันมีชุดข้อมูลที่แสดงถึง 1,000 เอกสารและคำทั้งหมดที่ปรากฏในนั้น ดังนั้นแถวแสดงถึงเอกสารและคอลัมน์เป็นตัวแทนของคำ ดังนั้นสำหรับตัวอย่างเช่นค่าในเซลล์ย่อมาจากคำว่าครั้งเกิดขึ้นในเอกสารฉัน ตอนนี้ฉันต้องค้นหา 'น้ำหนัก' ของคำโดยใช้วิธี tf / idf แต่จริง ๆ แล้วฉันไม่รู้วิธีการทำสิ่งนี้ มีคนช่วยฉันออกได้ไหม(i,j)ji


TF-idf- สถิติสำหรับการแยกคำหลัก - joyofdata.de/blog/tf-idf-statistic-keyword-extraction
Raffael

คำตอบ:


12

Wikipedia มีบทความที่ดีเกี่ยวกับหัวข้อพร้อมสูตร ค่าในเมทริกซ์ของคุณคือความถี่ของคำ คุณเพียงแค่ต้องค้นหา idf: (log((total documents)/(number of docs with the term))และหลายค่า 2

ใน R คุณสามารถทำได้ดังนี้

set.seed(42)
d <- data.frame(w=sample(LETTERS, 50, replace=TRUE))
d <- model.matrix(~0+w, data=d)

tf <- d
idf <- log(nrow(d)/colSums(d))
tfidf <- d

for(word in names(idf)){
  tfidf[,word] <- tf[,word] * idf[word]
}

นี่คือชุดข้อมูล:

> colSums(d)
wA wC wD wF wG wH wJ wK wL wM wN wO wP wQ wR wS wT wV wX wY wZ 
 3  1  3  1  1  1  1  2  4  2  2  1  1  3  2  2  2  4  5  5  4 
> head(d)
  wA wC wD wF wG wH wJ wK wL wM wN wO wP wQ wR wS wT wV wX wY wZ
1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0
2  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0
3  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
4  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0
5  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0
6  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0
> head(round(tfidf, 2))
  wA wC wD wF wG   wH wJ wK wL wM   wN wO wP   wQ wR wS wT   wV  wX  wY wZ
1  0  0  0  0  0 0.00  0  0  0  0 0.00  0  0 0.00  0  0  0 0.00 2.3 0.0  0
2  0  0  0  0  0 0.00  0  0  0  0 0.00  0  0 0.00  0  0  0 0.00 0.0 2.3  0
3  0  0  0  0  0 3.91  0  0  0  0 0.00  0  0 0.00  0  0  0 0.00 0.0 0.0  0
4  0  0  0  0  0 0.00  0  0  0  0 0.00  0  0 0.00  0  0  0 2.53 0.0 0.0  0
5  0  0  0  0  0 0.00  0  0  0  0 0.00  0  0 2.81  0  0  0 0.00 0.0 0.0  0
6  0  0  0  0  0 0.00  0  0  0  0 3.22  0  0 0.00  0  0  0 0.00 0.0 0.0  0

คุณยังสามารถดู idf ของแต่ละคำได้:

> log(nrow(d)/colSums(d))
      wA       wC       wD       wF       wG       wH       wJ       wK       wL       wM       wN       wO       wP       wQ       wR       wS       wT       wV       wX       wY       wZ 
2.813411 3.912023 2.813411 3.912023 3.912023 3.912023 3.912023 3.218876 2.525729 3.218876 3.218876 3.912023 3.912023 2.813411 3.218876 3.218876 3.218876 2.525729 2.302585 2.302585 2.525729 

ขอบคุณสำหรับความช่วยเหลือของคุณ! แต่เป็นไปได้หรือไม่ที่จะได้รับคุณค่าบางอย่างสำหรับแต่ละคำซึ่งหมายถึงน้ำหนักบางส่วน (แทนที่จะเป็นเมทริกซ์ทั้งหมด) ตอนนี้เรามีน้ำหนักทั้งหมด ฉันทำเลือกคุณลักษณะบางอย่างและต้องการที่จะใช้ TF / IDF เป็นวิธีการกรอง ...
เอบีซี

@ABC tf-idf โดยคำจำกัดความหมายถึงเมทริกซ์เต็มของน้ำหนัก บางทีคุณอาจจะสนใจในน้ำหนัก IDF log((number of docs)/(number of docs containing the term))เพียงอย่างเดียวที่คุณจะได้รับจาก คุณสามารถกรองเงื่อนไขที่ไม่บ่อยนักได้เช่นกัน
Zach

ชัดเจนมาก! ชื่นชมจริงๆ.
ABC

13

มีแพ็คเกจ tm (การขุดข้อความ) http://cran.r-project.org/web/packages/tm/index.htmlซึ่งควรทำสิ่งที่คุณต้องการ:

#read 1000 txt articles from directory data/txt
corpus  <-Corpus(DirSource("data/txt"), readerControl = list(blank.lines.skip=TRUE));
#some preprocessing
corpus <- tm_map(corpus, removeWords, stopwords("english"))
corpus <- tm_map(corpus, stripWhitespace)
corpus <- tm_map(corpus, stemDocument, language="english")
#creating term matrix with TF-IDF weighting
terms <-DocumentTermMatrix(corpus,control = list(weighting = function(x) weightTfIdf(x, normalize = FALSE)))

#or compute cosine distance among documents
dissimilarity(tdm, method = "cosine")

R เป็นภาษาที่ใช้งานได้ดังนั้นการอ่านโค้ดอาจยุ่งยาก (เช่น x ในเทอม)


2

รหัสของคุณมีข้อผิดพลาด: colSums คำนวณจำนวนการเกิดขึ้นในคลังข้อมูลไม่ใช่จำนวนข้อความที่มีคำ

การคำนวณรุ่นเช่นนี้จะเป็น:

tfidf=function(mat){
  tf <- mat
  id=function(col){sum(!col==0)}
  idf <- log(nrow(mat)/apply(mat, 2, id))
  tfidf <- mat
  for(word in names(idf)){tfidf[,word] <- tf[,word] * idf[word]}
  return(tfidf)
  }


1

ฉันมางานปาร์ตี้สายนี้ แต่ฉันกำลังเล่นกับแนวคิดของtc-idf (ฉันต้องการเน้นคำว่า 'แนวคิด' เพราะฉันไม่ได้ติดตามหนังสือใด ๆ สำหรับการคำนวณจริงดังนั้นพวกเขาอาจจะค่อนข้างปิดและแน่นอน ดำเนินการได้ง่ายขึ้นด้วยแพคเกจเช่นตาม{tm: Text Mining Package}ที่กล่าวไว้) และฉันคิดว่าสิ่งที่ฉันได้รับอาจเกี่ยวข้องกับคำถามนี้หรือในกรณีใด ๆ นี่อาจเป็นจุดที่เหมาะสำหรับการโพสต์


SET-UP:ฉันมีคลังของ5ย่อหน้ายาวนำมาจากสื่อสิ่งพิมพ์text 1ผ่าน5เช่นนิวยอร์กไทม์ส ถูกกล่าวหาว่ามันเป็น "ร่างกาย" ที่มีขนาดเล็กมากห้องสมุดเล็ก ๆ ดังนั้นจะพูดแต่รายการในห้องสมุด "ดิจิตอล" นี้ไม่ได้สุ่ม: รายการแรกและที่ห้าจัดการกับฟุตบอล (หรือ 'ฟุตบอล' สำหรับ 'สโมสรสังคม' (?) แถว ๆ นี้) และเฉพาะเจาะจงมากขึ้นเกี่ยวกับทีมที่ยิ่งใหญ่ที่สุดในปัจจุบัน ตัวอย่างเช่นtext 1เริ่มจาก ...

"ในช่วงเก้าปีที่ผ่านมาเมสซี่ได้พาสโมสรฟุตบอลบาร์เซโลนาไปสู่ตำแหน่งระดับชาติและระดับนานาชาติในขณะเดียวกันก็ทำลายสถิติของตัวเองในรูปแบบที่ดูเหมือนเป็นเรื่องไม่แน่นอน ... "

ดีมาก! ในอีกทางหนึ่งคุณจะต้องข้ามเนื้อหาในสามรายการในระหว่าง นี่คือตัวอย่าง ( text 2):

"ในช่วงเวลาไม่กี่ชั่วโมงทั่วเท็กซัสมิสเตอร์รูบิโอแนะนำว่ามิสเตอร์ทรัมป์ได้ปัสสาวะใส่กางเกงของเขาและใช้ผู้อพยพผิดกฎหมายมาเคาะข้อความ Twitter ที่ไม่สิ้นสุดของเขา ... "

ดังนั้นจะทำอย่างไรที่จะหลีกเลี่ยงค่าใช้จ่ายทั้งหมด "ท่อง" จากtext 1ไปtext 2ขณะที่ยังคงที่จะชื่นชมยินดีในวรรณคดีเกี่ยวกับยิ่งใหญ่เอฟซีบาร์เซโลนาในtext 5?


TC-IDF:ฉันแยกคำเหล่านี้textออกเป็นเวกเตอร์ที่มีความยาวทุกเส้น จากนั้นนับความถี่ของแต่ละคำสร้างเวกเตอร์ห้าตัว (หนึ่งอันสำหรับแต่ละอันtext) ซึ่งนับเฉพาะคำที่พบในคำที่เกี่ยวข้องtextเท่านั้น - คำอื่น ๆ ทั้งหมดที่เป็นtextของ s อื่น ๆนั้นมีค่าเป็นศูนย์ ในตัวอย่างแรกของtext 1ตัวอย่างเช่นเวกเตอร์จะมีการนับ 1 สำหรับคำว่า "เมสซี่" ในขณะที่ "ทรัมป์" จะมี 0. นี้เป็นTCส่วนหนึ่ง

IDFส่วนหนึ่งก็ยังคำนวณแยกต่างหากสำหรับแต่ละtextและผลใน 5 "พาหะ" (ผมคิดว่าผมได้รับการรักษาพวกเขาเป็นเฟรมข้อมูล) ที่มีการแปลงลอการิทึมของการนับของเอกสาร (เศร้าเพียงจากศูนย์ถึงห้าให้ห้องสมุดเล็ก ๆ ของเรา ) มีคำที่ระบุใน:

log(No. documents1+No. docs containing a word)text01text

tc×idftext


การเปรียบเทียบ:ตอนนี้มันเป็นเพียงเรื่องของการแสดงผลิตภัณฑ์ดอทท่ามกลาง "พาหะของคำสำคัญ"

คาดการณ์ผลิตภัณฑ์จุดของtext 1กับtext 5เป็น13.42645ขณะtext 1v. เป็นเพียงtext22.511799

รหัส R clunky (ไม่มีอะไรที่จะเลียนแบบ) เป็นที่นี่

นี่เป็นการจำลองขั้นพื้นฐานมาก แต่ฉันคิดว่ามันเป็นภาพกราฟิกที่ดีมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.