twfilter 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +37 -0
  3. data/LICENSE +19 -0
  4. data/NOTICES.md +93 -0
  5. data/README.md +364 -0
  6. data/lib/twfilter/block.rb +36 -0
  7. data/lib/twfilter/checks/erhua.rb +40 -0
  8. data/lib/twfilter/checks/lexicon.rb +83 -0
  9. data/lib/twfilter/checks/script.rb +71 -0
  10. data/lib/twfilter/checks/shape.rb +40 -0
  11. data/lib/twfilter/checks/wenyan.rb +32 -0
  12. data/lib/twfilter/data/MANIFEST.json +85 -0
  13. data/lib/twfilter/data/cantonese.txt +17 -0
  14. data/lib/twfilter/data/converted_orthography.txt +14 -0
  15. data/lib/twfilter/data/erhua_headed.txt +14 -0
  16. data/lib/twfilter/data/erhua_tailed.txt +36 -0
  17. data/lib/twfilter/data/foreign_topics.txt +80 -0
  18. data/lib/twfilter/data/mainland_exceptions.tsv +6 -0
  19. data/lib/twfilter/data/mainland_hard.tsv +149 -0
  20. data/lib/twfilter/data/mainland_soft.tsv +38 -0
  21. data/lib/twfilter/data/moe_common.txt +4808 -0
  22. data/lib/twfilter/data/moe_exception.txt +12 -0
  23. data/lib/twfilter/data/moe_rare.txt +18356 -0
  24. data/lib/twfilter/data/moe_secondary.txt +6343 -0
  25. data/lib/twfilter/data/regional_hard.tsv +19 -0
  26. data/lib/twfilter/data/simplified_only.txt +3785 -0
  27. data/lib/twfilter/data/taiwan_grammar.txt +20 -0
  28. data/lib/twfilter/data/taiwan_lexicon.txt +51 -0
  29. data/lib/twfilter/data/taiwan_markers.txt +66 -0
  30. data/lib/twfilter/data/taiwan_particles.txt +7 -0
  31. data/lib/twfilter/data/variants_used_in_taiwan.txt +16 -0
  32. data/lib/twfilter/data/wenyan.txt +4 -0
  33. data/lib/twfilter/errors.rb +12 -0
  34. data/lib/twfilter/evidence.rb +44 -0
  35. data/lib/twfilter/finding.rb +42 -0
  36. data/lib/twfilter/han.rb +30 -0
  37. data/lib/twfilter/policy.rb +68 -0
  38. data/lib/twfilter/punctuation.rb +106 -0
  39. data/lib/twfilter/sentences.rb +32 -0
  40. data/lib/twfilter/subject.rb +28 -0
  41. data/lib/twfilter/tables.rb +140 -0
  42. data/lib/twfilter/version.rb +5 -0
  43. data/lib/twfilter.rb +57 -0
  44. data/licenses/APACHE-2.0.txt +202 -0
  45. data/sig/twfilter.rbs +215 -0
  46. metadata +137 -0
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TWFilter
4
+ module Checks
5
+ module Lexicon
6
+ NAME = :lexicon
7
+
8
+ class << self
9
+ def call(subject)
10
+ findings = []
11
+
12
+ hard = hits(subject, :hard, hard_terms)
13
+ findings << finding(:mainland, hard.first(DETAIL_SAMPLE).join(" "), :reject) if hard.any?
14
+
15
+ severity = subject.policy.soft_lexicon_rejects ? :reject : :mark
16
+ soft = hits(subject, :soft, soft_terms)
17
+ findings << finding(:mainland_soft, soft.first(DETAIL_SAMPLE).join(" "), severity) if soft.any?
18
+
19
+ cantonese = subject.text.scan(union(:cantonese, cantonese_chars)).uniq
20
+ findings << finding(:cantonese, cantonese.first(DETAIL_SAMPLE).join, :reject) if cantonese.any?
21
+
22
+ regional = hits(subject, :regional, regional_terms)
23
+ findings << finding(:regional, regional.first(DETAIL_SAMPLE).join(" "), :reject) if regional.any?
24
+
25
+ topics = subject.text.scan(union(:topics, foreign_topics)).uniq.select { |term| topic?(subject.text, term) }
26
+ if topics.any?
27
+ severity = subject.policy.foreign_topics_reject ? :reject : :mark
28
+ findings << finding(:foreign_topic, topics.first(DETAIL_SAMPLE).join(" "), severity)
29
+ end
30
+
31
+ findings
32
+ end
33
+
34
+ def taiwan_form(term) = hard_terms[term] || soft_terms[term]
35
+
36
+ def hard_terms = @hard_terms ||= forms("mainland_hard.tsv")
37
+
38
+ def soft_terms = @soft_terms ||= forms("mainland_soft.tsv")
39
+
40
+ def forms(table) = Tables.columns(table).to_h { |mainland, taiwan, *| [mainland, taiwan] }.freeze
41
+
42
+ def exceptions = Tables.groups("mainland_exceptions.tsv")
43
+
44
+ def regional_terms = @regional_terms ||= forms("regional_hard.tsv")
45
+
46
+ def cantonese_chars = Tables.rows("cantonese.txt")
47
+
48
+ def foreign_topics = Tables.rows("foreign_topics.txt")
49
+
50
+ def reset! = (@hard_terms = @soft_terms = @regional_terms = @unions = nil)
51
+
52
+ # Taipei streets carry mainland city names by KMT-era decree, so an address suffix suppresses a topic hit.
53
+ ADDRESS = /[東西南北中]?(?:[一二三四五六七八九十]段)?(?:路|街|巷|弄|大道|夜市)/
54
+
55
+ def topic?(text, term)
56
+ return false unless text.include?(term)
57
+
58
+ text.scan(term).length > text.scan(/#{Regexp.escape(term)}#{ADDRESS}/).length
59
+ end
60
+
61
+ # One union scan per table beats 200-odd substring searches; the exception mask then
62
+ # runs only for terms that actually matched.
63
+ def union(name, terms) = unions[name] ||= Regexp.union(terms.sort_by { |term| -term.length })
64
+
65
+ private
66
+
67
+ def unions = @unions ||= {}
68
+
69
+ def hits(subject, band, terms)
70
+ found = subject.text.scan(union(band, terms.keys)).uniq
71
+ return found if found.empty?
72
+
73
+ found.select { |term|
74
+ allowed = exceptions[term]
75
+ allowed.nil? || subject.masked(allowed).include?(term)
76
+ }
77
+ end
78
+
79
+ def finding(code, detail, severity) = Finding.new(check: NAME, code: code, severity: severity, detail: detail)
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TWFilter
4
+ module Checks
5
+ module Script
6
+ NAME = :script
7
+ TIER_FILES = {
8
+ TIERS.fetch(:common) => "moe_common.txt",
9
+ TIERS.fetch(:secondary) => "moe_secondary.txt",
10
+ TIERS.fetch(:rare) => "moe_rare.txt"
11
+ }.freeze
12
+
13
+ class << self
14
+ def call(subject)
15
+ findings = []
16
+
17
+ simplified = subject.han_chars.select { |char| simplified_only.include?(char) }.uniq
18
+ findings << finding(:simplified, simplified.first(DETAIL_SAMPLE).join) if simplified.any?
19
+
20
+ converted = subject.han_chars.select { |char| converted_orthography.include?(char) }.uniq
21
+ if converted.any?
22
+ severity = subject.policy.orthography_rejects ? :reject : :mark
23
+ findings << finding(:converted_orthography, converted.first(DETAIL_SAMPLE).join, severity)
24
+ end
25
+
26
+ unlisted = subject.han_chars.reject { |char| tiers.key?(char) }.uniq
27
+ findings << finding(:unlisted, unlisted.first(DETAIL_SAMPLE).join) if unlisted.any?
28
+
29
+ limit = subject.policy.tier_limit
30
+ above = subject.han_chars.select { |char| (tiers[char] || 0) > limit }.uniq
31
+ findings << finding(:above_tier, above.first(DETAIL_SAMPLE).join) if above.any?
32
+
33
+ findings
34
+ end
35
+
36
+ def tier(char) = tiers[char]
37
+
38
+ def tier_of(text)
39
+ levels = text.each_char.filter_map { |char| tiers[char] if Han.char?(char) }
40
+ return nil if levels.length < text.each_char.count { |char| Han.char?(char) }
41
+
42
+ levels.max || TIERS.fetch(:common)
43
+ end
44
+
45
+ def tiers
46
+ @tiers ||= TIER_FILES
47
+ .flat_map { |level, file| Tables.rows(file).map { |char| [char, level] } }
48
+ .reverse
49
+ .to_h
50
+ .merge(Tables.rows("moe_exception.txt").to_h { |char| [char, TIERS.fetch(:common)] })
51
+ .freeze
52
+ end
53
+
54
+ def reset! = @tiers = nil
55
+
56
+ def simplified_only = Tables.set("simplified_only.txt")
57
+
58
+ def converted_orthography = Tables.set("converted_orthography.txt")
59
+
60
+ private
61
+
62
+ def finding(code, detail, severity = :reject) = Finding.new(
63
+ check: NAME,
64
+ code: code,
65
+ severity: severity,
66
+ detail: detail
67
+ )
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TWFilter
4
+ module Checks
5
+ module Shape
6
+ NAME = :shape
7
+
8
+ module_function
9
+
10
+ def call(subject)
11
+ return [finding(:empty)] if subject.empty?
12
+
13
+ findings = []
14
+ findings << finding(:no_han) if subject.han.zero?
15
+
16
+ range = subject.policy.han_range
17
+ unless range.cover?(subject.han)
18
+ code = subject.han < range.first ? :too_short : :too_long
19
+ findings << finding(code, subject.han.to_s)
20
+ end
21
+
22
+ if subject.ratio < subject.policy.min_han_ratio
23
+ findings << finding(:low_han_ratio, format("%.2f", subject.ratio))
24
+ end
25
+
26
+ offenders = Punctuation.offenders(subject.text, punctuation: subject.policy.punctuation)
27
+ findings << finding(:junk_characters, offenders.first(DETAIL_SAMPLE).join) if offenders.any?
28
+
29
+ unless subject.policy.allow_latin
30
+ latin = subject.text.scan(/[A-Za-z]+/).uniq
31
+ findings << finding(:latin, latin.first(DETAIL_SAMPLE).join(" ")) if latin.any?
32
+ end
33
+
34
+ findings
35
+ end
36
+
37
+ def finding(code, detail = nil) = Finding.new(check: NAME, code: code, detail: detail)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TWFilter
4
+ module Checks
5
+ module Wenyan
6
+ NAME = :wenyan
7
+
8
+ class << self
9
+ def call(subject)
10
+ policy = subject.policy
11
+ return [] if subject.han < policy.wenyan_min_han
12
+
13
+ hits = markers.sum { |char| subject.text.count(char) }
14
+ return [] if hits < policy.wenyan_min_hits
15
+
16
+ density = density(subject)
17
+ return [] if density <= policy.wenyan_max_density
18
+
19
+ [Finding.new(check: NAME, code: :literary_density, detail: format("%.0f%%", density * 100))]
20
+ end
21
+
22
+ def density(subject)
23
+ return 0.0 if subject.han.zero?
24
+
25
+ markers.sum { |char| subject.text.count(char) }.fdiv(subject.han)
26
+ end
27
+
28
+ def markers = Tables.rows("wenyan.txt")
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,85 @@
1
+ {
2
+ "version": "0.1.0",
3
+ "tables": {
4
+ "cantonese.txt": {
5
+ "rows": 17,
6
+ "sha256": "3f37b31e98f167cf860ab4068cdf0eaebb7702afccb8b3701dec72cf7223dc2f"
7
+ },
8
+ "converted_orthography.txt": {
9
+ "rows": 14,
10
+ "sha256": "073f87fffb5922f45a2b1af40deca536dddafc502cc73a87b05846d29b0ecc6d"
11
+ },
12
+ "erhua_headed.txt": {
13
+ "rows": 14,
14
+ "sha256": "0163fdff14363f3479a072c54a411f37ff3533b7835e3aa6133cc9b56fdf7364"
15
+ },
16
+ "erhua_tailed.txt": {
17
+ "rows": 36,
18
+ "sha256": "ef0bede84353fa8f555a9ca74ba7bad0b9647622f33b9694bd6ad61d51fb8e14"
19
+ },
20
+ "foreign_topics.txt": {
21
+ "rows": 80,
22
+ "sha256": "d1685884afd1aafb5c7be07e222fedbd3a4ca1ccf3d96754dae90fdcb32a472f"
23
+ },
24
+ "mainland_exceptions.tsv": {
25
+ "rows": 6,
26
+ "sha256": "647077330116c176dd0aaa983254fbee2129d68da7fe5dffdc5d72c4e5f26bcc"
27
+ },
28
+ "mainland_hard.tsv": {
29
+ "rows": 149,
30
+ "sha256": "11c8c4219b1f5c578b33183eeb93992f932d9ba47ce8ab6d7aea15089468cc69"
31
+ },
32
+ "mainland_soft.tsv": {
33
+ "rows": 38,
34
+ "sha256": "1435fc2814454e2675fc4f76528abfa448a18e7e223254bad66ac73b409a2a18"
35
+ },
36
+ "moe_common.txt": {
37
+ "rows": 4808,
38
+ "sha256": "1e052f87442c6fd97f12c23e1b966e8beb9222802539943409c8b12778104fcb"
39
+ },
40
+ "moe_exception.txt": {
41
+ "rows": 12,
42
+ "sha256": "9f9e62c0949845e6925c400b75d887a40b8bb0a6ef5e0d9596674033c4ba06fe"
43
+ },
44
+ "moe_rare.txt": {
45
+ "rows": 18356,
46
+ "sha256": "1c977e350b1f05edbaf416e55101308e18f5094f5a0dcbdd226985645ee0e34c"
47
+ },
48
+ "moe_secondary.txt": {
49
+ "rows": 6343,
50
+ "sha256": "b57bce3314a4cdde1d8ac3de18f3a65e3319583b0dab9a35ad2c9f1da2d563ef"
51
+ },
52
+ "regional_hard.tsv": {
53
+ "rows": 19,
54
+ "sha256": "ab27602d5c653b048150f09359d3981d49c28c2cfb19fa6246409b65270b224f"
55
+ },
56
+ "simplified_only.txt": {
57
+ "rows": 3785,
58
+ "sha256": "3fe3435085f1a30635a209e47c248737a02c12a4fe555dd6a5e79932ab477868"
59
+ },
60
+ "taiwan_grammar.txt": {
61
+ "rows": 20,
62
+ "sha256": "75883c2ea49680a5742d9e96d4a957389b5ec7d4230ee5c999f3736e7907a04f"
63
+ },
64
+ "taiwan_lexicon.txt": {
65
+ "rows": 51,
66
+ "sha256": "2660534604ee7c3116c9ccf0ca2a18b50dc4187bd33703c84ed9598877195dad"
67
+ },
68
+ "taiwan_markers.txt": {
69
+ "rows": 66,
70
+ "sha256": "ba5f9207bc921bfac3f77cb5f8743fd4e7ae013da222df4a66390eaf7e1a3cef"
71
+ },
72
+ "taiwan_particles.txt": {
73
+ "rows": 7,
74
+ "sha256": "5b67a3e12d0f90b05ec888188258749e2841b81ee3dc495084eefebfe4324eb2"
75
+ },
76
+ "variants_used_in_taiwan.txt": {
77
+ "rows": 16,
78
+ "sha256": "17ddc25d887834f44faa1173c61219066b708849cd56bdaa30d4be4f2d5fc9a9"
79
+ },
80
+ "wenyan.txt": {
81
+ "rows": 4,
82
+ "sha256": "6e554eab92ef5eabaa51958c6ae94744b5339c7a63d2865080b1587483ac9126"
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,17 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
@@ -0,0 +1,14 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
@@ -0,0 +1,14 @@
1
+ 兒女
2
+ 兒媳
3
+ 兒子
4
+ 兒孫
5
+ 兒少
6
+ 兒戲
7
+ 兒時
8
+ 兒歌
9
+ 兒福
10
+ 兒科
11
+ 兒童
12
+ 兒臂
13
+ 兒茶
14
+ 兒麻
@@ -0,0 +1,36 @@
1
+ 乾兒
2
+ 侄兒
3
+ 健兒
4
+ 味兒
5
+ 哪兒
6
+ 女兒
7
+ 姪兒
8
+ 嬌兒
9
+ 嬰兒
10
+ 孤兒
11
+ 孩兒
12
+ 寵兒
13
+ 小兒
14
+ 少兒
15
+ 幼兒
16
+ 患兒
17
+ 愛兒
18
+ 托兒
19
+ 棄兒
20
+ 特兒
21
+ 生兒
22
+ 產兒
23
+ 男兒
24
+ 當兒
25
+ 病兒
26
+ 稚兒
27
+ 義兒
28
+ 育兒
29
+ 胎兒
30
+ 花兒
31
+ 這兒
32
+ 遺兒
33
+ 那兒
34
+ 雛兒
35
+ 頭兒
36
+ 鳥兒
@@ -0,0 +1,80 @@
1
+ 一帶一路
2
+ 上海
3
+ 中共
4
+ 中國大陸
5
+ 中央電視台
6
+ 中華人民共和國
7
+ 京東
8
+ 人民幣
9
+ 人民日報
10
+ 入境處
11
+ 全國人大
12
+ 全面建成小康社會
13
+ 兩會
14
+ 八達通
15
+ 共產黨
16
+ 北京
17
+ 十四五
18
+ 南京
19
+ 南寧
20
+ 南昌
21
+ 合肥
22
+ 呼和浩特
23
+ 哈爾濱
24
+ 國務院
25
+ 城管
26
+ 大連
27
+ 天津
28
+ 太原
29
+ 央視
30
+ 小康社會
31
+ 居委會
32
+ 市委書記
33
+ 廈門
34
+ 廉政公署
35
+ 廣州
36
+ 建屋發展局
37
+ 強積金
38
+ 微信
39
+ 成都
40
+ 房屋署
41
+ 支付寶
42
+ 政務司
43
+ 政協
44
+ 教育統籌局
45
+ 新華社
46
+ 旺角
47
+ 昆明
48
+ 春運
49
+ 杭州
50
+ 武漢
51
+ 武警
52
+ 水務署
53
+ 油麻地
54
+ 消防處
55
+ 淘寶
56
+ 深圳
57
+ 濟南
58
+ 瀋陽
59
+ 烏節路
60
+ 烏魯木齊
61
+ 省委
62
+ 石家莊
63
+ 統戰部
64
+ 脫貧攻堅
65
+ 菠蘿包
66
+ 蘇州
67
+ 蘭州
68
+ 街道辦
69
+ 西安
70
+ 西寧
71
+ 觀塘
72
+ 解放軍
73
+ 貴陽
74
+ 運輸署
75
+ 鄭州
76
+ 重慶
77
+ 長沙
78
+ 雙減
79
+ 青島
80
+ 高質量發展
@@ -0,0 +1,6 @@
1
+ 信息 可信息 通信息
2
+ 打車 打車票 卡打車
3
+ 水平 水平面 水平線 水平儀 水平位移 水平方向 水平能見度
4
+ 視頻 電視頻道 電視頻率 影視頻道
5
+ 運行 營運行為 運行李
6
+ 集成 集成大典
@@ -0,0 +1,149 @@
1
+ 信息 資訊 0 2612
2
+ 文檔 文件 0 1649
3
+ 初中 國中 0 490
4
+ 公交車 公車 0 435
5
+ 軟件 軟體 0 412
6
+ 芯片 晶片 0 392
7
+ 首席執行官 執行長 0 368
8
+ 身份證 身分證 0 348
9
+ 幾率 機率 0 292
10
+ 屏幕 螢幕 0 248
11
+ 硬件 硬體 0 228
12
+ 數據庫 資料庫 0 216
13
+ 錄像 錄影 0 199
14
+ 出租車 計程車 0 174
15
+ 演示文稿 簡報 0 163
16
+ 意大利 義大利 0 148
17
+ 短信 簡訊 0 134
18
+ 互聯網 網際網路 0 119
19
+ 互聯網絡 網際網路 0 119
20
+ 裏頭 裡頭 0 116
21
+ 信道 通道 0 103
22
+ 納米 奈米 0 94
23
+ 方便麪 泡麵/速食麵 0 88
24
+ 方便麵 泡麵 0 87
25
+ 內存 記憶體 0 85
26
+ 服務器 伺服器 0 84
27
+ 光盤 光碟 0 72
28
+ 端口 埠 0 68
29
+ 打印 列印 0 63
30
+ 新西蘭 紐西蘭 0 61
31
+ 模塊 模組 0 59
32
+ 知識產權 智慧財產權 0 59
33
+ 複印 影印 0 55
34
+ 激光 雷射 0 54
35
+ 帕勞 帛琉 0 45
36
+ 缺省 預設 0 45
37
+ 英偉達 輝達 0 45
38
+ 奧巴馬 歐巴馬 0 43
39
+ 集成電路 積體電路 0 42
40
+ 優先級 優先順序 0 37
41
+ 人情味兒 人情味 0 36
42
+ 視頻會議 視訊會議 0 36
43
+ 帶寬 頻寬 0 31
44
+ 截屏 截圖 0 31
45
+ 博客 部落格 0 30
46
+ 鼠標 滑鼠 0 30
47
+ 寬帶 寬頻 0 29
48
+ 悉尼 雪梨 0 29
49
+ 開市客 好市多 0 29
50
+ 硬盤 硬碟 0 28
51
+ 艾滋病 愛滋病 0 28
52
+ 信息安全 資訊安全 0 27
53
+ 字段 欄位 0 26
54
+ 筆記本電腦 筆記型電腦 0 24
55
+ 超聲波 超音波 0 24
56
+ 存盤 存檔 0 23
57
+ 殺毒 防毒 0 23
58
+ 肯尼亞 肯亞 0 20
59
+ 首席運營官 營運長 0 20
60
+ 沙特阿拉伯 沙烏地阿拉伯 0 17
61
+ 脫機 離線 0 17
62
+ 信息技術 資訊科技 0 16
63
+ 卡塔爾 卡達 0 16
64
+ 移動通信 行動通訊 0 16
65
+ 網吧 網咖 0 16
66
+ 編程語言 程式語言 0 16
67
+ 布什 布希 0 15
68
+ 打印機 印表機 0 15
69
+ 老撾 寮國 0 15
70
+ 孤獨症 自閉症 0 14
71
+ 打車 叫車 0 13
72
+ 數據源 資料來源 0 13
73
+ 希拉里 希拉蕊 0 12
74
+ 二噁英 戴奧辛 0 11
75
+ 尼日利亞 奈及利亞 0 11
76
+ 桌面型 桌上型 0 11
77
+ U盤 隨身碟 0 10
78
+ 交互式 互動式 0 10
79
+ 優盤 隨身碟 0 10
80
+ 格魯吉亞 喬治亞 0 10
81
+ 總線 匯流排 0 10
82
+ 計算機斷層 電腦斷層 0 10
83
+ 阿爾茨海默病 阿茲海默症 0 10
84
+ 阿爾茨海默症 阿茲海默症 0 10
85
+ 移動網絡 行動網路 0 9
86
+ 臺式機 桌上型電腦 0 9
87
+ 光驅 光碟機 0 8
88
+ 克林頓 柯林頓 0 8
89
+ 原代碼 原始碼 0 8
90
+ 唐氏綜合徵 唐氏症 0 8
91
+ 唐氏綜合症 唐氏症 0 8
92
+ 源代碼 原始碼 0 8
93
+ 矢量 向量 0 8
94
+ 航天飛機 太空梭 0 8
95
+ 計算機科學 電腦科學 0 8
96
+ 危地馬拉 瓜地馬拉 0 7
97
+ 戛納 坎城 0 7
98
+ 移動電話 行動電話 0 7
99
+ 丙型肝炎 C型肝炎 0 6
100
+ 克羅地亞 克羅埃西亞 0 6
101
+ 冰棍 冰棒 0 6
102
+ 圖瓦盧 吐瓦魯 0 6
103
+ 大衆公司 福斯汽車 0 6
104
+ 大衆汽車 福斯汽車 0 6
105
+ 弗吉尼亞 維吉尼亞 0 6
106
+ 心梗 心肌梗塞 0 6
107
+ 心肌梗死 心肌梗塞 0 6
108
+ 相冊 相簿 0 6
109
+ 緩存 快取 0 6
110
+ 萬維網 全球資訊網 0 6
111
+ 調製解調器 數據機 0 6
112
+ 阿拉伯聯合酋長國 阿拉伯聯合大公國 0 6
113
+ 高性能計算 高效能運算 0 6
114
+ 伯利茲 貝里斯 0 5
115
+ 厄瓜多爾 厄瓜多 0 5
116
+ 尼日爾 尼日 0 5
117
+ 獲得性免疫缺陷綜合徵 後天免疫缺乏症候群 0 5
118
+ 索馬里 索馬利亞 0 5
119
+ 飛行模式 飛航模式 0 5
120
+ 首席信息官 資訊長 0 5
121
+ 佐治亞州 喬治亞州 0 4
122
+ 固件 韌體 0 4
123
+ 埃塞俄比亞 衣索比亞 0 4
124
+ 威斯康星 威斯康辛 0 4
125
+ 威斯康星州 威斯康辛州 0 4
126
+ 字符串 字串 0 4
127
+ 弗吉尼亞州 維吉尼亞州 0 4
128
+ 所羅門羣島 索羅門群島 0 4
129
+ 數組 陣列 0 4
130
+ 斯洛文尼亞 斯洛維尼亞 0 4
131
+ 正電子 正子 0 4
132
+ 紅細胞 紅血球 0 4
133
+ 蹦極 高空彈跳 0 4
134
+ 伯克希爾-哈撒韋 波克夏海瑟威 0 3
135
+ 伯克希爾哈撒韋 波克夏海瑟威 0 3
136
+ 借記卡 簽帳金融卡 0 3
137
+ 哈薩克斯坦 哈薩克 0 3
138
+ 市場營銷 市場行銷 0 3
139
+ 布基納法索 布吉納法索 0 3
140
+ 帕金森病 帕金森氏症/巴金森氏症 0 3
141
+ 彙編語言 組合語言 0 3
142
+ 瑙魯 諾魯 0 3
143
+ 甲型肝炎 A型肝炎 0 3
144
+ 肖邦 蕭邦 0 3
145
+ 艾奧瓦 愛荷華 0 3
146
+ 艾奧瓦州 愛荷華州 0 3
147
+ 薩蒂 薩提 0 3
148
+ 鎿 錼 0 3
149
+ 阿司匹林 阿斯匹靈 0 3
@@ -0,0 +1,38 @@
1
+ 甚麼 什麼 321 15714
2
+ 運行 執行 80 7692
3
+ 創建 建立 35 1395
4
+ 質量 品質 0 1304
5
+ 視頻 影片/視訊 0 999
6
+ 集成 整合 23 694
7
+ 交互 互動 29 668
8
+ 內核 核心 14 528
9
+ 鏈接 連結 3 499
10
+ 實時 即時 12 497
11
+ 查找 查詢 7 470
12
+ 水平 水準 64 336
13
+ 指針 指標 12 324
14
+ 視圖 檢視 5 308
15
+ 概率 機率 3 292
16
+ 特朗普 川普 4 282
17
+ 嚐試 嘗試 1 262
18
+ 人工智能 人工智慧 8 239
19
+ 澳大利亞 澳洲 8 230
20
+ 空調 冷氣 0 229
21
+ 激活 啟用 4 195
22
+ 仿真 模擬 4 180
23
+ 拷貝 複製 5 170
24
+ 塑料 塑膠 4 159
25
+ 硅 矽 2 157
26
+ 朝鮮 北韓 26 122
27
+ 傳感 感測 3 69
28
+ 內置 內建 3 63
29
+ 早上好 早安 2 50
30
+ 普京 普丁 2 49
31
+ 癡呆症 失智症 2 45
32
+ 抑鬱症 憂鬱症 1 32
33
+ 分佈式 分散式 1 25
34
+ B超 超音波 1 24
35
+ 分辨率 解析度 1 21
36
+ 詞組 片語 0 7
37
+ 前綴 字首 0 3
38
+ 輔音 子音 0 3