diff --git a/translate/analytics/Distribution.ipynb b/translate/analytics/Distribution.ipynb new file mode 100644 index 0000000..c6c383b --- /dev/null +++ b/translate/analytics/Distribution.ipynb @@ -0,0 +1,126 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "ba8f64d9-3fda-488c-93a4-ae7f1e0b9e97", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "4a03c1cb-feb5-4a33-92d2-6c6ed92d0645", + "metadata": {}, + "outputs": [], + "source": [ + "def draw_histogram(filename, bin_range, bin_width, dataset_name):\n", + " \"\"\"\n", + " 绘制频率分布直方图\n", + "\n", + " Args:\n", + " filename: 数据文件路径\n", + " bin_range: 区间范围,一个长度为2的列表,表示最小值和最大值\n", + " bin_width: 区间间隔\n", + "\n", + " Returns:\n", + " None\n", + " \"\"\"\n", + "\n", + " # 读取数据\n", + " data = np.loadtxt(filename)\n", + "\n", + " # 计算bin的个数\n", + " num_bins = int((bin_range[1] - bin_range[0]) / bin_width)\n", + "\n", + " # 绘制直方图\n", + " plt.hist(data, bins=num_bins, range=bin_range)\n", + "\n", + " # 设置标题和坐标轴标签\n", + " plt.title('Quality Distribution of ' + dataset_name)\n", + " plt.xlabel('Quality Score (cos-sim of embeddings for each pair)')\n", + " plt.ylabel('Frequency')\n", + "\n", + " # 显示图形\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "55ffc3e1-0807-403a-ae1f-c7520ec9f46f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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5Uw3b94UAwcOFO7u7kKpVApLS0vRoEEDsWzZsiwXv0tLSxM//fSTaNSokbCyshJGRkbCzc1N9O/fX+209PzWkd2p52vWrBEVKlQQxsbGonLlyiI4ODjbv6cbN26Ixo0bC1NT02wvKvj+e/3uvEydOnUSlpaWIjo6Wq1d5sXz5s2bl2v9QghRvXp1ERgYKD3P/Jzm9Xj3tHno8KKCua0z83OW299Z5nv0/qnn6enpwtnZWUyePDnPOki3FEIU8VF99J+0YcMG9OvXD3369MGGDRv0XU6+jRkzBmvWrEFcXBzMzMz0XQ6RLP38888ICgpCTExMvm7T8aHavn07evXqhaioKJ0cFE35x2N2qEj07dsXc+bMwc8//4yvv/5a3+XkS3JyMn755Rd07tyZQYeoEPXu3RtlypTB8uXL9V1KoZo3bx6GDx/OoKMHHNkhes+jR49w8OBB/Pbbb9i+fTvOnz+PGjVq6LssIiLSEg9QJnrPtWvX0Lt3bzg4OOC7775j0CEi+sBxZIeIiIhkjcfsEBERkawx7BAREZGs8ZgdvL1y6YMHD2BpacmbsxEREX0ghBBITEyEi4tLrhevZNjB2/sCubq66rsMIiIi0sK9e/dQunTpHOcz7ACwtLQE8PbNUqlUeq6GiIiI8iMhIQGurq7S93hOGHbwf3f+ValUDDtEREQfmLwOQeEBykRERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGsMO0RERCRrDDtEREQkaww7REREJGuG+i6AiIg+LO5f7dbqddFz/XRcCVH+cGSHiIiIZI0jO0RE/1HajtAQfWg4skNERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREsmao7wKIiKhg3L/are8SiIo1juwQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrPE6O0REVCS0vR5Q9Fw/HVdC/zUc2SEiIiJZY9ghIiIiWWPYISIiIllj2CEiIiJZKzZhZ+7cuVAoFBg9erQ0LTk5GUFBQbCzs4OFhQU6d+6Mhw8fqr0uJiYGfn5+MDMzg4ODA8aPH4+0tLQirp6IiIiKq2IRds6cOYMffvgB1atXV5s+ZswY7Ny5E6GhoTh69CgePHiATp06SfPT09Ph5+eH1NRUnDp1CuvXr8e6deswZcqUou4CERERFVMKIYTQZwFJSUmoVasWVqxYgVmzZqFGjRpYsmQJ4uPjYW9vj02bNqFLly4AgBs3bsDT0xPh4eGoX78+9u7dizZt2uDBgwdwdHQEAKxatQoTJkzA48ePoVQq81VDQkICrKysEB8fD5VKVWh9JSIqDNqe0i13PGVd/vL7/a33kZ2goCD4+fnBx8dHbfq5c+fw5s0btemVK1dGmTJlEB4eDgAIDw9HtWrVpKADAL6+vkhISMDVq1dzXGdKSgoSEhLUHkRERCRPer2oYEhICM6fP48zZ85kmRcXFwelUglra2u16Y6OjoiLi5PavBt0MudnzsvJnDlzMH369AJWT0RERB8CvY3s3Lt3D6NGjcLGjRthYmJSpOueOHEi4uPjpce9e/eKdP1ERERUdPQWds6dO4dHjx6hVq1aMDQ0hKGhIY4ePYrvvvsOhoaGcHR0RGpqKl68eKH2uocPH8LJyQkA4OTklOXsrMznmW2yY2xsDJVKpfYgIiIiedJb2GnevDkuX76MiIgI6VGnTh307t1b+reRkREOHTokvSYyMhIxMTHw9vYGAHh7e+Py5ct49OiR1CYsLAwqlQpVqlQp8j4RERFR8aO3Y3YsLS3h5eWlNs3c3Bx2dnbS9MDAQIwdOxa2trZQqVQYMWIEvL29Ub9+fQBAy5YtUaVKFfj7+2P+/PmIi4vD5MmTERQUBGNj4yLvExERERU/xfqu54sXL0aJEiXQuXNnpKSkwNfXFytWrJDmGxgYYNeuXRg6dCi8vb1hbm6OgIAAzJgxQ49VExERUXGi9+vsFAe8zg4Rfch4nZ3s8To78vfBXGeHiIiIqDAx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawx7BAREZGsMewQERGRrDHsEBERkawZ6rsAIiJ6y/2r3fougUiWOLJDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREsqbXsLNy5UpUr14dKpUKKpUK3t7e2Lt3rzQ/OTkZQUFBsLOzg4WFBTp37oyHDx+qLSMmJgZ+fn4wMzODg4MDxo8fj7S0tKLuChERERVTeg07pUuXxty5c3Hu3DmcPXsWn376Kdq3b4+rV68CAMaMGYOdO3ciNDQUR48exYMHD9CpUyfp9enp6fDz80NqaipOnTqF9evXY926dZgyZYq+ukRERETFjEIIIfRdxLtsbW2xYMECdOnSBfb29ti0aRO6dOkCALhx4wY8PT0RHh6O+vXrY+/evWjTpg0ePHgAR0dHAMCqVaswYcIEPH78GEqlMl/rTEhIgJWVFeLj46FSqQqtb0REuXH/are+S5CV6Ll++i6BCll+v7+LzTE76enpCAkJwcuXL+Ht7Y1z587hzZs38PHxkdpUrlwZZcqUQXh4OAAgPDwc1apVk4IOAPj6+iIhIUEaHcpOSkoKEhIS1B5EREQkT3oPO5cvX4aFhQWMjY0xZMgQbNu2DVWqVEFcXByUSiWsra3V2js6OiIuLg4AEBcXpxZ0MudnzsvJnDlzYGVlJT1cXV112ykiIiIqNvQedipVqoSIiAicPn0aQ4cORUBAAK5du1ao65w4cSLi4+Olx7179wp1fURERKQ/hvouQKlUonz58gCA2rVr48yZM1i6dCm6d++O1NRUvHjxQm105+HDh3BycgIAODk54e+//1ZbXubZWpltsmNsbAxjY2Md94SIiIiKI72P7LwvIyMDKSkpqF27NoyMjHDo0CFpXmRkJGJiYuDt7Q0A8Pb2xuXLl/Ho0SOpTVhYGFQqFapUqVLktRMREVHxo9eRnYkTJ6JVq1YoU6YMEhMTsWnTJhw5cgT79++HlZUVAgMDMXbsWNja2kKlUmHEiBHw9vZG/fr1AQAtW7ZElSpV4O/vj/nz5yMuLg6TJ09GUFAQR26IiIgIgJ7DzqNHj9C3b1/ExsbCysoK1atXx/79+9GiRQsAwOLFi1GiRAl07twZKSkp8PX1xYoVK6TXGxgYYNeuXRg6dCi8vb1hbm6OgIAAzJgxQ19dIiIiomKm2F1nRx94nR0iKg54nR3d4nV25O+Du84OERERUWFg2CEiIiJZY9ghIiIiWWPYISIiIllj2CEiIiJZY9ghIiIiWWPYISIiIlnTKuzcuXNH13UQERERFQqtwk758uXRrFkz/PLLL0hOTtZ1TUREREQ6o9XtIs6fP4/g4GCMHTsWw4cPR/fu3REYGIi6devquj4iog8Or4RMVLxoNbJTo0YNLF26FA8ePMDatWsRGxuLhg0bwsvLC4sWLcLjx491XScRERGRVgp0gLKhoSE6deqE0NBQzJs3D7dv38a4cePg6uoq3eCTiIiISJ8KFHbOnj2LYcOGwdnZGYsWLcK4ceMQFRWFsLAwPHjwAO3bt9dVnURERERa0eqYnUWLFiE4OBiRkZFo3bo1NmzYgNatW6NEibfZqWzZsli3bh3c3d11WSsRERGRxrQKOytXrsSAAQPQr18/ODs7Z9vGwcEBa9asKVBxRERERAWlVdi5detWnm2USiUCAgK0WTwRERGRzmgVdoKDg2FhYYGuXbuqTQ8NDcWrV68YcoiISO8KcgmA6Ll+OqyE9E2rA5TnzJmDkiVLZpnu4OCA2bNnF7goIiIiIl3RKuzExMSgbNmyWaa7ubkhJiamwEURERER6YpWYcfBwQGXLl3KMv3ixYuws7MrcFFEREREuqJV2OnZsydGjhyJw4cPIz09Henp6fjzzz8xatQo9OjRQ9c1EhEREWlNqwOUZ86ciejoaDRv3hyGhm8XkZGRgb59+/KYHSIiIipWtAo7SqUSW7ZswcyZM3Hx4kWYmpqiWrVqcHNz03V9RERERAWiVdjJVLFiRVSsWFFXtRARERHpnFZhJz09HevWrcOhQ4fw6NEjZGRkqM3/888/dVIcERERUUFpFXZGjRqFdevWwc/PD15eXlAoFLqui4hI7wpyUToiKj60CjshISH49ddf0bp1a13XQ0RERKRTWp16rlQqUb58eV3XQkRERKRzWoWdL774AkuXLoUQQtf1EBEREemUVruxTpw4gcOHD2Pv3r2oWrUqjIyM1OZv3bpVJ8URERERFZRWYcfa2hodO3bUdS1EREREOqdV2AkODtZ1HURERESFQqtjdgAgLS0NBw8exA8//IDExEQAwIMHD5CUlKSz4oiIiIgKSquRnX/++QefffYZYmJikJKSghYtWsDS0hLz5s1DSkoKVq1apes6iYiIiLSi1cjOqFGjUKdOHTx//hympqbS9I4dO+LQoUM6K46IiIiooLQa2Tl+/DhOnToFpVKpNt3d3R3//vuvTgojIiIi0gWtwk5GRgbS09OzTL9//z4sLS0LXBQRkS7xtg9E/21a7cZq2bIllixZIj1XKBRISkrC1KlTeQsJIiIiKla0GtlZuHAhfH19UaVKFSQnJ6NXr164desWSpYsic2bN+u6RiIiIiKtaRV2SpcujYsXLyIkJASXLl1CUlISAgMD0bt3b7UDlomIiIj0TauwAwCGhobo06ePLmshIiIi0jmtws6GDRtynd+3b1+tiiEiIiLSNa3CzqhRo9Sev3nzBq9evYJSqYSZmRnDDhERERUbWp2N9fz5c7VHUlISIiMj0bBhQx6gTERERMWK1vfGel+FChUwd+7cLKM+RERERPqks7ADvD1o+cGDB7pcJBEREVGBaHXMzh9//KH2XAiB2NhYfP/992jQoIFOCiMiIiLSBa3CTocOHdSeKxQK2Nvb49NPP8XChQt1URcRERGRTmh9bywiIiKiD4FOj9khIiIiKm60GtkZO3ZsvtsuWrRIm1UQERER6YRWYefChQu4cOEC3rx5g0qVKgEAbt68CQMDA9SqVUtqp1AodFMlERERkZa0Cjtt27aFpaUl1q9fDxsbGwBvLzTYv39/NGrUCF988YVOiyQiIiLSllbH7CxcuBBz5syRgg4A2NjYYNasWTwbi4iIiIoVrcJOQkICHj9+nGX648ePkZiYWOCiiIiIiHRFq7DTsWNH9O/fH1u3bsX9+/dx//59/P777wgMDESnTp10XSMRERGR1rQ6ZmfVqlUYN24cevXqhTdv3rxdkKEhAgMDsWDBAp0WSEREVNTcv9qt1eui5/rpuBLSBa3CjpmZGVasWIEFCxYgKioKAODh4QFzc3OdFkdERERUUAW6qGBsbCxiY2NRoUIFmJubQwihq7qIiIiIdEKrsPP06VM0b94cFStWROvWrREbGwsACAwM5GnnREREVKxoFXbGjBkDIyMjxMTEwMzMTJrevXt37Nu3T2fFERERERWUVsfsHDhwAPv370fp0qXVpleoUAH//POPTgojIiIi0gWtRnZevnypNqKT6dmzZzA2Ni5wUURERES6olXYadSoETZs2CA9VygUyMjIwPz589GsWTOdFUdERERUUFrtxpo/fz6aN2+Os2fPIjU1FV9++SWuXr2KZ8+e4eTJk7qukYiIiEhrWo3seHl54ebNm2jYsCHat2+Ply9folOnTrhw4QI8PDx0XSMRERGR1jQOO2/evEHz5s3x6NEjTJo0Cb/++iv27NmDWbNmwdnZWaNlzZkzBx9//DEsLS3h4OCADh06IDIyUq1NcnIygoKCYGdnBwsLC3Tu3BkPHz5UaxMTEwM/Pz+YmZnBwcEB48ePR1pamqZdIyIiIhnSOOwYGRnh0qVLOln50aNHERQUhL/++gthYWF48+YNWrZsiZcvX0ptxowZg507dyI0NBRHjx7FgwcP1O6/lZ6eDj8/P6SmpuLUqVNYv3491q1bhylTpuikRiIiIvqwKYQWlz0eM2YMjI2NMXfuXJ0W8/jxYzg4OODo0aNo3Lgx4uPjYW9vj02bNqFLly4AgBs3bsDT0xPh4eGoX78+9u7dizZt2uDBgwdwdHQE8PbeXRMmTMDjx4+hVCrzXG9CQgKsrKwQHx8PlUql0z4Rkf5pe58jIk3x3lhFK7/f31odoJyWloa1a9fi4MGDqF27dpZ7Yi1atEibxSI+Ph4AYGtrCwA4d+4c3rx5Ax8fH6lN5cqVUaZMGSnshIeHo1q1alLQAQBfX18MHToUV69eRc2aNbOsJyUlBSkpKdLzhIQEreolIiKi4k+jsHPnzh24u7vjypUrqFWrFgDg5s2bam0UCoVWhWRkZGD06NFo0KABvLy8AABxcXFQKpWwtrZWa+vo6Ii4uDipzbtBJ3N+5rzszJkzB9OnT9eqTiIiIvqwaBR2KlSogNjYWBw+fBjA29tDfPfdd1nChjaCgoJw5coVnDhxosDLysvEiRMxduxY6XlCQgJcXV0Lfb1ERERU9DQKO+8f3rN37161g4m1NXz4cOzatQvHjh1TuwWFk5MTUlNT8eLFC7XRnYcPH8LJyUlq8/fff6stL/Nsrcw27zM2NuaVnomIiP4jtLrOTiYtjm3O8vrhw4dj27Zt+PPPP1G2bFm1+bVr14aRkREOHTokTYuMjERMTAy8vb0BAN7e3rh8+TIePXoktQkLC4NKpUKVKlUKVB8RERF9+DQa2VEoFFmOydH2GB3g7a6rTZs2YceOHbC0tJSOsbGysoKpqSmsrKwQGBiIsWPHwtbWFiqVCiNGjIC3tzfq168PAGjZsiWqVKkCf39/zJ8/H3FxcZg8eTKCgoI4ekNERESa78bq16+fFCKSk5MxZMiQLGdjbd26NV/LW7lyJQCgadOmatODg4PRr18/AMDixYtRokQJdO7cGSkpKfD19cWKFSuktgYGBti1axeGDh0Kb29vmJubIyAgADNmzNCka0RERCRTGl1np3///vlqFxwcrHVB+sDr7BDJG6+zQ0WF19kpWoVynZ0PLcQQERERFegAZSIiIqLijmGHiIiIZI1hh4iIiGSNYYeIiIhkjWGHiIiIZI1hh4iIiGSNYYeIiIhkjWGHiIiIZI1hh4iIiGSNYYeIiIhkjWGHiIiIZI1hh4iIiGSNYYeIiIhkjWGHiIiIZI1hh4iIiGTNUN8FEBHll/tXu/VdAhF9gDiyQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGu54TUZHincuJqKhxZIeIiIhkjWGHiIiIZI1hh4iIiGSNYYeIiIhkjWGHiIiIZI1hh4iIiGSNYYeIiIhkjWGHiIiIZI1hh4iIiGSNYYeIiIhkjWGHiIiIZI33xiIirfAeV0T0oeDIDhEREckaww4RERHJGsMOERERyRrDDhEREckaww4RERHJGsMOERERyRrDDhEREckaww4RERHJGsMOERERyRrDDhEREckaww4RERHJGsMOERERyRrDDhEREckaww4RERHJGsMOERERyRrDDhEREckaww4RERHJmqG+CyAiIpIL9692a/W66Ll+Oq6E3sWRHSIiIpI1hh0iIiKSNYYdIiIikjWG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fPHFF1i9enW+16GrbQjk/beTudzJkyejefPm8PT0zDL6WL16dURERODZs2carTsvaWlpau9lZGQkXrx4IX0OTp48iX79+qFjx46oVq0anJycEB0drfX6rly5gpo1axa07P8khh3K1vfff4+UlBT4+vri2LFjuHfvHvbt24cWLVqgYsWKmDJlitT2008/xffff48LFy7g7NmzGDJkiNqvpAoVKiAmJgYhISGIiorCd999p/GXpbu7O06fPo3o6Gg8efJE+sVlYGCAfv36YeLEiahQoUKWXQvva9q0KX744QecO3cO0dHR2LNnD77++ms0a9ZMGv4OCAjAgAEDsH37dty9exdHjhzBr7/+CgAYNmwY7t27hxEjRuDGjRvYsWMHpk6dirFjx+Z6ymxQUBCePXuGnj174syZM4iKisL+/fvRv3//bEMc8DZE1qpVCydOnFB7HwpS3+nTpzF79mycPXsWMTEx2Lp1Kx4/fiz95/w+TdvrQoUKFdC+fXsMHDgQJ06cwMWLF9GnTx+UKlUK7du3z/dyfHx84O3tjQ4dOuDAgQOIjo7GqVOnMGnSpCxf9toIDQ3F2rVrcfPmTUydOhV///03hg8fDgDo3bs3SpYsifbt2+P48ePSdho5cqS0u3PUqFGYO3cutm/fjhs3bmDYsGFqF+OzsLBAYGAgxo8fjz///BNXrlxBv379Cnxq9uDBg3Hjxg1MmDABN2/exK+//ipdKylzlGX06NHYv38/7t69i/Pnz+Pw4cMabXNdbUMg778dGxsb2NnZ4ccff8Tt27fx559/YuzYsWrL6NmzJ5ycnNChQwecPHkSd+7cwe+//47w8HCNanmfkZERRowYgdOnT+PcuXPo168f6tevL+0WrFChArZu3YqIiAhcvHgRvXr10nq0KDo6Gv/++y98fHwKVPN/FcMOZatChQo4c+YMypUrh27dusHNzQ2tWrVCxYoVcfLkSbXrvixcuBCurq5o1KgRevXqhXHjxqntSmrXrh3GjBmD4cOHo0aNGjh16hT+97//aVTPuHHjYGBggCpVqsDe3l5tn3dgYCBSU1PRv3//PJfj6+uL9evXo2XLlvD09MSIESPg6+srhQUAWLlyJbp06YJhw4ahcuXKGDhwoHTl0lKlSmHPnj34+++/8dFHH2HIkCEIDAzE5MmTc12vi4sLTp48ifT0dLRs2RLVqlXD6NGjYW1tneuX1+eff55lV0hB6lOpVDh27Bhat26NihUrYvLkyVi4cCFatWqV7fo1ba8rwcHBqF27Ntq0aQNvb28IIbBnz54suxpyo1AosGfPHjRu3Bj9+/dHxYoV0aNHD/zzzz/ScUMFMX36dISEhKB69erYsGEDNm/eLI1amJmZ4dixYyhTpgw6deoET09PBAYGIjk5GSqVCgDwxRdfwN/fHwEBAfD29oalpWWW3cYLFixAo0aN0LZtW/j4+KBhw4ZZjgfTVNmyZfHbb79h69atqF69OlauXIlJkyYBAIyNjQG8veZNUFAQPD098dlnn6FixYpYsWKFRuvRxTYE8v7bKVGiBEJCQnDu3Dl4eXlhzJgxWLBggdoylEolDhw4AAcHB7Ru3RrVqlXD3LlzYWBgoFEt7zMzM8OECRPQq1cvNGjQABYWFtiyZYs0f9GiRbCxscEnn3yCtm3bwtfXF7Vq1dJqXZs3b0bLli3h5uZWoJr/qxQir6NQif6/qVOnYtGiRQgLC0P9+vX1XY7k+PHjaN68Oe7du6eTL7Hi5PXr16hUqRK2bNmS56gVkba++eYbrFq1Cvfu3dN3KR+MdevWYfTo0UVya4zU1FRUqFABmzZtQoMGDQp9fXLEA5Qp36ZPnw53d3f89ddfqFu3rt6vdJqSkoLHjx9j2rRp6Nq1q+yCDvD2wMoNGzbgyZMn+i6FZGTFihX4+OOPYWdnh5MnT2LBggXSLjgqfmJiYvD1118z6BQAww5pJD+7iorK5s2bERgYiBo1amDDhg36LqfQNG3aVN8lkMzcunULs2bNwrNnz1CmTBl88cUXmDhxor7LohxkHpBN2uNuLCIiIpI1HqBMREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESyxrBDREREssawQ0RERLLGsENERESy9v8AQpxxj6f2ReUAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# 示例用法\n", + "filename = './ccmatrix/CCMatrix.en-zh.sample.sim' # 替换为你的文件名\n", + "bin_range = [0.2, 1] # 设置区间范围\n", + "bin_width = 0.025 # 设置区间间隔\n", + "\n", + "draw_histogram(filename, bin_range, bin_width, \"CCMatrix (ZH-EN)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "e6385cff-4b14-4177-9aa1-7e01b3af2b8f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# 示例用法\n", + "filename = './translation2019/result.sim' # 替换为你的文件名\n", + "bin_range = [0.2, 1] # 设置区间范围\n", + "bin_width = 0.025 # 设置区间间隔\n", + "\n", + "draw_histogram(filename, bin_range, bin_width, \"nlp_chinese_corpus/translation2019\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/translate/analytics/ccmatrix/check_sim.py b/translate/analytics/ccmatrix/check_sim.py new file mode 100644 index 0000000..2282955 --- /dev/null +++ b/translate/analytics/ccmatrix/check_sim.py @@ -0,0 +1,79 @@ +import torch +from transformers import AutoModel, AutoTokenizer +from numpy.linalg import norm +import sys +import random +from tqdm import tqdm + +# Define the cosine similarity function +cos_sim = lambda a, b: (a @ b.T) / (norm(a) * norm(b)) + +# Load the model and tokenizer +model_name = 'jinaai/jina-embeddings-v2-base-zh' +model = AutoModel.from_pretrained(model_name, trust_remote_code=True) + +# Check if the correct number of command-line arguments are provided +if len(sys.argv) < 4 or len(sys.argv) > 5: + print("Usage: python script.py [num_samples]") + sys.exit(1) + +# Define file paths from command-line arguments +file_a_path = sys.argv[1] +file_b_path = sys.argv[2] +output_file_path = sys.argv[3] + +# Define the number of samples to randomly select +num_samples = int(sys.argv[4]) if len(sys.argv) == 5 else 100 + +# Get the total number of lines in the files without loading them fully +def count_lines(file_path): + with open(file_path, 'r', encoding='utf-8') as f: + return sum(1 for _ in f) + +total_lines_a = count_lines(file_a_path) +total_lines_b = count_lines(file_b_path) + +# Ensure both files have the same number of lines +if total_lines_a != total_lines_b: + print("Files must have the same number of lines.") + sys.exit(1) + +# Select random sample indices without loading entire files +selected_indices = sorted(random.sample(range(total_lines_a), num_samples)) + +# Function to get all sampled lines from the file +def get_lines(file_path, line_numbers): + result = [] + max_i = max(line_numbers) + j=0 + next_i = line_numbers[j] + len_line_numbers = len(line_numbers) + with open(file_path, 'r', encoding='utf-8') as f: + for current_line, line in tqdm(enumerate(f)): + if current_line < next_i: + continue + result.append(line.strip()) + j+=1 + if current_line >= max_i or j >= len_line_numbers: + return result + next_i = line_numbers[j] + + return result + +lines_a = get_lines(file_a_path, selected_indices) +lines_b = get_lines(file_b_path, selected_indices) + +# Open output file for writing +with open(output_file_path, 'w', encoding='utf-8') as output_file: + for i, idx in tqdm(enumerate(selected_indices)): + # Get the corresponding lines from both files + line_a = lines_a[i] + line_b = lines_b[i] + + embeddings = model.encode([line_a, line_b]) + similarity = cos_sim(embeddings[0], embeddings[1]) + + # Write the similarity to the output file + output_file.write(f"{similarity}\n") + +print(f"Similarity calculation completed. Results saved to {output_file_path}") diff --git a/translate/analytics/filter.py b/translate/analytics/filter.py new file mode 100644 index 0000000..59381e0 --- /dev/null +++ b/translate/analytics/filter.py @@ -0,0 +1,59 @@ +from transformers import AutoModel +from numpy.linalg import norm +import argparse +from tqdm import tqdm + +parser = argparse.ArgumentParser( + description="Usage: python filter.py " +) + +parser.add_argument("file_a", type=str, help="File No.1") +parser.add_argument("file_b", type=str, help="File No.2") +parser.add_argument("output", type=str, help="Output file") +parser.add_argument( + "--resume", + type=int, + default=-1, + help="Resume from specified line", +) +args = parser.parse_args() + +# Define the cosine similarity function +cos_sim = lambda a, b: (a @ b.T) / (norm(a) * norm(b)) + +# Load the model and tokenizer +model_name = 'jinaai/jina-embeddings-v2-base-zh' +model = AutoModel.from_pretrained(model_name, trust_remote_code=True) + +# Define file paths from command-line arguments +file_a_path = args.file_a +file_b_path = args.file_b +output_file_path = args.output + +resume_from = args.resume +resume = resume_from >= 0 +output_file_mode = 'a' if resume else 'w' + +# Open files +with open(file_a_path, 'r', encoding='utf-8') as file_a, \ + open(file_b_path, 'r', encoding='utf-8') as file_b, \ + open(output_file_path, output_file_mode, encoding='utf-8') as output_file: + i=1 + # Read file A and file B line by line + for line_a, line_b in tqdm(zip(file_a, file_b)): + if resume and i < resume_from: + i+=1 + continue + # Remove trailing newline characters + line_a = line_a.strip() + line_b = line_b.strip() + + embeddings = model.encode([line_a, line_b]) + similarity = cos_sim(embeddings[0], embeddings[1]) + + # Write the similarity to the output file + output_file.write(f"{similarity}\n") + + i+=1 + +print(f"Similarity calculation completed. Results saved to {output_file_path}") \ No newline at end of file diff --git a/translate/analytics/translation2019/check_sim.py b/translate/analytics/translation2019/check_sim.py new file mode 100644 index 0000000..cc2c29c --- /dev/null +++ b/translate/analytics/translation2019/check_sim.py @@ -0,0 +1,74 @@ +from transformers import AutoModel +from numpy.linalg import norm +import sys +import random +import json +from tqdm import tqdm + +# Define the cosine similarity function +cos_sim = lambda a, b: (a @ b.T) / (norm(a) * norm(b)) + +# Load the model and tokenizer +model_name = 'jinaai/jina-embeddings-v2-base-zh' +model = AutoModel.from_pretrained(model_name, trust_remote_code=True) + +# Check if the correct number of command-line arguments are provided +if len(sys.argv) < 4 or len(sys.argv) > 5: + print("Usage: python script.py [num_samples]") + sys.exit(1) + +# Define file paths from command-line arguments +file_path = sys.argv[1] +output_file_path = sys.argv[2] + +# Define the number of samples to randomly select +num_samples = int(sys.argv[3]) if len(sys.argv) == 4 else 100 + +# Get the total number of lines in the files without loading them fully +def count_lines(file_path): + with open(file_path, 'r', encoding='utf-8') as f: + return sum(1 for _ in f) + +total_lines = count_lines(file_path) + +# Select random sample indices without loading entire files +selected_indices = sorted(random.sample(range(total_lines), num_samples)) + +# Function to get all sampled lines from the file +def get_lines(file_path, line_numbers): + result = [] + max_i = max(line_numbers) + j=0 + next_i = line_numbers[j] + len_line_numbers = len(line_numbers) + with open(file_path, 'r', encoding='utf-8') as f: + for current_line, line in tqdm(enumerate(f)): + if current_line < next_i: + continue + result.append(line.strip()) + j+=1 + if current_line >= max_i or j >= len_line_numbers: + return result + next_i = line_numbers[j] + + return result + +lines = get_lines(file_path, selected_indices) + +# Open output file for writing +with open(output_file_path, 'w', encoding='utf-8') as output_file, open("1.txt", 'w', encoding='utf-8') as lf: + for i, idx in tqdm(enumerate(selected_indices)): + # Get the corresponding lines from both files + line = lines[i] + data = json.loads(line) + chn = data["chinese"] + eng = data["english"] + lf.write(str(idx)+'\n') + + embeddings = model.encode([chn, eng]) + similarity = cos_sim(embeddings[0], embeddings[1]) + + # Write the similarity to the output file + output_file.write(f"{similarity}\n") + +print(f"Similarity calculation completed. Results saved to {output_file_path}")