WebSpider에서 텍스트 파일 출력이 있습니다. 스파이더는 주어진 URL 목록에서 모든 문장을 추출합니다. 내가 해야 할 일은 이 파일을 처리하고 65자 이상의 문자가 포함된 모든 줄을 찾은 다음 각 줄의 언어를 결정하는 것입니다. 한 줄로 작동하도록 했습니다(내 bash 스크립팅 기술은 존재하지 않습니다).
sed -n '/^.\{65\}/p' www.mbl.is | langid --line | grep is
langid는 언어를 식별하고 해당 언어의 가능성과 관련된 숫자를 제공하는 Python 모듈입니다. 설치하려면 다음을 실행하세요.
pip install langid
또는 방문https://github.com/saffsd/langid.py, 자세한 내용을 알아보세요. 이제 내가 해야 할 일은 "is"와 grep을 포함하는 langid 명령에 파이프로 연결된 줄을 인쇄하는 것입니다. 다음은 현재 명령의 샘플 출력입니다.
('is', -288.34235095977783)
('is', -168.52833652496338)
('is', -255.30311250686646)
('is', -254.8700122833252)
('is', -664.7349543571472)
('is', -169.40936374664307)
('is', -315.0590629577637)
('is', -323.49001693725586)
('is', -281.2222490310669)
('is', -198.52733993530273)
('is', -152.1551775932312)
('is', -66.93532514572144)
('is', -231.61306524276733)
('is', -254.00042057037354)
('is', -322.7330708503723)
('is', -151.84487915039062)
편집 : 따르면테든논평
주문하다:
sed -n '/^.\{65\}/p' www.mbl.is
산출:
Eftir stutt stopp i hofudborginni sem okkur heilt yfir leist agaetlega a var kominn timi a ad graeja visa fyrir Vietnam. 1
I gaer, paskadag, eyddum vid thvi deginum i ad koma okkur fyrir a Back Home, gerdum god kaup a Petaling Street (chinatown) og forum i paskaeggjaleit. 1
Vid, temmilega nyvoknud, stigum ut ur rutunni thar sem klassisku leigubilstjornarnir standa fyrir utan ad berjast um folk i bilana sina. 1
Vid forum med Boraj og Tino og leigdum okkur hljodeinangrad einkaherbergi med ollu innifoldu i klukkutima, fyrir taepa 20 dollara (1/4 af manadarlaunum theirra!) - fullt af bjor, starfsmadur med okkur allan timan og steiktar poddur i snakk med idyfum. 1
Vid ludarnir i "Good morning Vietnam" bolunum okkar umkringd moldriku folki klaett i italkst fra toppi og nidur. 1
Vid aetlum tho rett ad vona ad foreldrar okkar sjai ser faert ad geyma eins og eitt alvoru paskaegg handa hvoru okkar? 1
Hinsvegar var okkur bent a tyndu perluna, Mai Chau, sem hefur allt sem Sapa hefur upp a ad bjoda, nema thu dregur turismann fra. 1
Thetta var audvitad allt saman hreinasta lygi en vid letum okkur hafa thad og gistum eina nott a thessu annars agaeta hoteli. 1
Individual truth is constantly evolving, and a truth seeker must be willing to give up last week's major truth for whatever new discovery the innermost self reveals. 1
Um kvoldid forum vid svo oll saman ad borda vid mekong ana og attum mjog gott kvold saman. 1
Tha segja teir enn fremur ad bandarikjamenn hafi i raun verid ad reyna ad hindra frekari utbreidslu kommunisma i SA-Asiu, svo ad stridid var i raun bara einn stor misskilningur. 1
주문하다:
sed -n '/^.\{65\}/p' www.mbl.is | langid --line
산출:
('en', -193.52840971946716)
('en', -445.4644522666931)
('en', -158.1918339729309)
('en', -220.16202330589294)
('en', -596.61936211586)
('en', -379.3824007511139)
('en', -150.61454391479492)
('en', -379.3824007511139)
('en', -270.56594038009644)
('en', -446.9800910949707)
('en', -702.9869554042816)
('en', -208.84209847450256)
('en', -345.15056800842285)
('en', -321.2763195037842)
('en', -209.9769265651703)
('en', -144.31591272354126)
('en', -208.40711855888367)
('en', -161.14595460891724)
('en', -180.95807218551636)
('is', -151.84487915039062)
('en', -32.042465686798096)
('no', -73.23809719085693)
('lb', -194.81272649765015)
('et', -80.76274251937866)
('en', -129.17673206329346)
('en', -95.43238878250122)
('da', -30.086124420166016)
이 작업은 한 줄로 수행할 수 있습니까, 아니면 스크립트를 작성하는 것이 더 낫습니까? Python에서 이 작업을 수행할 수 있지만 정규식 모듈은 고통스럽고 입력 파일을 기반으로 문자 변수를 빠르게 변경하고 grep을 다른 언어 코드로 쉽게 변경해야 합니다. 또한 지금이 bash 스크립팅 여정을 시작하기에 좋은 시기라고 생각합니다. bash 명령은 훌륭하고 bash 스크립팅도 마찬가지라고 가정할 수 있습니다(그냥 의미론과 구문, 많은 $ 기호를 이해하면 됩니다).
답변1
while 루프를 사용하여 이 작업을 수행할 수 있습니다.
while read l; do
[ ${#l} -gt 65 ] && \
echo "$l" | langid --line | grep -q "is" && \
echo "$l"
done <file
read l
입력을 한 줄씩 읽고 현재 줄을 변수에 저장합니다$l
.[ ${#l} -gt 65 ]
줄에 65자를 초과하는 경우.echo "$l" | langid --line | grep -q "is"
이 줄을 처리하려면grep
언어의 경우 자동으로 처리-q
됩니다grep
. 문자열이 존재하는지 확인하고 싶고 출력은 없습니다.echo "$l"
문자열이 있으면 원래 줄이 인쇄됩니다.
<file
콘텐츠를file
입력으로 사용합니다.
편집하다: 위의 langid
명령은 각 줄에서 명령을 실행하는데 매우 느립니다. 한 번의 전송으로 (더 빠르게) 실행하려면 다음을 사용하십시오.
awk 'FNR==NR{a[NR]=$0}
FNR!=NR&&$1~"is"{print a[FNR]}' \
<(sed -n '/^.\{65\}/p' file) \
<(sed -n '/^.\{65\}/p' file | langid --line)
awk
두 개의 "파일"이 처리됩니다.- 출력
sed -n '/^.\{65\}/p' file
: 65자 이상의 모든 문장. - 출력은
sed -n '/^.\{65\}/p' file | langid --line
한 번의 전송으로 65자 이상의 문자를 포함하는 모든 라인을 처리합니다.
- 출력
- 안에
awk
:FNR==NR
첫 번째 "파일"에 적용a[NR]=$0
행 번호를 인덱스로 사용하여 배열 채우기FNR!=NR&&$1~"is"
두 번째 "파일"에 대해 작업하고 행에 문자열이 포함되어 있는지 확인합니다.is
print a[FNR]
a
그렇다면 원래 문장을 포함하는 이전에 생성된 배열에서 해당 줄을 인쇄합니다.
답변2
쉘이 bash인 경우 다음을 수행할 수 있습니다.
sed -n '/^.\{65\}/p' www.mbl.is | while read line ; do
LANGID=$(echo "$line" | langid --line)
if [[ "$LANGID" =~ is ]] ; then
echo "$line: $LANGID"
fi
done
langid
그러나 이는 여러 인스턴스 (각 입력 행에 대해 하나씩) 를 실행하므로 속도가 매우 느립니다 . Github의 추가 정보에 설명된 대로 langid를 가져오는 Python 스크립트를 작성하는 것이 더 나을 수도 있습니다. 위에서 언급했듯이 stdin을 읽고 이를 stdin에 전달하는 간단한 루프가 langid.classify()
트릭을 수행합니다.
내 Python은 매우 녹슬었고 langid.py가 설치되어 있지 않으므로 테스트되지 않았지만 다음은 매우 원시적인 Python 예입니다.
#! /usr/bin/python
import langid, fileinput, re
for line in fileinput.input():
if len(line) > 65:
id = langid.classify(line)
if re.match(r'is',id):
print line, ": ", id
컴파일 테스트를 통과했지만 python -m py_compile langtest.py
그것이 내가 유리하다고 말할 수 있는 전부입니다.
Frost Software에서 추가한 내용:
훨씬 개선되었으며 아마도 테스트를 거쳐 작동하는 버전입니다.
#! /usr/bin/python
import sys, codecs, re
from fileinput import input as file
from langid import classify
#Output STDOUT as UTF-8
sys.stdout = codecs.getwriter("utf8")(sys.stdout)
sys.stderr = codecs.getwriter("utf8")(sys.stderr)
#read text as a positional argument and procss each line
for line in file():
#check if line is greater than 65 characters
if len(line) > 65:
#determine the language of each line
id = classify(line)
#check if language is Icelandic
if re.search('is', str(id)):
#print the line and the langid classification
print line, ": ", id
매개변수와 일부 추가 기능을 허용하는 보다 포괄적인 Python 스크립트도 있습니다.요점 코드