lcs动态规划法
二维数组表达
- 使用二维数组C[m,n]
- C[i,j]记录序列的Xi和Yj的最长子序列长度
- 当i = 0或者j = 0时,空序列是Xi和Yj的最长公共子序列,故C[i,j] = 0
创建hive表并导入要lcs的数据
create table lcs_data(a string,b string)
row format delimited fields terminated by '\t';
load data local inpath '/home/zhanzhy/Documents/data/lcs_data.txt' overwrite into table lcs_data;
select * from lcs_data;
lcs_data.txt数据
技术领先的绿色低能耗数据中心 绿色能耗数据中心
词袋模型(Bag Of Words) 词袋模型
所有词单元 对应词单元
MF/LSA/LDA等降维的方法 LDA模型,ESA模型,LSA模型
运输问题的优化目标 运送货物的重量
对文本进行语义标注 人工规则进行标注
lcs.py
# -*- coding:utf-8 -*-
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType
from pyspark.sql import SparkSession
# 解决编码问题
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
spark = SparkSession.builder \
.appName("LCS Test") \
.enableHiveSupport() \
.getOrCreate()
df = spark.sql("select * from lcs_data")
df.show()
def lcs(a, b):
n = len(a)
m = len(b)
l = [[0] * (m + 1) for x in range(n + 1)]
for i in range(1, n + 1):
for j in range(1, m + 1):
if a[i - 1] == b[j - 1]:
l[i][j] = l[i - 1][j - 1] + 1
else:
# 使用max需from pyspark.sql.functions import udf
l[i][j] = max(l[i - 1][j], l[i][j - 1])
# l[i][j] = l[i - 1][j] if l[i - 1][j] > l[i][j - 1] \
# else l[i][j - 1]
return l[-1][-1]
lcs_udf = udf(lcs, IntegerType())
df_score = df.withColumn("score", lcs_udf(df.a, df.b))
df_score.show()
run_lcs.sh
PARK_PYTHON=./ANACONDA/dev/bin/python
cd $SPARK_HOME
./bin/spark-submit \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./ANACONDA/dev/bin/python \
--master yarn-cluster \
--files $HIVE_HOME/conf/hive-site.xml \
--archives /home/zhanzhy/Documents/code/pyspark/dev.zip#ANACONDA \
/home/zhanzhy/Documents/code/pyspark/lcs.py
执行sh run_lcs.sh在yarn上的结果