词典+自然语言处理+翻译api 从文章中提取单词并翻译

学校老师布置了一个作业,要把报纸中的生词摘抄下来,但是报纸非常难,生词非常多,一个一个抄下来翻译非常麻烦,于是,我就想用程序解决。

以下是步骤:

 

花钱买电子报纸

花费12元购买电子报纸

学校用的是TEENS,有电子报纸可以买,电子报纸有所有文章的电子版,拷贝下来既可。

如果没有电子报纸或者想要省钱可以先用扫描仪扫描,再文字识别

文字识别比较简单,有这几个方案:

1、QQ图片自带文字扫描

2、腾讯ai开放平台免费文字扫描

3、腾讯云/阿里云/有道智云 等云计算平台的付费文字扫描(推荐)

 

初次提取

首先,在github上准备初中必会词库,大约有2000个左右。

把文章里的每一个词汇与词库对比,词库中有的,就不是生词,把没出现过的保留

这一步比较简单,就不放代码了

运行完,原本30000个词汇还剩下5000个

 

词性还原

我发现还有很多词汇,比如asked,是ask的过去式,不在词库中,所以要进行词性还原

最好的办法是用python的nltk库,具体安装方法自己百度

下面是代码

from nltk import word_tokenize, pos_tag
from nltk.corpus import wordnet
from nltk.stem import WordNetLemmatizer

def get_wordnet_pos(tag):
    if tag.startswith('J'):
        return wordnet.ADJ
    elif tag.startswith('V'):
        return wordnet.VERB
    elif tag.startswith('N'):
        return wordnet.NOUN
    elif tag.startswith('R'):
        return wordnet.ADV
    else:
        return None

file = open("") 

while 1:
    line = file.readline()
    if not line:
        break
    tokens = word_tokenize(line)  # 分词
    tagged_sent = pos_tag(tokens)     # 获取单词词性
    wnl = WordNetLemmatizer()
    lemmas_sent = []
    for tag in tagged_sent:
        wordnet_pos = get_wordnet_pos(tag[1]) or wordnet.NOUN
        lemmas_sent.append(wnl.lemmatize(tag[0], pos=wordnet_pos)) # 词形还原
    print(lemmas_sent)
file.close()

处理完之后,再次与词库对比,并进行去重

 

人工筛选

现在还有2200个词汇左右

先对词汇进行字典序排序,可以删除一堆录入错误的,和数字,比如20th这样的

再用20分钟过一遍,差不多可以再删除500个已经会的单词,但是还会有很多名词掺杂

 

调用本地词典

为了获取这些单词的意思,我找到了高考词汇,4级词汇和6级词汇,

写一个简单的程序就可以把不少词的翻译准备好,我的格式是,单词+空格+词性+空格+翻译

如果用php写,注意转编码,后面要导入excel,excel不支持utf-8

差不多有一半词汇都有翻译了,还剩一半

 

调用有道api

我思前想后,还是觉得有道智云的翻译最好用,限制门槛低,单词解释全。

我剩余的几百个词汇差不多花了0.6元的费用,但是他注册就送50元,所以基本等于没花钱

只要处理一下返回的json就行,非常简单

 

导入excel

现在有两个文件,全部在excel中 数据-导入  既可

对A列的单词排序,发现有单词相同的词性不同的,于是想把上下相同的单词合并单元格

好几千行人工处理不现实,于是用vba写一个小程序

Sub 合并()

Dim i As Integer, j%, rng As Range
Application.DisplayAlerts = False
i = Cells(Rows.Count, 1).End(xlUp).Row
For j = i To 3 Step -1
  Set rng = Range("a" & j)
  If rng = rng.Offset(-1) Then
    rng.Offset(-1).Resize(2).Merge
  End If
Next
Application.DisplayAlerts = True
End Sub

就可以快速合并了,

别忘了开自动换行,单词翻译比较长的就不会丢了

 

 

最后用excel处理翻译,用vbs处理单元格

 

点赞

发表评论