[nodejs] 프로그래밍을 통한 단어장 만들기 #1 - 시작
서문
안녕하세요 @wonsama 입니다. 영어는 살면서 필수 인거 같습니다 ㅜㅜ 그래서 영어 공부를 하기 위해 medium에서 글을 읽어 봤는데 몇일 읽다가 단어 정리하다 끝날거 같아서, 그냥 구글 번역기 돌렸는데 이러면 또 실력도 늘지 않고 영원히 번역기 돌릴거 같아 단어장 프로그램을 만들기로 해봤습니다.
나중에 어느정도 만들어지면 github에 올려 공유하도록 하겠습니다. 쓰실분 있을려나 -_-;
참고로 소스는 nodejs 기반하에 동작합니다.
그리고 이 글은 연재 형식으로, 기능이 어느정도 개선되면 이글의 피드백을 받은 내용을 포함하여 기재하도록 하겠습니다.
동작방식
- 영어 TXT 읽기 >>> 단어분리 >>> 모르는 단어만 추출 >>> 번역 >>> 외우기
- 외운 항목에 단어 추가
- 1~2 항목 반복
DONE
- 파일에서 읽기
- 문장에서 단어 추출
- 이미 알고 있는 단어는 추출 제외
TODO LIST
- 단어 맞추기 게임 ( 외운 날짜 기준으로 날짜 범위 설정 가능)
- url 정보 입력을 통해 문서 읽기 ( 웹사이트마다 별도 파서가 필요예상)
- google translate 연동으로 모르는 단어 자동 번역
- express로 ui 구성하기 ( 모르는 단어 선택을 쉽게 하기 위함 + 웹에서도 동작하도록 )
- electron으로 desktop app 형태 만들기
( 생각 날때마다 좀 더 추가예정)
result
현재 소스로 동작할 경우 처리
알고있는 단어를 쳐 넣는것이 일임 -_-;;
단순하게 문장에서 단어 분리를 하여 카운팅하는데에는 유용함.
예시 결과물) 문장을 읽어들인 이후 모르는 단어를 나열
[ word.js ]
nodejs로 만든 단어장 프로그램
아직은 개발 중 입니다. 베타급도 아님 -_-;
var fs = require('fs');
const MEM_FOLDER = './mem/'; // 알고 있는 단어 목록, 날짜별로 기록
// 알고있는 단어 목록을 로딩한다
let knownWords = ()=>{
let arrMemories = [];
let arr = [];
fs.readdirSync( MEM_FOLDER ).forEach(file => {
if(file.indexOf('mem_')>=0){
arrMemories = arrMemories.concat( JSON.parse( fs.readFileSync(`${MEM_FOLDER}${file}`, 'utf8')).words );
}
})
arrMemories.sort();
for(obj of arrMemories){
arr.push(obj.w);
}
return arr;
}
// 문장에서 단어 출현 횟수를 카운팅 한다
// sentence 문장
// return 단어 출현 횟수 정보가 담긴 object
let countWords = (sentence)=>{
let index = {};
let words = sentence
.replace(/[.,?!;()"'-]/g, " ") // 특수문자는 공백 전환
.replace(/[\’\“\—\:\…\/]/g, " ") // 특수문자는 공백 전환
.replace(/[0-9]/g, " ") // 숫자 또한 공백 전환
.replace(/\s+/g, " ") // 공백 여러개는 공백 하나로 전환
.toLowerCase() // 소문자로 전환
.split(" "); // 공백으로 나눠주기
// 단어목록 => 2글자 이하 제외, 외운단어 제외
words = removeWords(words);
// 단어목록 카운팅 => index 저장
words.forEach(function(word) {
if (!(index.hasOwnProperty(word))) {
index[word] = 0;
}
index[word]++;
});
// 정렬
let ordered = {};
Object.keys(index).sort().forEach(function(key) {
ordered[key] = index[key];
});
return ordered;
}
// 배열 필터 ( 2글자이하 제외 ) + 알고 있는 단어 제외
// words 단어 목록
let removeWords = (words)=>{
return words.filter(word => word.length>2 && !knownWords().includes(word) );
}
// 파일에서 문서 정보를 일어들인 후 단어를 카운팅한다. ( 이미 알고 있는 단어는 제외 )
let txtContents = fs.readFileSync('./words.txt', 'utf8');
console.log ( countWords(txtContents) );
[word.txt]
읽어들일 문장이며, 이는 추후 웹 url만 넣어도 동작하도록 기능 개선할 예정
DEVELOPING STORY
Uber is exiting Southeast Asia
Uber has agreed to sell its business in Southeast Asia to local rival Grab.
Grab is taking over Uber’s ride-hailing business in eight countries and Uber Eats, which is currently present in three. In exchange, Uber gets a 27.5 percent stake in Grab and Uber CEO Dara Khosrowshahi will join Grab’s board.
Southeast Asia is seen as a growth market thanks to a population of over 600 million people, many of whom are coming online for the first time, but it is also considered a loss-making market for new industries like ride-sharing — particularly when two companies are locked in a subsidies war.
This consolidation has been strongly rumored since SoftBank, an early investor in Grab, backed Uber via an investment in January.
[./mem/mem_000000.json]
w는 단어, r은 단어 뜻을 번역하여 자동으로 넣어줄 예정
json의 레이아웃은 언제든지 바뀔 수 있습니다. (기능 추가 적용을 위함)
{
"resource" : "https://techcrunch.com/story/uber-is-exiting-southeast-asia/",
"date" : "20180415",
"words" :[
{"w":"currently", "r":"__________"},
{"w":"board", "r":"__________"},
{"w":"companies", "r":"__________"},
{"w":"business", "r":"__________"},
{"w":"countries", "r":"__________"},
{"w":"developing", "r":"__________"},
{"w":"early", "r":"__________"},
{"w":"eats", "r":"__________"},
{"w":"eight", "r":"__________"},
{"w":"first", "r":"__________"},
{"w":"growth", "r":"__________"},
{"w":"industries", "r":"__________"},
{"w":"investment", "r":"__________"},
{"w":"investor", "r":"__________"},
{"w":"january", "r":"__________"},
{"w":"join", "r":"__________"},
{"w":"like", "r":"__________"},
{"w":"local", "r":"__________"},
{"w":"locked", "r":"__________"},
{"w":"loss", "r":"__________"},
{"w":"making", "r":"__________"},
{"w":"many", "r":"__________"},
{"w":"market", "r":"__________"},
{"w":"million", "r":"__________"},
{"w":"online", "r":"__________"},
{"w":"particularly", "r":"__________"},
{"w":"people", "r":"__________"},
{"w":"percent", "r":"__________"},
{"w":"present", "r":"__________"},
{"w":"ride", "r":"__________"},
{"w":"rival", "r":"__________"},
{"w":"sell", "r":"__________"},
{"w":"sharing", "r":"__________"},
{"w":"since", "r":"__________"},
{"w":"softbank", "r":"__________"},
{"w":"southeast", "r":"__________"},
{"w":"story", "r":"__________"},
{"w":"strongly", "r":"__________"},
{"w":"taking", "r":"__________"},
{"w":"thanks", "r":"__________"},
{"w":"three", "r":"__________"},
{"w":"time", "r":"__________"},
{"w":"two", "r":"__________"},
{"w":"uber", "r":"__________"},
{"w":"via", "r":"__________"},
{"w":"war", "r":"__________"},
{"w":"ceo", "r":"__________"},
{"w":"coming", "r":"__________"},
{"w":"asia", "r":"__________"},
{"w":"has", "r":"__________"},
{"w":"also", "r":"__________"},
{"w":"and", "r":"__________"},
{"w":"are", "r":"__________"},
{"w":"been", "r":"__________"},
{"w":"but", "r":"__________"},
{"w":"for", "r":"__________"},
{"w":"get", "r":"__________"},
{"w":"gets", "r":"__________"},
{"w":"its", "r":"__________"},
{"w":"new", "r":"__________"},
{"w":"over", "r":"__________"},
{"w":"seen", "r":"__________"},
{"w":"the", "r":"__________"},
{"w":"this", "r":"__________"},
{"w":"when", "r":"__________"},
{"w":"which", "r":"__________"},
{"w":"whom", "r":"__________"},
{"w":"will", "r":"__________"}
]
}
맺음말
궁금하시거나 개선사항은 댓글로 피드백 부탁 드립니다.
행복한 한주 보내세요 ~
우와... 컴퓨터 코딩 전문가셨네요. 대단하세요^^
전문가는 아니고여 그냥 직업이 프로그램 개발쪽이라 ... 참고로 주로 자바쪽을 개발하긴 합니다.
프로그래밍 멋있어요! 저도 영어와 블록체인 공부를 위해 medium에서 기사 읽고 요약 포스팅 올려 보려고 했는데 쉽지 않더라구요ㅠ 개발 완성되면 함 사용해 보고 싶네요^^
desktop app으로 만들기까진 시간이 걸리겠지만 (일하는 중간중간 짬날때 하는거라...)
함 해보려고여 ^^
백엔드보다 프론트엔드에 공을 더 들여야겠는데요? ^^
프론트엔드에서 외운 것 알고 있는 것을 편하게 넣게끔만 해도 더 유용해지지 않을까 싶습니다 ㅎ
넵 그럴거 같더라고여 ... 그래서 우선 express로 웹단 만들어서 해당 부분을 손쉽게 하려 하는데 ... 웹을 하려면 pug 같은 탬플릿엔진에 이쁘게 해야 되니 bootstrap 에 sass 같은css도 해야 되고 머리가 ... -_-;
일단 대충 쓸 정도 수준으로 시작해 봐야죠
첨부터 다 생각하면 머리도 아프고 갑자기 하기 싫어지는 부분이 있는 것 같습니다 ㅋㅋㅋ
그래서 항상 느끼는 거지만 일단 빨리 할 수 있는 거 먼저 해 놓고 하나하나 추가하는게 오히려 정신건강에도 꾸준히 하는거에도 도움이 되더라구요~
말씀하신대로 걍 대충 쓸 정도로 시작하시죠 ㅎㅎ
어려워서 이해는 힘들지만... 음 저도 이제 영어공부 할수 있는 건가요? ㅎㅎ
이런말씀 하시는 분들은 보통 영어 고수던데... ^^
일단 조금씩 만들어 보려고여 ~
have a good day !!
!!! 힘찬 하루 보내요!
https://steemit.com/kr/@mmcartoon-kr/5r5d5c
어마어마합니다!! 상금이 2억원!!!!!!