pspark로 제목 유사도 측정하기

5109 단어 Pyspark

개요


대량의 제목의 유사도를 측정하고 비슷한 제목의 항목을 열거하고 싶습니다.
이때 제목의 유사도를 도모하기 위해서는 (N*N)/2개의 제목을 비교해야 한다.
제목이 늘어나면서 CPU라면 힘들기 때문에 분산 처리 환경에서 병행 처리를 하고 싶어서 pspark에서 분산 환경에서 병행 처리가 가능한지 조사하고자 합니다.
코드가gist에 있습니다.

사용된 소스


spark 2.2.1
hadoop 2.7
시도된 CSV
결실
cid_1
title_1
cid_2
title_2
simularity
2
좋다
6
러브
0.33333333333333337
2
좋다
10
귀엽다.
0.25
2
좋다
11
서로 사랑하다
0.1875
2
좋다
4
아아아아
0.33333333333333337
2
좋다
8
아아아아
0.19999999999999996
2
좋다
5
그래.
0.6666666666666667
2
좋다
9
서로 사랑하다
0.25
6
러브
2
좋다
0.33333333333333337
사용된 조개

코드 작성 요점


리소스를 읽습니다.

df1 = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load(sample.csv.gz)
csv를 읽습니다.압축 가능합니다.

구역을 나누어 읽은 데이터 프레임을 병렬 처리할 수 있도록 하다

df1 = df1.repartition(分割するサイズ).cache()
test1 = df1.take(1)
읽은 데이터 프레임을 분할합니다.실제로는 자동으로 분할된다고 하는데 이 처리가 없으면 CPU 하나만 사용해서 이 처리를 넣었어요.정말 필요한 건지 모르겠어요.
나는 이 등록을 참고했다.

문장의 유사도를 조사하다


제목의 유사도는 리베르슈타인 거리를 측정해 조사한 것이다
filter(1.0 - (func.levenshtein(df1.title_1,df2.title_2) / func.greatest(func.length(df1.title_1),func.length(df2.title_2))) > 0.75)\
1.0-levennshtein(제목 1, 제목 2)/max(제목 1, 제목 2)에서 0.0-1.0까지의 유사도를 요구하는데 0.0은 전혀 비슷하지 않다.1.0 일치하는 것 같아요.
pspark에서 두 변수가 max를 찾을 때 max(a, b)를 사용할 수 없습니다.대신greatest(a,b)를 사용하여 max를 찾았습니다.

결과 내보내기

dfout.write.save('sampledir.',compression='snappy')
출력 결과는 snappy.parquet 형식으로 출력됩니다.

기타


explain

dfout.explain()
결과 표시
dfout.show(100)
그러나 일본어로 표시할 때는 예외가 발생했다.
pspark에서utf-8을 출력하기 위해 환경 변수를 지정합니다.
export PYTHONIOENCODING=utf8

통계 결과


EMR로 pspark에서 11만 개의 제목을 비교했다.


amazon EMR를 이용하여 pspark를 가동했습니다.
11만건이어서 조합 수량은 N*(N-1)로, 약 121억건의 조합으로 제목 유사도를 측정했다.총 시간m3.2xlarge은 5대, 7시간 정도, 금액은 약 35달러 정도다.

다른 방법.


기계 5대를 빌리는 데 7시간이 걸리는 것은 정말 힘들어서 다른 방법을 써 보았다.
비슷한 제목을 찾을 수 있기 때문에 simstring를 사용하여 비슷한 제목을 검색해 봤습니다.
위와 같은 데이터 세트는 11만건이 사용됐고, GCP의 n2-standard는 10분가량 걸려 집계됐다.
이제부터 제도가 얼마나 되는지 확인하는데 스파크는 돈이 너무 많이 들어서 이쪽 방법을 좀 더 해보려고요.

좋은 웹페이지 즐겨찾기