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 Tokenizer
và StringIndexer
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.
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