Внедрявам описания тук метод TF-IDF с Python/Pyspark, използвайки функция от mllib:
https://spark.apache.org/docs/1.3.0/mllib-feature-extraction.html
Имам комплект за обучение от 150 текстови документа, набор за тестване от 80 текстови документа. Създадох хеш таблица TF-IDF RDD (от редки вектори) както за обучение, така и за тестване, т.е. представяне на пакет от думи, наречено tfidf_train и tfidf_test. IDF се споделя между двамата и се основава единствено на данните за обучението. Въпросът ми се отнася до това как да се справя с редки RDD, има много малко информация.
Сега бих искал ефективно да картографирам всеки един от 80-те TF-IDF вектора на тестови документи към тренировъчния TF-IDF вектор, който споделя най-високото косинусово сходство. Чрез въвеждането на tfidf_test.first(), виждам, че всеки разреден TF-IDF вектор (съставляващ и двата RDD) изглежда по следния начин:
SparseVector(1048576, {0: 15.2313, 9377: 8.6483, 16538: 4.3241, 45005: 4.3241, 67046: 5.0173, 80280: 4.3241, 83104: 2.9378, 83107: 3 .0714, 87638: 3.9187, 90331: 3.9187, 110522: 1.7592, 138394 : 3.631, 140318: 4.3241, 147576: 4.3241, 165673: 4.3241, 172912: 3.9187, 179664: 4.3241, 179767: 5.0173, 189356: 1.047, 190 616: 4.3241, 192712: 4.3241, 193790: 3.4078, 220545: 3.9187, 221050: 3.4078 , 229110: 3.4078, 232286: 2.0728, 240477: 3.631, 241582: 4.3241, 242620: 3.9187, 245388: 5.0173, 252569: 2.8201, 255985: 5. 0173, 266130: 4.3241, 277170: 3.9187, 277863: 4.3241, 298406: 4.3241, 323505 : 4.3241, 326993: 3.2255, 330297: 4.3241, 334392: 3.4078, 354917: 3.631, 355604: 3.9187, 365855: 4.3241, 383386: 2.9378, 38 6534: 4.3241, 387896: 3.2255, 392015: 4.3241, 395372: 1.4619, 406995: 3.4078 , 414351: 5.0173, 433323: 4.3241, 434512: 4.3241, 438171: 4.3241, 439468: 4.3241, 453414: 3.9187, 454316: 4.3241, 456931: 3 .9187, 461229: 3.631, 488050: 5.0173, 506649: 4.3241, 508845: 3.0714, 512698 : 4.3241, 526484: 8.6483, 548929: 2.8201, 549530: 4.3241, 550044: 3.631, 555900: 4.3241, 557206: 6.451, 570917: 1.8392, 618 498: 3.4078, 623040: 3.5968, 637333: 4.3241, 645028: 2.9378, 669449: 3.0714 , 676506: 4.3241, 699388: 4.3241, 702049: 2.3782, 715677: 3.4078, 733071: 3.9187, 738831: 3.631, 743497: 8.6483, 782907: 1. 047, 793071: 4.3241, 801052: 4.3241, 805189: 3.2255, 811506: 4.3241, 812013 : 4.3241, 819994: 4.3241, 837270: 4.3241, 848755: 3.9187, 852042: 4.3241, 866553: 4.3241, 872996: 3.2255, 908183: 5.0173, 9 14226: 8.6483, 921216: 4.3241, 925934: 4.3241, 927892: 4.3241, 935542: 5.0173 , 941563: 1.0855, 958430: 3.4078, 959994: 1.7984, 977239: 3.9187, 978895: 3.0714, 1001818: 3.2255, 1002343: 3.2255, 1016145 : 4.3241, 1017725: 4.3241, 1031685: 8.1441})
Не съм сигурен как да сравня RDD, но мисля, че reduceByKey(lambda x,y: x*y) може да е полезен. Някой има ли идеи как да сканира всеки тестов вектор и да изведе в кортеж от (вектор, съвпадащ с от тренировъчен набор, стойност на косинусово сходство)?
Всяка помощ се оценява!