diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2b8e451..ee95f6a 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,9 +2,7 @@ - - - + diff --git a/Augmentation/EDA.py b/Augmentation/EDA.py new file mode 100644 index 0000000..511c841 --- /dev/null +++ b/Augmentation/EDA.py @@ -0,0 +1,191 @@ +import jieba +import synonyms +import random +from random import shuffle + +random.seed(2019) + +# 停用词列表,默认使用哈工大停用词表 +f = open('stopwords/stopwords.txt', encoding='utf-8') +stop_words = list() +for stop_word in f.readlines(): + stop_words.append(stop_word[:-1]) + +# 考虑到与英文的不同,暂时搁置 +# 文本清理 +''' +import re +def get_only_chars(line): + #1.清除所有的数字 +''' + + +######################################################################## +# 同义词替换 +# 替换一个语句中的n个单词为其同义词 +######################################################################## +def synonym_replacement(words, n): + new_words = words.copy() + random_word_list = list(set([word for word in words if word not in stop_words])) + random.shuffle(random_word_list) + num_replaced = 0 + for random_word in random_word_list: + synonyms = get_synonyms(random_word) + if len(synonyms) >= 1: + synonym = random.choice(synonyms) + new_words = [synonym if word == random_word else word for word in new_words] + num_replaced += 1 + if num_replaced >= n: + break + + sentence = ' '.join(new_words) + new_words = sentence.split(' ') + + return new_words + + +def get_synonyms(word): + return synonyms.nearby(word)[0] + + +######################################################################## +# 随机插入 +# 随机在语句中插入n个词 +######################################################################## +def random_insertion(words, n): + new_words = words.copy() + for _ in range(n): + add_word(new_words) + return new_words + + +def add_word(new_words): + synonyms = [] + counter = 0 + while len(synonyms) < 1: + random_word = new_words[random.randint(0, len(new_words) - 1)] + synonyms = get_synonyms(random_word) + counter += 1 + if counter >= 10: + return + random_synonym = random.choice(synonyms) + random_idx = random.randint(0, len(new_words) - 1) + new_words.insert(random_idx, random_synonym) + + +######################################################################## +# Random swap 随机交换 +# Randomly swap two words in the sentence n times +######################################################################## + +def random_swap(words, n): + new_words = words.copy() + for _ in range(n): + new_words = swap_word(new_words) + return new_words + + +def swap_word(new_words): + random_idx_1 = random.randint(0, len(new_words) - 1) + random_idx_2 = random_idx_1 + counter = 0 + while random_idx_2 == random_idx_1: + random_idx_2 = random.randint(0, len(new_words) - 1) + counter += 1 + if counter > 3: + return new_words + new_words[random_idx_1], new_words[random_idx_2] = new_words[random_idx_2], new_words[random_idx_1] + return new_words + + +######################################################################## +# 随机删除 +# 以概率p删除语句中的词 +######################################################################## +def random_deletion(words, p): + if len(words) == 1: + return words + + new_words = [] + for word in words: + r = random.uniform(0, 1) + if r > p: + new_words.append(word) + + if len(new_words) == 0: + rand_int = random.randint(0, len(words) - 1) + return [words[rand_int]] + + return new_words + + +######################################################################## +# EDA函数 +def eda(sentence, alpha_sr=0.1, alpha_ri=0.1, alpha_rs=0.1, p_rd=0.1, num_aug=9): + seg_list = jieba.cut(sentence) + seg_list = " ".join(seg_list) + words = list(seg_list.split()) + num_words = len(words) + + augmented_sentences = [] + num_new_per_technique = int(num_aug / 4) + 1 + n_sr = max(1, int(alpha_sr * num_words)) + n_ri = max(1, int(alpha_ri * num_words)) + n_rs = max(1, int(alpha_rs * num_words)) + + # print(words, "\n") + + # 同义词替换sr + for _ in range(num_new_per_technique): + a_words = synonym_replacement(words, n_sr) + augmented_sentences.append(' '.join(a_words)) + # print("同义词替换===》", ' '.join(a_words)) + + # 随机插入ri + for _ in range(num_new_per_technique): + a_words = random_insertion(words, n_ri) + augmented_sentences.append(' '.join(a_words)) + # print("随机插入===》", ' '.join(a_words)) + + # 随机交换rs + for _ in range(num_new_per_technique): + a_words = random_swap(words, n_rs) + augmented_sentences.append(' '.join(a_words)) + # print("随机交换===》", ' '.join(a_words)) + + # 随机删除rd + for _ in range(num_new_per_technique): + a_words = random_deletion(words, p_rd) + augmented_sentences.append(' '.join(a_words)) + # print("随即删除===》", ' '.join(a_words)) + # print(augmented_sentences) + shuffle(augmented_sentences) + + if num_aug >= 1: + augmented_sentences = augmented_sentences[:num_aug] + else: + keep_prob = num_aug / len(augmented_sentences) + augmented_sentences = [s for s in augmented_sentences if random.uniform(0, 1) < keep_prob] + + augmented_sentences.append(seg_list) + + return augmented_sentences + +## +# 测试用例 +if __name__ == '__main__': + ''' + 我们 就 像 蒲公英 , 我 也 祈祷 着 能 和 你 飞去 同 一片 土地 + 我们 就 像 蒲公英 , 我 也 礼拜 着 能 和 你 飞去 同 一片 土地 + 我们 就 像 蒲公英 , 我 也 祈祷 着 能 和 你 飞去 同 一片 土地 + 我们 就 像 蒲公英 , 我 也 祈祷 着 能 一片 你 飞去 同 和 土地 + 我们 就 像 蒲公英 , 向日葵 我 也 祈祷 着 能 和 你 飞去 同 一片 土地 + 我们 就 像 , 我 也 祈祷 着 能 和 你 飞去 同 一片 + 我们 就 像 蒲公英 , 我 也 祈祷 着 能 和 你 飞去 同 一片 土地 + 我们 就 像 蒲公英 , 我 也 祈祷 着 能 和 你 飞去 同 一片 国有土地 + 我们 蒲公英 就 像 蒲公英 , 我 也 祈祷 着 能 和 你 飞去 同 一片 土地 + 我们 就 像 蒲公英 , 我 也 祈祷 着 能 和 你 飞去 同 一片 土地 + ''' + result = eda(sentence="我们就像蒲公英,我也祈祷着能和你飞去同一片土地") + for i in result: + print(i) \ No newline at end of file diff --git a/Augmentation/__init__.py b/Augmentation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Augmentation/constant.py b/Augmentation/constant.py new file mode 100644 index 0000000..3f94b6b --- /dev/null +++ b/Augmentation/constant.py @@ -0,0 +1,27 @@ +# 语言缩写1,google +language_short_zh = ['zh', 'zh_CN', 'zh_HK', 'zh_TW'] +language_short_first = ['en', 'fr', 'de', 'es', 'be', 'it', 'ja', 'ar', 'nl', 'pt', 'bg', 'el', 'ca', 'iw', 'is', 'sh', 'ko', 'sv', 'sq', 'ru', 'no', 'fi', 'hr', 'ro', 'sr', 'pl', 'lt', 'th', 'mk', 'sk', 'et', 'da', 'hu', 'sl', 'tr', 'uk', 'lv', 'cs'] +language_short_other = ['en', 'en_US', 'ar', 'ar_AE', 'ar_BH', 'ar_DZ', 'ar_EG', 'ar_IQ', 'ar_JO', 'ar_KW', 'ar_LB', 'ar_LY', 'ar_MA', 'ar_OM', 'ar_QA', 'ar_SA', 'ar_SD', 'ar_SY', 'ar_TN', 'ar_YE', 'be', 'be_BY', 'bg', 'bg_BG', 'bo_CN', 'ca', 'ca_ES', 'ca_ES_EURO', 'cs', 'cs_CZ', 'da', 'da_DK', 'de', 'de_AT', 'de_AT_EURO', 'de_CH', 'de_DE', 'de_DE_EURO', 'de_LU', 'de_LU_EURO', 'el', 'el_GR', 'en_AU', 'en_CA', 'en_GB', 'en_IE', 'en_IE_EURO', 'en_NZ', 'en_ZA', 'es', 'es_BO', 'es_AR', 'es_CL', 'es_CO', 'es_CR', 'es_DO', 'es_EC', 'es_ES', 'es_ES_EURO', 'es_GT', 'es_HN', 'es_MX', 'es_NI', 'et', 'es_PA', 'es_PE', 'es_PR', 'es_PY', 'es_SV', 'es_UY', 'es_VE', 'et_EE', 'fi', 'fi_FI', 'fi_FI_EURO', 'fr', 'fr_BE', 'fr_BE_EURO', 'fr_CA', 'fr_CH', 'fr_FR', 'fr_FR_EURO', 'fr_LU', 'fr_LU_EURO', 'hr', 'hr_HR', 'hu', 'hu_HU', 'is', 'is_IS', 'it', 'it_CH', 'it_IT', 'it_IT_EURO', 'iw', 'iw_IL', 'ja', 'ja_JP', 'ko', 'ko_KR', 'lt', 'lt_LT', 'lv', 'lv_LV', 'mk', 'mk_MK', 'nl', 'nl_BE', 'nl_BE_EURO', 'nl_NL', 'nl_NL_EURO', 'no', 'no_NO', 'no_NO_NY', 'pl', 'pl_PL', 'pt', 'pt_BR', 'pt_PT', 'pt_PT_EURO', 'ro', 'ro_RO', 'ru', 'ru_RU', 'sh', 'sh_YU', 'sk', 'sk_SK', 'sl', 'sl_SI', 'sq', 'sq_AL', 'sr', 'sr_YU', 'sv', 'sv_SE', 'th', 'th_TH', 'tr', 'tr_TR', 'uk', 'uk_UA'] + + +# 语言缩写,国内在线翻译 +language_short_google = ['en', 'fr', 'ru', 'de', 'es', 'pt', 'ar', 'ja', 'ko', 'it', 'be', 'nl', 'bg', 'el', 'ca', 'iw', 'is', 'sh', 'sv', 'sq', 'no', 'fi', 'hr', 'ro', 'pl', 'lt', 'th', 'mk', 'sk', 'et', 'da', 'hu', 'sl', 'tr', 'uk', 'lv', 'cs', 'sr'] +language_short_baidu = ['en', 'fra', 'ru', 'de', 'est', 'pt', 'ara', 'jp', 'kor', 'vie', 'yue', 'wyw', 'spa', 'th', 'it', 'el', 'nl', 'pl', 'bul', 'dan', 'fin', 'cs', 'rom', 'slo', 'swe', 'hu', 'cht'] +language_short_youdao = ['en', 'fr', 'ru', 'de', 'es', 'pt', 'ar', 'ja', 'ko', 'vi', 'id'] +language_short_sougou = ['en', 'fr', 'ru', 'de', 'es', 'pt', 'ar', 'ja', 'ko', 'vi', 'id', 'it', 'et', 'bg', 'pl', 'bs-Latn', 'fa', 'mww', 'da', 'fi', 'tlh-Qaak', 'tlh', 'hr', 'otq', 'ca', 'cs', 'ro', 'lv', 'ht', 'lt', 'nl', 'ms', 'mt', 'sl', 'th', 'tr', 'sk', 'sw', 'af', 'no', 'uk', 'ur', 'el', 'hu', 'cy', 'yua', 'he', 'hi', 'sv', 'yue', 'fj', 'fil', 'sm', 'to', 'ty', 'mg', 'bn', 'sr-Latn', 'sr-Cyrl'] +language_short_tencent = ['en', 'fr', 'ru', 'de', 'es', 'pt', 'jp', 'ko', 'vi', 'id', 'it', 'kr', 'tr', 'ms', 'th'] + + +# 在线翻译账户密码,自己去注册吧 +app_key_google = "" +app_secret_google = "" +app_key_bing = "" +app_secret_bing = "" +app_key_baidu = "" +app_secret_baidu = "" +app_key_youdao = "" +app_secret_youdao = "" +app_key_sougou = "" +app_secret_sougou = "" +app_key_tencent = "" +app_secret_tentcnet = "" \ No newline at end of file diff --git a/Augmentation/stopwords/stopwords.txt b/Augmentation/stopwords/stopwords.txt new file mode 100644 index 0000000..068b697 --- /dev/null +++ b/Augmentation/stopwords/stopwords.txt @@ -0,0 +1,1850 @@ +> +? +@ +A +Lex +[ +\ +] +^ +_ +` +exp +sub +sup +| +} +~ +~~~~ +· +× +××× +Δ +Ψ +γ +μ +φ +φ. +В +— +—— +——— +‘ +’ +’‘ +“ +” +”, +… +…… +…………………………………………………③ +′∈ +′| +℃ +Ⅲ +↑ +→ +∈〔 +∪φ∈ +≈ +① +② +②c +③ +③〕 +④ +⑤ +⑥ +⑦ +⑧ +⑨ +⑩ +—— +■ +▲ +  +、 +。 +〈 +〉 +《 +》 +》), +」 +『 +』 +【 +】 +〔 +〕 +〕〔 +八 +一 +一. +一一 +一下 +一个 +一些 +一何 +一切 +一则 +一则通过 +一天 +一定 +一方面 +一旦 +一时 +一来 +一样 +一次 +一片 +一番 +一直 +一致 +一般 +一起 +一转眼 +一边 +一面 +七 +万一 +三 +三天两头 +三番两次 +三番五次 +上 +上下 +上升 +上去 +上来 +上述 +上面 +下 +下列 +下去 +下来 +下面 +不 +不一 +不下 +不久 +不了 +不亦乐乎 +不仅 +不仅…而且 +不仅仅 +不仅仅是 +不会 +不但 +不但…而且 +不光 +不免 +不再 +不力 +不单 +不变 +不只 +不可 +不可开交 +不可抗拒 +不同 +不外 +不外乎 +不够 +不大 +不如 +不妨 +不定 +不对 +不少 +不尽 +不尽然 +不巧 +不已 +不常 +不得 +不得不 +不得了 +不得已 +不必 +不怎么 +不怕 +不惟 +不成 +不拘 +不择手段 +不敢 +不料 +不断 +不日 +不时 +不是 +不曾 +不止 +不止一次 +不比 +不消 +不满 +不然 +不然的话 +不特 +不独 +不由得 +不知不觉 +不管 +不管怎样 +不经意 +不胜 +不能 +不能不 +不至于 +不若 +不要 +不论 +不起 +不足 +不过 +不迭 +不问 +不限 +与 +与其 +与其说 +与否 +与此同时 +专门 +且 +且不说 +且说 +两者 +严格 +严重 +个 +个人 +个别 +中小 +中间 +丰富 +串行 +临 +临到 +为 +为主 +为了 +为什么 +为什麽 +为何 +为止 +为此 +为着 +主张 +主要 +举凡 +举行 +乃 +乃至 +乃至于 +么 +之 +之一 +之前 +之后 +之后 +之所以 +之类 +乌乎 +乎 +乒 +乘 +乘势 +乘机 +乘胜 +乘虚 +乘隙 +九 +也 +也好 +也就是说 +也是 +也罢 +了 +了解 +争取 +二 +二来 +二话不说 +二话没说 +于 +于是 +于是乎 +云云 +云尔 +互 +互相 +五 +些 +交口 +亦 +产生 +亲口 +亲手 +亲眼 +亲自 +亲身 +人 +人人 +人们 +人家 +人民 +什么 +什么样 +什麽 +仅 +仅仅 +今 +今后 +今天 +今年 +今后 +介于 +仍 +仍旧 +仍然 +从 +从不 +从严 +从中 +从事 +从今以后 +从优 +从古到今 +从古至今 +从头 +从宽 +从小 +从新 +从无到有 +从早到晚 +从未 +从来 +从此 +从此以后 +从而 +从轻 +从速 +从重 +他 +他人 +他们 +他是 +他的 +代替 +以 +以上 +以下 +以为 +以便 +以免 +以前 +以及 +以后 +以外 +以后 +以故 +以期 +以来 +以至 +以至于 +以致 +们 +任 +任何 +任凭 +任务 +企图 +伙同 +会 +伟大 +传 +传说 +传闻 +似乎 +似的 +但 +但凡 +但愿 +但是 +何 +何乐而不为 +何以 +何况 +何处 +何妨 +何尝 +何必 +何时 +何止 +何苦 +何须 +余外 +作为 +你 +你们 +你是 +你的 +使 +使得 +使用 +例如 +依 +依据 +依照 +依靠 +便 +便于 +促进 +保持 +保管 +保险 +俺 +俺们 +倍加 +倍感 +倒不如 +倒不如说 +倒是 +倘 +倘使 +倘或 +倘然 +倘若 +借 +借以 +借此 +假使 +假如 +假若 +偏偏 +做到 +偶尔 +偶而 +傥然 +像 +儿 +允许 +元/吨 +充其极 +充其量 +充分 +先不先 +先后 +先后 +先生 +光 +光是 +全体 +全力 +全年 +全然 +全身心 +全部 +全都 +全面 +八 +八成 +公然 +六 +兮 +共 +共同 +共总 +关于 +其 +其一 +其中 +其二 +其他 +其余 +其后 +其它 +其实 +其次 +具体 +具体地说 +具体来说 +具体说来 +具有 +兼之 +内 +再 +再其次 +再则 +再有 +再次 +再者 +再者说 +再说 +冒 +冲 +决不 +决定 +决非 +况且 +准备 +凑巧 +凝神 +几 +几乎 +几度 +几时 +几番 +几经 +凡 +凡是 +凭 +凭借 +出 +出于 +出去 +出来 +出现 +分别 +分头 +分期 +分期分批 +切 +切不可 +切切 +切勿 +切莫 +则 +则甚 +刚 +刚好 +刚巧 +刚才 +初 +别 +别人 +别处 +别是 +别的 +别管 +别说 +到 +到了儿 +到处 +到头 +到头来 +到底 +到目前为止 +前后 +前此 +前者 +前进 +前面 +加上 +加之 +加以 +加入 +加强 +动不动 +动辄 +勃然 +匆匆 +十分 +千 +千万 +千万千万 +半 +单 +单单 +单纯 +即 +即令 +即使 +即便 +即刻 +即如 +即将 +即或 +即是说 +即若 +却 +却不 +历 +原来 +去 +又 +又及 +及 +及其 +及时 +及至 +双方 +反之 +反之亦然 +反之则 +反倒 +反倒是 +反应 +反手 +反映 +反而 +反过来 +反过来说 +取得 +取道 +受到 +变成 +古来 +另 +另一个 +另一方面 +另外 +另悉 +另方面 +另行 +只 +只当 +只怕 +只是 +只有 +只消 +只要 +只限 +叫 +叫做 +召开 +叮咚 +叮当 +可 +可以 +可好 +可是 +可能 +可见 +各 +各个 +各人 +各位 +各地 +各式 +各种 +各级 +各自 +合理 +同 +同一 +同时 +同样 +后 +后来 +后者 +后面 +向 +向使 +向着 +吓 +吗 +否则 +吧 +吧哒 +吱 +呀 +呃 +呆呆地 +呐 +呕 +呗 +呜 +呜呼 +呢 +周围 +呵 +呵呵 +呸 +呼哧 +呼啦 +咋 +和 +咚 +咦 +咧 +咱 +咱们 +咳 +哇 +哈 +哈哈 +哉 +哎 +哎呀 +哎哟 +哗 +哗啦 +哟 +哦 +哩 +哪 +哪个 +哪些 +哪儿 +哪天 +哪年 +哪怕 +哪样 +哪边 +哪里 +哼 +哼唷 +唉 +唯有 +啊 +啊呀 +啊哈 +啊哟 +啐 +啥 +啦 +啪达 +啷当 +喀 +喂 +喏 +喔唷 +喽 +嗡 +嗡嗡 +嗬 +嗯 +嗳 +嘎 +嘎嘎 +嘎登 +嘘 +嘛 +嘻 +嘿 +嘿嘿 +四 +因 +因为 +因了 +因此 +因着 +因而 +固 +固然 +在 +在下 +在于 +地 +均 +坚决 +坚持 +基于 +基本 +基本上 +处在 +处处 +处理 +复杂 +多 +多么 +多亏 +多多 +多多少少 +多多益善 +多少 +多年前 +多年来 +多数 +多次 +够瞧的 +大 +大不了 +大举 +大事 +大体 +大体上 +大凡 +大力 +大多 +大多数 +大大 +大家 +大张旗鼓 +大批 +大抵 +大概 +大略 +大约 +大致 +大都 +大量 +大面儿上 +失去 +奇 +奈 +奋勇 +她 +她们 +她是 +她的 +好 +好在 +好的 +好象 +如 +如上 +如上所述 +如下 +如今 +如何 +如其 +如前所述 +如同 +如常 +如是 +如期 +如果 +如次 +如此 +如此等等 +如若 +始而 +姑且 +存在 +存心 +孰料 +孰知 +宁 +宁可 +宁愿 +宁肯 +它 +它们 +它们的 +它是 +它的 +安全 +完全 +完成 +定 +实现 +实际 +宣布 +容易 +密切 +对 +对于 +对应 +对待 +对方 +对比 +将 +将才 +将要 +将近 +小 +少数 +尔 +尔后 +尔尔 +尔等 +尚且 +尤其 +就 +就地 +就是 +就是了 +就是说 +就此 +就算 +就要 +尽 +尽可能 +尽如人意 +尽心尽力 +尽心竭力 +尽快 +尽早 +尽然 +尽管 +尽管如此 +尽量 +局外 +居然 +届时 +属于 +屡 +屡屡 +屡次 +屡次三番 +岂 +岂但 +岂止 +岂非 +川流不息 +左右 +巨大 +巩固 +差一点 +差不多 +己 +已 +已矣 +已经 +巴 +巴巴 +带 +帮助 +常 +常常 +常言说 +常言说得好 +常言道 +平素 +年复一年 +并 +并不 +并不是 +并且 +并排 +并无 +并没 +并没有 +并肩 +并非 +广大 +广泛 +应当 +应用 +应该 +庶乎 +庶几 +开外 +开始 +开展 +引起 +弗 +弹指之间 +强烈 +强调 +归 +归根到底 +归根结底 +归齐 +当 +当下 +当中 +当儿 +当前 +当即 +当口儿 +当地 +当场 +当头 +当庭 +当时 +当然 +当真 +当着 +形成 +彻夜 +彻底 +彼 +彼时 +彼此 +往 +往往 +待 +待到 +很 +很多 +很少 +后来 +后面 +得 +得了 +得出 +得到 +得天独厚 +得起 +心里 +必 +必定 +必将 +必然 +必要 +必须 +快 +快要 +忽地 +忽然 +怎 +怎么 +怎么办 +怎么样 +怎奈 +怎样 +怎麽 +怕 +急匆匆 +怪 +怪不得 +总之 +总是 +总的来看 +总的来说 +总的说来 +总结 +总而言之 +恍然 +恐怕 +恰似 +恰好 +恰如 +恰巧 +恰恰 +恰恰相反 +恰逢 +您 +您们 +您是 +惟其 +惯常 +意思 +愤然 +愿意 +慢说 +成为 +成年 +成年累月 +成心 +我 +我们 +我是 +我的 +或 +或则 +或多或少 +或是 +或曰 +或者 +或许 +战斗 +截然 +截至 +所 +所以 +所在 +所幸 +所有 +所谓 +才 +才能 +扑通 +打 +打从 +打开天窗说亮话 +扩大 +把 +抑或 +抽冷子 +拦腰 +拿 +按 +按时 +按期 +按照 +按理 +按说 +挨个 +挨家挨户 +挨次 +挨着 +挨门挨户 +挨门逐户 +换句话说 +换言之 +据 +据实 +据悉 +据我所知 +据此 +据称 +据说 +掌握 +接下来 +接着 +接著 +接连不断 +放量 +故 +故意 +故此 +故而 +敞开儿 +敢 +敢于 +敢情 +数/ +整个 +断然 +方 +方便 +方才 +方能 +方面 +旁人 +无 +无宁 +无法 +无论 +既 +既…又 +既往 +既是 +既然 +日复一日 +日渐 +日益 +日臻 +日见 +时候 +昂然 +明显 +明确 +是 +是不是 +是以 +是否 +是的 +显然 +显著 +普通 +普遍 +暗中 +暗地里 +暗自 +更 +更为 +更加 +更进一步 +曾 +曾经 +替 +替代 +最 +最后 +最大 +最好 +最后 +最近 +最高 +有 +有些 +有关 +有利 +有力 +有及 +有所 +有效 +有时 +有点 +有的 +有的是 +有着 +有著 +望 +朝 +朝着 +末##末 +本 +本人 +本地 +本着 +本身 +权时 +来 +来不及 +来得及 +来看 +来着 +来自 +来讲 +来说 +极 +极为 +极了 +极其 +极力 +极大 +极度 +极端 +构成 +果然 +果真 +某 +某个 +某些 +某某 +根据 +根本 +格外 +梆 +概 +次第 +欢迎 +欤 +正值 +正在 +正如 +正巧 +正常 +正是 +此 +此中 +此后 +此地 +此处 +此外 +此时 +此次 +此间 +殆 +毋宁 +每 +每个 +每天 +每年 +每当 +每时每刻 +每每 +每逢 +比 +比及 +比如 +比如说 +比方 +比照 +比起 +比较 +毕竟 +毫不 +毫无 +毫无例外 +毫无保留地 +汝 +沙沙 +没 +没奈何 +没有 +沿 +沿着 +注意 +活 +深入 +清楚 +满 +满足 +漫说 +焉 +然 +然则 +然后 +然后 +然而 +照 +照着 +牢牢 +特别是 +特殊 +特点 +犹且 +犹自 +独 +独自 +猛然 +猛然间 +率尔 +率然 +现代 +现在 +理应 +理当 +理该 +瑟瑟 +甚且 +甚么 +甚或 +甚而 +甚至 +甚至于 +用 +用来 +甫 +甭 +由 +由于 +由是 +由此 +由此可见 +略 +略为 +略加 +略微 +白 +白白 +的 +的确 +的话 +皆可 +目前 +直到 +直接 +相似 +相信 +相反 +相同 +相对 +相对而言 +相应 +相当 +相等 +省得 +看 +看上去 +看出 +看到 +看来 +看样子 +看看 +看见 +看起来 +真是 +真正 +眨眼 +着 +着呢 +矣 +矣乎 +矣哉 +知道 +砰 +确定 +碰巧 +社会主义 +离 +种 +积极 +移动 +究竟 +穷年累月 +突出 +突然 +窃 +立 +立刻 +立即 +立地 +立时 +立马 +竟 +竟然 +竟而 +第 +第二 +等 +等到 +等等 +策略地 +简直 +简而言之 +简言之 +管 +类如 +粗 +精光 +紧接着 +累年 +累次 +纯 +纯粹 +纵 +纵令 +纵使 +纵然 +练习 +组成 +经 +经常 +经过 +结合 +结果 +给 +绝 +绝不 +绝对 +绝非 +绝顶 +继之 +继后 +继续 +继而 +维持 +综上所述 +缕缕 +罢了 +老 +老大 +老是 +老老实实 +考虑 +者 +而 +而且 +而况 +而又 +而后 +而外 +而已 +而是 +而言 +而论 +联系 +联袂 +背地里 +背靠背 +能 +能否 +能够 +腾 +自 +自个儿 +自从 +自各儿 +自后 +自家 +自己 +自打 +自身 +臭 +至 +至于 +至今 +至若 +致 +般的 +良好 +若 +若夫 +若是 +若果 +若非 +范围 +莫 +莫不 +莫不然 +莫如 +莫若 +莫非 +获得 +藉以 +虽 +虽则 +虽然 +虽说 +蛮 +行为 +行动 +表明 +表示 +被 +要 +要不 +要不是 +要不然 +要么 +要是 +要求 +见 +规定 +觉得 +譬喻 +譬如 +认为 +认真 +认识 +让 +许多 +论 +论说 +设使 +设或 +设若 +诚如 +诚然 +话说 +该 +该当 +说明 +说来 +说说 +请勿 +诸 +诸位 +诸如 +谁 +谁人 +谁料 +谁知 +谨 +豁然 +贼死 +赖以 +赶 +赶快 +赶早不赶晚 +起 +起先 +起初 +起头 +起来 +起见 +起首 +趁 +趁便 +趁势 +趁早 +趁机 +趁热 +趁着 +越是 +距 +跟 +路经 +转动 +转变 +转贴 +轰然 +较 +较为 +较之 +较比 +边 +达到 +达旦 +迄 +迅速 +过 +过于 +过去 +过来 +运用 +近 +近几年来 +近年来 +近来 +还 +还是 +还有 +还要 +这 +这一来 +这个 +这么 +这么些 +这么样 +这么点儿 +这些 +这会儿 +这儿 +这就是说 +这时 +这样 +这次 +这点 +这种 +这般 +这边 +这里 +这麽 +进入 +进去 +进来 +进步 +进而 +进行 +连 +连同 +连声 +连日 +连日来 +连袂 +连连 +迟早 +迫于 +适应 +适当 +适用 +逐步 +逐渐 +通常 +通过 +造成 +逢 +遇到 +遭到 +遵循 +遵照 +避免 +那 +那个 +那么 +那么些 +那么样 +那些 +那会儿 +那儿 +那时 +那末 +那样 +那般 +那边 +那里 +那麽 +部分 +都 +鄙人 +采取 +里面 +重大 +重新 +重要 +鉴于 +针对 +长期以来 +长此下去 +长线 +长话短说 +问题 +间或 +防止 +阿 +附近 +陈年 +限制 +陡然 +除 +除了 +除却 +除去 +除外 +除开 +除此 +除此之外 +除此以外 +除此而外 +除非 +随 +随后 +随时 +随着 +随著 +隔夜 +隔日 +难得 +难怪 +难说 +难道 +难道说 +集中 +零 +需要 +非但 +非常 +非徒 +非得 +非特 +非独 +靠 +顶多 +顷 +顷刻 +顷刻之间 +顷刻间 +顺 +顺着 +顿时 +颇 +风雨无阻 +饱 +首先 +马上 +高低 +高兴 +默然 +默默地 +齐 +^ +! +# +$ +% +& +’ +( +) +)÷(1- +)、 +* ++ ++ξ +++ +, +,也 +- +-β +-- +-〔*〕- +. +/ +0 +0:2 +1 +1. +12% +2 +2.3% +3 +4 +5 +5:0 +6 +7 +8 +9 +: +; +< +<± +<Δ +<λ +<φ +<< += +=〃 +=☆ +=( +=- +=〔 +={ +> +>λ +? +@ +A +LI +R.L. +ZXFITL +〔 +〔①①〕 +〔①②〕 +〔①③〕 +〔①④〕 +〔①⑤〕 +〔①⑥〕 +〔①⑦〕 +〔①⑧〕 +〔①⑨〕 +〔①A〕 +〔①B〕 +〔①C〕 +〔①D〕 +〔①E〕 +〔①〕 +〔①a〕 +〔①c〕 +〔①d〕 +〔①e〕 +〔①f〕 +〔①g〕 +〔①h〕 +〔①i〕 +〔①o〕 +〔② +〔②①〕 +〔②②〕 +〔②③〕 +〔②④ +〔②⑤〕 +〔②⑥〕 +〔②⑦〕 +〔②⑧〕 +〔②⑩〕 +〔②B〕 +〔②G〕 +〔②〕 +〔②a〕 +〔②b〕 +〔②c〕 +〔②d〕 +〔②e〕 +〔②f〕 +〔②g〕 +〔②h〕 +〔②i〕 +〔②j〕 +〔③①〕 +〔③⑩〕 +〔③F〕 +〔③〕 +〔③a〕 +〔③b〕 +〔③c〕 +〔③d〕 +〔③e〕 +〔③g〕 +〔③h〕 +〔④〕 +〔④a〕 +〔④b〕 +〔④c〕 +〔④d〕 +〔④e〕 +〔⑤〕 +〔⑤〕〕 +〔⑤a〕 +〔⑤b〕 +〔⑤d〕 +〔⑤e〕 +〔⑤f〕 +〔⑥〕 +〔⑦〕 +〔⑧〕 +〔⑨〕 +〔⑩〕 +〔*〕 +〔- +〔〕 +〕 +〕∧′=〔 +_ +a〕 +b〕 +c〕 +e〕 +f〕 +ng昉 +{ +{- +| +} +}> +~ +~± +~+ +¥ \ No newline at end of file diff --git a/Augmentation/tools.py b/Augmentation/tools.py new file mode 100644 index 0000000..acabd0b --- /dev/null +++ b/Augmentation/tools.py @@ -0,0 +1,266 @@ +from openpyxl import Workbook +import logging as logger +import gensim +import jieba +import time +import xlrd +import re + + +#中英文标点符号 +filters='[!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n' + '!,;:。?、“”’‘《》()~@#¥%……&*\()/{}【】…=-]' +#标点符号、空格 +filters_1 = "[\.\!\/_,?;:$%^*<>()+\"\']+|[!,;:。?、“”’‘《》()~@#¥%……&*\(\)\/\-]+" + +"""去除标点符号、空格""" +def clear_punctuation(text): + """去除标点符号""" + sentence = text.replace(' ', '') + sentence_punctuation_clear = re.sub(filters, ' ', sentence).strip() + sentence_punctuation_clear_replace = sentence_punctuation_clear.replace(' ', ' ').replace(' ', ' ') + return sentence_punctuation_clear_replace + + +'''截取中文、拼音、数字,去除特殊字符等''' +def getChinese1(ques): + # ques = '•“鑫菁英”教育分期手续费怎么收取?可以' + findAllChinese = ''.join(re.findall(u"([\u4e00-\u9fa50-9A-Za-z])", ques)) + # print(sub_str) + return findAllChinese + + +'''xlrd读xls''' +def xlsRead(sheetName=None, cols=0, fileXlsPath=None): + '''读xls文件''' + workbook = xlrd.open_workbook(fileXlsPath) + # 根据sheet索引或者名称获取sheet内容 + sheet = workbook.sheet_by_name(sheetName) + nrows = sheet.nrows + ncols = sheet.ncols + + listRows = [] + for i in range(nrows): + listRows.append(sheet.row_values(i)) + + return listRows + + +'''openpyxl写xlsx''' +def xlsxWrite(sheetName, writeList, fileXlsName): + wb = Workbook() + print('{}'.format(wb.get_sheet_names())) # 提供一个默认名叫Sheet的表,office2016下新建提供默认Sheet1 + sheet = wb.create_sheet(sheetName) + # i = 0 + for listLine_one in writeList: + # i += 1 + sheet.append(listLine_one) + # if i == 1000: + # break + wb.save(fileXlsName) + + + +"""判断一个unicode是否是英文字母""" +def is_alphabet(uchar): + """判断一个unicode是否是英文字母""" + if (uchar >= u'\u0041' and uchar <= u'\u005a') or (uchar >= u'\u0061' and uchar <= u'\u007a'): + return True + else: + return False + +'''读取txt文件''' +def txtRead(filePath, encodeType = 'utf-8'): + listLine = [] + try: + file = open(filePath, 'r', encoding= encodeType) + + while True: + line = file.readline() + if not line: + break + + listLine.append(line) + + file.close() + + except Exception as e: + logger.info(str(e)) + + finally: + return listLine + +'''读取txt文件''' +def txtWrite(listLine, filePath, type = 'w',encodeType='utf-8'): + + try: + file = open(filePath, type, encoding=encodeType) + file.writelines(listLine) + file.close() + + except Exception as e: + logger.info(str(e)) + +'''截取中文、拼音、数字,去除特殊字符等''' +'''要保留特殊字符的格式,最好的方法是每个字符都去匹配''' + +def getChinese(ques): + # ques = '•“鑫菁英”教育分期手续费怎么收取?可以' + ques = strQ2B(ques) + answer = '' + for ques_one in ques: + ques_one_findall = ''.join(re.findall(u"([\u4e00-\u9fa50-9A-Za-z峣㒶㒰玘宸諕鄕缓緩𪥵嬆嬲煙草砼赟贇龘㗊㵘㙓敠])", ques_one)) + if not ques_one_findall: + ques_one_findall = ' ' + answer = answer + ques_one_findall + answer = answer.strip().replace(' ', ' ').replace(' ', ' ') + return answer.upper() + +'''去除标点符号''' + +def get_syboml(ques): + # ques = '•“鑫菁英”教育分期手续费怎么收取?可以' + ques = strQ2B(ques) + # answer = re.sub(u'([。.,,、\;;::??!!“”"‘’'''()()…——-《》<>{}_~【】\\[])', ' ', ques).replace(' ', ' ').replace(' ', ' ') + answer = re.sub("[\.\!\/_,?;:$%^*<>()+\"\']+|[!,;:。?、“”’‘《》[\](|){}【】~@#¥%…&*\/\-—_]+", " ", ques).strip() + return answer + + +# -*- coding: cp936 -*- +def strQ2B(ustring): + """全角转半角""" + rstring = "" + for uchar in ustring: + inside_code = ord(uchar) + if inside_code == 12288: # 全角空格直接转换 + inside_code = 32 + elif (inside_code >= 65281 and inside_code <= 65374): # 全角字符(除空格)根据关系转化 + inside_code -= 65248 + + rstring += chr(inside_code) + return rstring + +def strB2Q(ustring): + """半角转全角""" + rstring = "" + for uchar in ustring: + inside_code = ord(uchar) + if inside_code == 32: # 半角空格直接转化 + inside_code = 12288 + elif inside_code >= 32 and inside_code <= 126: # 半角字符(除空格)根据关系转化 + inside_code += 65248 + + rstring += chr(inside_code) + return rstring + +def is_valid_date(strdate): + '''判断是否是一个有效的日期字符串''' + try: + if ":" in strdate: + time.strptime(strdate, "%Y-%m-%d %H:%M:%S") + else: + time.strptime(strdate, "%Y-%m-%d") + return True + except: + return False + +'''判断是否是全英文的''' + +def is_total_english(text): + """判断一个是否是全英文字母""" + symbol = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + try: + sentence_punctuation_clear = get_syboml(text) + sentence_punctuation_clear = sentence_punctuation_clear.replace(' ', '').strip() + numben = 0 + for one in sentence_punctuation_clear: + if one in symbol: + numben += 1 + if numben == len(sentence_punctuation_clear): + return True + else: + return False + except: + return False + +'''判断是否是数字的''' + +def is_total_number(text): + """判断一个是否是全英文字母""" + try: + sentence_punctuation_clear = get_syboml(text) + sentence_punctuation_clear = sentence_punctuation_clear.replace(' ', '').strip() + numben = 0 + for one in sentence_punctuation_clear: + if one.isdigit(): + numben += 1 + if numben == len(sentence_punctuation_clear): + return True + else: + return False + except: + return False + +def is_number_or_english(text): + '''不为数字不为字母''' + judge = False + try: + sentence_punctuation_clear = get_syboml(text) + sentence_punctuation_clear = sentence_punctuation_clear.replace(' ', '').strip() + for words in sentence_punctuation_clear: + judge_number = is_total_number(words) + judge_english = is_total_english(words) + judge = judge_number or judge_english + if not judge: + return False + return judge + except: + return False + +def jieba_cut(text): + """ + Jieba cut + :param text: input sentence + :return: list + """ + return list(jieba.cut(text, cut_all=False, HMM=True)) + + +def judge_translate_english(sen_org, sen_tra): + """ + 判断翻译后句子带英文的情况 + :param sen_org: str, 原始句子 + :param sen_tra: str, 翻译后的句子 + :return: boolean, True or False + """ + # sen_org_cut = jieba_cut(sen_org) + sen_tra_cut = jieba_cut(sen_tra) + for sen_tra_cut_one in sen_tra_cut: + if is_total_english(sen_tra_cut_one) and sen_tra_cut_one not in sen_org: + return False + return True + + +def load_word2vec_model(model_path, binary_type=True, encoding_type = 'utf-8', limit_words=None): + ''' + 下载词向量 + :param model_path: str + :return: word2vec model + ''' + word2vec_model = gensim.models.KeyedVectors.load_word2vec_format(model_path, binary=binary_type, limit=limit_words, encoding=encoding_type, unicode_errors='ignore') + return word2vec_model + + +def text_preprocess(text): + if text.strip(): + text_simple_q2b = strQ2B(text) + text_simple_q2b_only = getChinese1(text_simple_q2b) + return text_simple_q2b_only.lower() + else: + return text + + +#todo #句子改写,同义词替换,去停用词等 + + +if __name__ == '__main__': + gg = 0 \ No newline at end of file diff --git a/Augmentation/translate_baidu.py b/Augmentation/translate_baidu.py new file mode 100644 index 0000000..0c75c62 --- /dev/null +++ b/Augmentation/translate_baidu.py @@ -0,0 +1,79 @@ +import hashlib +import urllib +import json +from translate import Translator +import random + + + +class convertText(object): + def __init__(self, fromLangByBaidu, toLangByBaidu, fromLangByMicrosoft, toLangByMicrosoft): + self.appid = '' # 填写你的appid + self.secretKey = '' # 填写你的密钥 + self.url_baidu_api = 'http://api.fanyi.baidu.com/api/trans/vip/translate' # 百度通用api接口 + self.fromLang = fromLangByBaidu + self.toLang = toLangByBaidu + self.fromLangByMicrosoft = fromLangByMicrosoft + self.toLangByMicrosoft = toLangByMicrosoft + # self.stop_words = self.load_stop_word(os.path.join(sys.path[0], 'stop_words.txt')) + + def _translateFromBaidu(self, text, fromLang, toLang): + salt = random.randint(32768, 65536) # 随机数 + sign = self.appid + text + str(salt) + self.secretKey # 签名 appid+text+salt+密钥 + sign = hashlib.md5(sign.encode()).hexdigest() # sign 的MD5值 + + url_baidu = self.url_baidu_api + '?appid=' + self.appid + '&q=' + urllib.parse.quote( + text) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(salt) + '&sign=' + sign + # 进程挂起时间1s + # time.sleep(1) + + try: + response = urllib.request.urlopen(url_baidu, timeout=30) + content = response.read().decode("utf-8") + data = json.loads(content) + + if 'error_code' in data: + print('错误代码:{0}, {1}'.format(data['error_code'], data['error_msg'])) + return 'error' + else: + return str(data['trans_result'][0]['dst']) + except urllib.error.URLError as error: + print(error) + return 'error' + except urllib.error.HTTPError as error: + print(error) + return 'error' + + + # 使用百度翻译API进行回译 chinese->english->chinese + def convertFromBaidu(self, text): + translation1 = self._translateFromBaidu(text, self.fromLang, self.toLang) + if translation1 == 'error': + return 'error' + translation2 = self._translateFromBaidu(translation1, self.toLang, self.fromLang) + if translation2 == 'error': + return 'error' + if translation2 != text: + return translation2 + + return 'same' + + # 使用微软翻译API进行回译 chinese->english->chinese + def convertFromMicrosoft(self, text): + translator1 = Translator(from_lang=self.fromLangByMicrosoft, to_lang=self.toLangByMicrosoft) + translation1 = translator1.translate(text) + + translator2 = Translator(from_lang=self.toLangByMicrosoft, to_lang=self.fromLangByMicrosoft) + translation2 = translator2.translate(translation1) + + if translation2 != text: + return translation2 + + return 'same' + +if __name__ == '__main__': + text = '电影评价,窗前明月光,我很喜十八你欢这部电影!你和啊哈哈呢,我的宝贝?' + conText = convertText(fromLangByBaidu='zh',toLangByBaidu='en',fromLangByMicrosoft='chinese',toLangByMicrosoft='english') + # + print(conText.convertFromBaidu(text)) + # print(conText.convertFromMicrosoft()) \ No newline at end of file diff --git a/Augmentation/translate_tencent.py b/Augmentation/translate_tencent.py new file mode 100644 index 0000000..498c76d --- /dev/null +++ b/Augmentation/translate_tencent.py @@ -0,0 +1,102 @@ +from urllib.parse import quote +import logging as logger +import requests +import hashlib +import random +import string +import time +import json + +language_short_tencent = ['en', 'fr', 'ru', 'de', 'es', 'pt', 'jp', 'ko', 'vi', 'id', 'it', 'kr', 'tr', 'ms', 'th'] +app_secret_tentcnet = '' +app_key_tencent = '' + +def md5_sign(text): + """ + 生成md5 + :param src: str, sentence + :return: str, upper of string + """ + md5_model = hashlib.md5(text.encode("utf8")) + return md5_model.hexdigest().upper() + + +def get_params(text, from_l="zh", to_l="en"): + """ + 生成sign和params + :param text: str, input sentence + :param from_: source language + :param to_: target language + :return: dict, params + """ + # 请求时间戳(秒级),用于防止请求重放(保证签名5分钟有效) + time_stamp = str(int(time.time())) + # 请求随机字符串,用于保证签名不可预测 + nonce_str = ''.join(random.sample(string.ascii_letters + string.digits, 10)) + params = {'app_id': app_key_tencent, + 'source': from_l, + 'target': to_l, + 'text': text, + 'time_stamp': time_stamp, + 'nonce_str': nonce_str + } + signs = '' + # 要对key排序再拼接 + for key in sorted(params): + # 键值拼接过程value部分需要URL编码,URL编码算法用大写字母,例如%E8。quote默认大写。 + signs += '{}={}&'.format(key, quote(params[key], safe='').replace("%20", "+")) + # 将应用密钥以app_key为键名,拼接到字符串sign_before末尾 + signs += 'app_key={}'.format(app_secret_tentcnet) + # 对字符串sign_before进行MD5运算,得到接口请求签名 + sign = md5_sign(signs) + params['sign'] = sign + print(params) + return params + + +def any_to_any_translate_tencent(text, from_='zh', to_='en'): + """ + 调用搜狗翻译,从任意一种语言到另外一种语言,详情见常量LANGUAGE_SHORT_BAIDU + :param text: str, input sentence + :param from_: source language + :param to_: target language + :return: str, translate sentence + """ + try: + url = "https://api.ai.qq.com/fcgi-bin/nlp/nlp_texttranslate" + params_text = get_params(text, from_l=from_, to_l=to_) + res_post = requests.request("POST", url, data=params_text) + res_content = res_post.content.decode("utf8") + res_json = json.loads(res_content) + target_text = res_json["data"]["target_text"] + print("target:", target_text) + return target_text + except Exception as e: + logger.error(str(e)) + return None + + +def translate_tencent_back(text, from_='zh', to_='en'): + """ + 回译,调用两次腾讯翻译 + :param text: str, input sentence + :param from_: source language + :param to_: target language + :return: str, translate sentence + """ + try: + text_from_to = any_to_any_translate_tencent(text, from_=from_, to_=to_) + text_to_from = any_to_any_translate_tencent(text_from_to, from_=to_, to_=from_) + return text_to_from + except Exception as e: + logger.error(str(e)) + return None + + + +if __name__ == '__main__': + text_test = "你觉得JY会喜欢暗影随风、大漠帝国吗".strip() + for to_test in language_short_tencent: + res_test = translate_tencent_back(text_test, from_='zh', to_=to_test) + print("没有账户就为空,回译结果: ") + print(res_test) \ No newline at end of file diff --git a/Augmentation/translate_translate.py b/Augmentation/translate_translate.py new file mode 100644 index 0000000..a18f388 --- /dev/null +++ b/Augmentation/translate_translate.py @@ -0,0 +1,42 @@ +# @function :使用翻译工具translate.Translator,回译 + + +from constant import language_short_google +from tools import judge_translate_english +from translate import Translator + + +def translate_tools_translate(text, to_='en'): + """ + 调用translate进行句子生成 + :param text: str, input + :param to_: language type + :return: str, result + """ + # provider = 'mymemory','microsoft' + translator1 = Translator(to_lang=to_, from_lang='zh', provider=None, secret_access_key=None) + translator2 = Translator(to_lang="zh", from_lang=to_, provider=None, secret_access_key=None) + + translation1 = translator1.translate(text) + translation2 = translator2.translate(translation1) + return translation2 + + +if __name__ == "__main__": + sen_org = "大漠帝国喜欢RSH、JY吗" + for language_short_google_one in language_short_google: + text_translate = translate_tools_translate(sen_org, to_=language_short_google_one) + judge = judge_translate_english(sen_org, text_translate) + if judge: + print("True") + print(text_translate) + else: + print("False") + print(text_translate) +# 测试结果: +# False +# 沙漠帝国是否像RSH,JY? +# False +# 沙漠帝国看起来像RSH,JY? +# False +# 帝国沙漠像rsh,jy? \ No newline at end of file diff --git a/README.md b/README.md index d2f0d03..3254ece 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # EasyBert -基于Pytorch的Bert应用,包括命名实体识别、情感分析、文本分类以及文本相似度等(后续更新其他方向相关模块)。各个子项目大都为开源工作,本项目仅做相应处理以及提供一个已训练的预测接口,方便需求者进行快速的使用。本项目仅作为学习与研究使用,若存在侵权行为,请原作者务必联系我进行协商处理。 +基于Pytorch的Bert应用,包括命名实体识别、情感分析、文本分类以及文本相似度等(后续更新其他方向相关模块),并有相关数据与深度训练优化方式api。各个子项目大都为开源工作,本项目仅做相应处理以及提供一个已训练的预测接口,方便需求者进行快速的使用。本项目仅作为学习与研究使用,若存在侵权行为,请原作者务必联系我进行协商处理。 @@ -33,7 +33,7 @@ python >= 3.7 Pytorch >= 1.14 transformers >= 2.8.0 ## 情感分析 Sentiment.py -原始训练数据:该部分原数据因项目原因不提供,如需重新训练可更换其他开源数据集 +原始训练数据:该部分原数据因项目原因不提供,如需重新训练可更换其他开源数据集. ```python test = ['#你好2020#新年第一天元气满满的早起出门买早饭结果高估了自己抗冻能力回家成功冻发烧(大概是想告诉我2020要量力而行)然鹅这并不影响后续计划一出门立马生龙活虎新年和新??更配哦??看了误杀吃了大餐就让新的一年一直这样美滋滋下去吧??', @@ -122,6 +122,41 @@ result = main(text) ''' ``` +## 文本增强 + +1. EDA +2. 回译 + +注:暂时没有提供接口进行集成,已写好相关功能主函数及附带使用例子,若需可自行调。 + +## 训练优化 + +1. EMA 指数滑动平均 +2. FGM 对抗训练api +3. PGD 对抗训练api + +相关源代码已有优秀开源,本项目借鉴训练时部分加入相关训练优化trcik,部分保持原始代码复现格式,若需相关训练优化功能,相关代码及使用方式已给出,按需使用。 + +```python +# 权重滑动平均,对最近的数据给予更高的权重 +uasge: +# 初始化 +ema = EMA(model, 0.999) +ema.register() + +# 训练过程中,更新完参数后,同步update shadow weights +def train(): + optimizer.step() + ema.update() + + # eval前,apply shadow weights; + # eval之后(保存模型后),恢复原来模型的参数 + def evaluate(): + ema.apply_shadow() + # evaluate + ema.restore() +``` + # 后续工作 @@ -133,8 +168,16 @@ result = main(text) # 资料参考 +致谢! + [https://github.com/lonePatient/BERT-NER-Pytorch](https://github.com/lonePatient/BERT-NER-Pytorch) https://github.com/649453932/Bert-Chinese-Text-Classification-Pytorch -https://github.com/zhaogaofeng611/TextMatch \ No newline at end of file +https://github.com/zhaogaofeng611/TextMatch + +https://github.com/yongzhuo/nlp_xiaojiang + +[https://fyubang.com/2019/10/15/adversarial-train/](https://fyubang.com/2019/10/15/adversarial-train/) + +[https://zhuanlan.zhihu.com/p/68748778](https://zhuanlan.zhihu.com/p/68748778) \ No newline at end of file