2015-08-29 12 views
9

Tôi đã tạo Tần suất thời hạn sử dụng HashingTF trong Spark. Tôi có tần suất cụm từ sử dụng tf.transform cho mỗi từ.Cách lấy chi tiết từ TF Vector RDD trong Spark ML Lib?

Nhưng kết quả được hiển thị ở định dạng này.

[<hashIndexofHashBucketofWord1>,<hashIndexofHashBucketofWord2> ...] 
,[termFrequencyofWord1, termFrequencyOfWord2 ....] 

ví dụ:

(1048576,[105,3116],[1.0,2.0]) 

tôi có thể có được các chỉ số trong xô băm, sử dụng tf.indexOf("word").

Nhưng, làm cách nào để có được từ đó bằng chỉ mục?

Trả lời

20

Vâng, bạn không thể. Vì băm không tiêm nên không có chức năng nghịch đảo. Nói cách khác, số lượng mã thông báo vô hạn có thể ánh xạ tới một nhóm duy nhất để không thể biết được mã nào thực sự ở đó.

Nếu bạn đang sử dụng băm lớn và số lượng mã thông báo duy nhất tương đối thấp thì bạn có thể thử tạo bảng tra cứu từ nhóm đến mã thông báo có thể từ tập dữ liệu của mình. Đây là bản đồ một-nhiều nhưng nếu các điều kiện trên được đáp ứng, số lượng xung đột sẽ tương đối thấp.

Nếu bạn cần chuyển đổi có thể đảo ngược, bạn có thể sử dụng kết hợp TokenizerStringIndexer và tạo vectơ tính năng thưa thớt theo cách thủ công.

Xem thêm: What hashing function does Spark use for HashingTF and how do I duplicate it?

Sửa:

Trong Spark 1.5 + (PySpark 1.6 trở lên), bạn có thể sử dụng CountVectorizer áp dụng chuyển đổi đảo ngược và lưu trữ từ vựng.

Python:

from pyspark.ml.feature import CountVectorizer 

df = sc.parallelize([ 
    (1, ["foo", "bar"]), (2, ["foo", "foobar", "baz"]) 
]).toDF(["id", "tokens"]) 

vectorizer = CountVectorizer(inputCol="tokens", outputCol="features").fit(df) 
vectorizer.vocabulary 
## ('foo', 'baz', 'bar', 'foobar') 

Scala:

import org.apache.spark.ml.feature.{CountVectorizer, CountVectorizerModel} 

val df = sc.parallelize(Seq(
    (1, Seq("foo", "bar")), (2, Seq("foo", "foobar", "baz")) 
)).toDF("id", "tokens") 

val model: CountVectorizerModel = new CountVectorizer() 
    .setInputCol("tokens") 
    .setOutputCol("features") 
    .fit(df) 

model.vocabulary 
// Array[String] = Array(foo, baz, bar, foobar) 

nơi phần tử ở vị trí 0 tương ứng với chỉ số 0, phần tử ở vị trí 1 đến chỉ số 1 và vân vân.

+1

Tôi chỉ muốn thêm rằng bạn có thể thấy trong [tài liệu] (https://spark.apache.org/docs/1.6.0/api/python/pyspark.mllib.html) kể từ 1.2.0 , bạn có thể gọi indexOf (thuật ngữ) – Matt

Các vấn đề liên quan