2016-10-27 1 views
2

특정 키워드가 있기 때문에 ~ 30k 개의 고유 한 문서가있는 데이터 집합이 있습니다. 데이터 세트의 주요 필드 중 일부는 문서 제목, 파일 크기, 키워드 및 발췌문 (키워드 주변의 50 단어)입니다. 30K 개 이상의 고유 한 문서에는 각각 키워드가 여러 개 있으며 각 문서에는 키워드 당 데이터 집합에 한 줄이 있습니다 (따라서 각 문서에는 여러 줄이 있습니다). 여기에 원시 데이터 세트에서 키 필드의 모양에 대한 예입니다Pyspark - 여러 스파 스 벡터 합계 (CountVectorizer 출력)

Raw Data Example

내 목표는 특정 발행 수 (아이 등, 숙제에 대해 불평) 그래서 대한 플래그 문서에 대한 모델을 구축하는 것입니다

키워드 및 발췌 필드를 벡터화하고 고유 한 문서마다 한 줄씩 표시해야합니다.

내가하려는 일의 예로 키워드 만 사용 - Tokenizer, StopWordsRemover 및 CountVectorizer를 적용한 다음 카운트 벡터화 결과로 희소 행렬을 출력합니다. 스파 스 벡터 (158, {7 : 1.0, 65 : 1.0, 78 : 2.0, 110 : 1.0, 155 : 3.0}) 한 스파 스 벡터는 같은 보일 수 있습니다

내가하고 싶은 두 가지 중 하나를

  1. 가 조밀 한 벡터에 스파 스 벡터 변환, 그때 수있는 ID를 GROUPBY 및 각 열 (한 열 = 하나의 토큰)
  2. 가 직접 (수있는 ID에 의해 그룹화) 스파 스 벡터에 걸쳐 합계

하는 줄을 요약 할 수 있습니다 당신은 제가 말한 것에 대한 아이디어를 가지고 있습니다 - 아래 이미지의 왼쪽에는 원하는 고밀도 벡터 표현이 있습니다. CountVectorizer의 출력은 왼쪽에 내가 원하는 최종 데이터 세트입니다.

CountVectorizer Output & Desired Dataset

답변

1

나는 시도 할 것이다 :

>>> from pyspark.ml.linalg import SparseVector, DenseVector 
>>> 
>>> df = sc.parallelize([ 
...  (1, SparseVector(158, {7: 1.0, 65: 1.0, 78: 2.0, 110: 1.0, 155: 3.0})), 
...  (1, SparseVector(158, {99: 100.0})), 
...  (2, SparseVector(158, {1: 1.0})), 
... ]).toDF(["docId", "features"]) 
>>> df.rdd.mapValues(lambda v: v.toArray()) \ 
...  .reduceByKey(lambda x, y: x + y) \ 
...  .mapValues(lambda x: DenseVector(x)) \ 
...  .toDF(["docId", "features"]) 
+0

감사합니다! 제가 말할 수있는 한, 대부분의 기계 학습 함수 (SVM, Logistic Regression 등)는 밀도 벡터를 입력으로 받아들입니다 - 올바른가? 즉, 각 토큰에 대한 열을 만들기 위해 고밀도 벡터를 구문 분석 할 필요가 없습니다. –

+0

벡터, (스파 스 또는 밀도). –