Commit 6475115b authored by Sylvain Coulange's avatar Sylvain Coulange

Ajout japonais !

parent b29234db
from django.shortcuts import render
from django.http import JsonResponse
import re, json, spacy, subprocess
import MeCab
nlpFr = spacy.load('fr_core_news_lg')
nlpZh = spacy.load('zh_core_web_lg')
nlpFr = spacy.load('fr_core_news_md')
nlpZh = spacy.load('zh_core_web_md')
chasen = MeCab.Tagger("-Ochasen")
def home(request):
updateTimeStr = updateTime()
......@@ -18,31 +20,59 @@ def runSpacy(request):
nlpText = nlpFr(text)
elif lang == "zh":
nlpText = nlpZh(text)
elif lang == "jp":
nlpText = chasen.parse(text)
outText = []
for token in nlpText:
tokenInfo = {
"text": token.text,
"lemma": token.lemma_,
"pos": token.pos_,
"tag": token.tag_,
"dep": token.dep_,
"shape": token.shape_
}
print(tokenInfo)
outText.append(tokenInfo)
if lang == "fr" or lang == "zh":
for token in nlpText:
tokenInfo = {
"text": token.text,
"lemma": token.lemma_,
"pos": token.pos_,
"tag": token.tag_,
"dep": token.dep_,
"shape": token.shape_
}
print(tokenInfo)
outText.append(tokenInfo)
if token.whitespace_:
outText.append({
"text": token.whitespace_,
"lemma": "",
"pos": "SPACE",
"tag": "SPACE",
"dep": "",
"shape": ""
})
elif lang == "jp":
print(nlpText)
nlpText = nlpText.split('\n')
for token in nlpText:
if token == "EOS":
tokenInfo = {
"text": "\n",
"lemma": "",
"pos": "X",
"tag": "",
"dep": "",
"shape": ""
}
elif len(token) > 0:
token = token.split('\t')
tokenInfo = {
"text": token[0],
"lemma": token[2],
"pos": token[3].split('-')[0],
"tag": " ".join(token[3:]),
"dep": "",
"shape": ""
}
print(tokenInfo)
outText.append(tokenInfo)
if token.whitespace_:
outText.append({
"text": token.whitespace_,
"lemma": "",
"pos": "SPACE",
"tag": "SPACE",
"dep": "",
"shape": ""
})
rep = {
'outText': outText
}
......
......@@ -8,11 +8,17 @@ function runIfSpace() {
}
async function runSpacy() {
//document.getElementById('loader').style.display = "block";
document.getElementById('outText').innerHTML = "";
document.getElementById('loader').style.display = "block";
var inText = document.getElementById('inText').value;
var lang = document.getElementById('choixLang').value;
// REMPLACEMENT DES \n PAR ¬ POUR MECAB (JP)
if(lang == "jp"){
inText = inText.replace(/\n/g,'¬')
}
// ON EMBALLE TOUT ÇA
var colis = {
inText: inText,
......@@ -46,13 +52,12 @@ async function runSpacy() {
else col = pos[data.outText[i].pos].color;
// saut de ligne
sdl = data.outText[i].text.split('\n');
sdl = data.outText[i].text.split(/[\n¬]+/);
if (sdl.length>1){
for (s in sdl) {
for (s=1; s<sdl.length; s++) {
result = result + "<br>";
}
}
// if (data.outText[i].text == "\n") result = result + "<br>";
// espace
else if (data.outText[i].text == " ") result = result + "<span style='"+ stylesCommuns +"'> </span>";
......@@ -64,7 +69,7 @@ async function runSpacy() {
+ '<span class="token" style="color:'+ pos["DET"].color +';'
+ stylesCommuns
+ stylesUnderline + 'text-decoration-color:' + pos["ADP"].color
+'" title-data="'+ data.outText[i].pos + ', ' + data.outText[i].tag
+'" title-data="'+ data.outText[i].tag
+'">'+ data.outText[i].text + '</span>';
}
......@@ -74,7 +79,7 @@ async function runSpacy() {
+ '<span class="token" style="color:'+ pos["PRON"].color +';'
+ stylesCommuns
+ stylesUnderline + 'text-decoration-color:' + pos["ADV"].color
+'" title-data="'+ data.outText[i].pos + ', ' + data.outText[i].tag
+'" title-data="'+ data.outText[i].tag
+'">'+ data.outText[i].text + '</span>';
}
......@@ -82,12 +87,12 @@ async function runSpacy() {
else result = result
+ '<span class="token" style="color:'+ col +';'
+ stylesCommuns
+'" title-data="'+ data.outText[i].pos + ', ' + data.outText[i].tag
+'" title-data="'+ data.outText[i].tag
+'">'+ data.outText[i].text + '</span>';
}
var outText = document.getElementById('outText');
outText.innerHTML = result;
document.getElementById('loader').style.display = "none";
document.getElementById('outText').innerHTML = result;
// On relance switchTags() si il était actif
if (tags) {
......@@ -108,9 +113,12 @@ function getExample() {
function erase(){
document.getElementById('inText').value = '';
document.getElementById('loader').style.display = "none";
document.getElementById('outText').innerHTML = "";
}
var tags = false;
switchTags();
function switchTags(){
divBtnTags = document.getElementById('ti_btntags');
tokens = document.getElementsByClassName('token');
......@@ -120,14 +128,31 @@ function switchTags(){
tokens[i].title = '';
tokens[i].classList = "token";
}
divBtnTags.style.border = "1px solid transparent";
divBtnTags.classList.remove("btnActive");
} else { // Affiche les étiquettes morphosyntaxiques
for (i=0; i<tokens.length; i++){
tokens[i].title = tokens[i].getAttribute('title-data');
tokens[i].classList = "token tokenborder";
}
divBtnTags.style.border = "1px solid green";
divBtnTags.classList.add("btnActive");
}
tags = !tags;
}
var displaywordspace = false;
function togglewordspace(){
divBtnSpace = document.getElementById('ti_btnwordspace');
if (displaywordspace){ // Masque les furigana
document.documentElement.style.setProperty('--tokenmargin', '20px 0px');
displaywordspace = false;
divBtnSpace.classList.remove("btnActive");
} else { // Affiche les furigana
document.documentElement.style.setProperty('--tokenmargin', '20px 15px');
displaywordspace = true;
divBtnSpace.classList.add("btnActive");
}
}
\ No newline at end of file
......@@ -17,5 +17,18 @@ pos = {
"SPACE": { "color":"", "nom":"", "forme":"" },
"SYM": { "color":"", "nom":"", "forme":"" },
"VERB": { "color":"#eda01a", "nom":"", "forme":"" },
"X": { "color":"", "nom":"", "forme":"" }
"X": { "color":"", "nom":"", "forme":"" },
"名詞": { "color":"#00b54a", "nom":"", "forme":"" },
"接頭詞": { "color":"", "nom":"", "forme":"" },
"動詞": { "color":"#eda01a", "nom":"", "forme":"" },
"形容詞": { "color":"#980086", "nom":"", "forme":"" },
"副詞": { "color":"#3984c6", "nom":"", "forme":"" },
"連体詞": { "color":"", "nom":"", "forme":"" },
"接続詞": { "color":"#fff", "nom":"", "forme":"" },
"助詞": { "color":"#f3eb20", "nom":"", "forme":"" },
"助動詞": { "color":"#eda01a", "nom":"", "forme":"" },
"感動詞": { "color":"#8a9092", "nom":"", "forme":"" },
"記号": { "color":"#fff", "nom":"", "forme":"" },
"フィラー": { "color":"#8a9092", "nom":"", "forme":"" }
}
\ No newline at end of file
......@@ -12,5 +12,11 @@ var textExamples = {
"日本自第三十六代孝德天皇即位並建元大化起開始使用年号為其纪年方式,並在文武天皇於701年5月3日(大寶元年三月二十一日)再度恢復使用年號後,一直持續使用年號至今。\n光嚴天皇為日本南北朝時代中由持明院統系擔任天皇的北朝的首任天皇,受镰仓幕府擁立。他在1332年5月23日(元弘二年四月二十八日)改元正慶,是為北朝年號之始,惟光嚴天皇在1333年7月7日(正慶二年/元弘三年五月二十五日)被後醍醐天皇廢位。光嚴天皇之弟光明天皇在後醍醐天皇的建武新政失敗後受足利氏擁立繼位為北朝天皇,並在1338年10月11日(建武五年/延元三年八月二十八日)改元曆應。",
"紫阳书院,是清代位于苏州的一所著名书院,“紫阳”的名字出自著名理学家的朱熹的表字。\n当时,官办学校一律以科举考试为教学内容,而紫阳书院坚持主要讲授朱熹理学,辅以有关科举考试的内容。张伯行还聘请崇明县教谕郭正宗、吴江县教谕夏声等人任教,一时汇集江南甚至全国各地的学生。",
"特色内容是维基百科社群推荐的典范之作。展示在这里的条目、列表及图片,都是参与者在维基百科的精神感召之下共同协作努力的成果。"
],
"jp": [
"若手ダンサーの登竜門、第49回ローザンヌ国際バレエコンクールの決選が6日(現地時間)、スイスで行われ、埼玉県出身で米国のバレエ学校に在籍している淵山隼平さん(18)が5位に入賞した。コロナ禍のため、ビデオ審査だった。",
"日本語を母語としない方のための日本語教育の世界でも,「コーパス」という言葉を耳にすることが多くなってきました。まず,コーパスとは何か,そしてそのメリットについて確認しておきましょう。コーパスとは,「実際に使われた言語のデータを大量に集めた電子的なデータベース」のことです。そして,そのデータを利用するメリットとしては,「実際によく使われるパターンを見つけ出す」ことができる点にあります。",
"アキ:また会いたいです。いつ空いてますか\nとも:今週は、結構忙しいです。来週の月曜日は、どうですか。\nアキ:来週は、空いていません。来月に空いたら教えてください。\nとも:もちろん。メールを送ります。では、また会いましょう!",
"アキ:もしよろしければ、英語で話してもいいですか。\nとも:もちろん、問題ありません。私も英語を練習しなければいけません。英語は、どれくらい長く勉強してますか。\nアキ:英語は、2年ぐらい勉強しています。でも、まだ話すのが大変です。"
]
}
\ No newline at end of file
var langJson = {
"ti_titre": {
"fr":"GrammaChrome - Cliquez ici pour en savoir plus !",
"zh":""
"zh":"GrammaChrome - Click here to know more!",
"jp":"GrammaChrome - 詳しくはこちら!"
},
"sp_header": {
"fr":"Cette application est un prototype en cours de conception. <a href='https://groups.google.com/d/forum/alem-app' target='_blank'><b>Accéder au forum</b></a> pour échanger avec la communauté et faire vos suggestions.",
"zh":"该应用是目前正在开发的原型。 <a href='https://groups.google.com/d/forum/alem-app' target='_blank'><b>进入论坛与社区</b></a>交流,提出您的建议。"
"zh":"该应用是目前正在开发的原型。 <a href='https://groups.google.com/d/forum/alem-app' target='_blank'><b>进入论坛与社区</b></a>交流,提出您的建议。",
"jp":"このアプリは開発中です。コミュニティーでの交流や、改善のご提案は<a href='https://groups.google.com/d/forum/alem-app' target='_blank'><b>フォーラムへ</b></a>!"
},
"sp_footcode": {
"fr":"Code source",
"zh":"Source code"
"zh":"Source code",
"jp":"ソースコード"
},
"sp_footjournal": {
"fr":"Journal des modifications",
"zh":"Modifications log"
"zh":"Modifications log",
"jp":"編集ログ"
},
"sp_footlicence": {
"fr":"Code open source sous licence CC BY-NC-SA 4.0",
"zh":"Open source code under CC BY-NC-SA 4.0 licence"
"zh":"Open source code under CC BY-NC-SA 4.0 licence",
"jp":"このサイトの内容物はクリエイティブ・コモンズ表示-非営利-継承4.0ライセンスの下に提供されています。"
},
"sp_footSpaCy": {
"fr": "Analyse morphosyntaxique :",
"zh": "句法分析: "
"zh": "句法分析: ",
"jp":"形態素解析: "
},
"sp_subtitle": {
"fr": "<span style='color:#00b54a'>Coloriseur</span> <span style='color:#980086'>grammatical</span> <span style='color:#fff'>et</span> <span style='color:#980086'>automatique</span> <span style='color:#c00018'>de</span> <span style='color:#00b54a'>texte</span>",
"zh": "<span style='color:#980086'>自動</span><span style='color:#00b54a'>語法</span><span style='color:#fff'>和</span><span style='color:#00b54a'>文本着色器</span>"
"zh": "<span class='token' style='color:#980086'>自動</span><span class='token' style='color:#00b54a'>語法</span><span class='token' style='color:#fff'>和</span><span class='token' style='color:#00b54a'>文本着色器</span>",
"jp":'<span class="token" style="color: #00b54a">文章</span><span class="token" style="color: #00b54a">自動</span><span class="token" style="color: #00b54a">文法</span><span class="token" style="color: #00b54a">解析</span><span class="token" style="color: #00b54a">器</span>'
},
"sp_consigne": {
"fr": "Entrez du texte à analyser :",
"zh": "情插入一些案文:"
"zh": "情插入一些案文:",
"jp":"解析する文章を入力してください:"
},
"sp_exemple": {
"fr": "Générer un exemple",
"zh": "提出一個例子"
"zh": "提出一個例子",
"jp":"例文を発生する"
},
"sp_resultat": {
"fr": "Résultats :",
"zh": "成果:"
"zh": "成果:",
"jp":"結果:"
},
"sp_tuto": {
"fr": "Accéder aux tutoriels",
"zh": "访问教程",
"jp": "チュートリアルにアクセス"
},
"ti_btntags": {
"fr": "Afficher/masquer les catégories au survol de la souris",
"zh": "Afficher/masquer les catégories au survol de la souris"
"zh": "Afficher/masquer les catégories au survol de la souris",
"jp":"カーソルを合わせて品詞を表示"
},
"sp_analyser": {
"fr": "Analyser",
"zh": "分析"
"zh": "分析",
"jp":"解析"
},
"sp_effacer": {
"fr": "Effacer",
"zh": "抹去"
"zh": "抹去",
"jp":"削除"
},
"sp_info": {
"fr": "La colorisation de GrammaChrome se base sur l'analyseur morphosyntaxique <a href='https://spacy.io/'>SpaCy</a>.<br> Le modèle de langue utilisé (<a href='https://github.com/explosion/spacy-models/releases//tag/fr_core_news_md-2.3.0'>fr_core_news_md-2.3.0</a>) est un réseau neuronal convolutif entraîné sur les corpus Sequoia et WikiNER. Le modèle de mandarin (<a href='https://github.com/explosion/spacy-models/releases//tag/zh_core_web_md-2.3.1'>zh_core_web_md_2.3.1</a>) est entraîné sur OntoNotes.<br/><a href='http://grammacolori3l.alem-app.fr/'>Cliquez ici</a> pour tester GrammaChrome avec des modèles plus grands.",
"zh": "La colorisation de GrammaChrome se base sur l'analyseur morphosyntaxique <a href='https://spacy.io/'>SpaCy</a>.<br> Le modèle de langue utilisé (<a href='https://github.com/explosion/spacy-models/releases//tag/fr_core_news_md-2.3.0'>fr_core_news_md-2.3.0</a>) est un réseau neuronal convolutif entraîné sur les corpus Sequoia et WikiNER. Le modèle de mandarin (<a href='https://github.com/explosion/spacy-models/releases//tag/zh_core_web_md-2.3.1'>zh_core_web_md_2.3.1</a>) est entraîné sur OntoNotes.<br/><a href='http://grammacolori3l.alem-app.fr/'>Cliquez ici</a> pour tester GrammaChrome avec des modèles plus grands."
"fr": "La colorisation de GrammaChrome se base sur l'analyseur morphosyntaxique <a href='https://spacy.io/'>SpaCy</a> pour le français et pour le mandarin.<br> Le modèle de langue utilisé en français (<a href='https://github.com/explosion/spacy-models/releases//tag/fr_core_news_md-2.3.0'>fr_core_news_md-2.3.0</a>) est un réseau neuronal convolutif entraîné sur les corpus Sequoia et WikiNER. Le modèle de mandarin (<a href='https://github.com/explosion/spacy-models/releases//tag/zh_core_web_md-2.3.1'>zh_core_web_md_2.3.1</a>) est entraîné sur OntoNotes.<br/>La colorisation du japonais recourt à l'analyseur morphosyntaxique <a href='https://taku910.github.io/mecab/'>MeCab</a> et au dictionnaire <a href='https://salsa.debian.org/nlp-ja-team/mecab-ipadic'>IPADIC</a>.",
"zh": "La colorisation de GrammaChrome se base sur l'analyseur morphosyntaxique <a href='https://spacy.io/'>SpaCy</a> pour le français et pour le mandarin.<br> Le modèle de langue utilisé en français (<a href='https://github.com/explosion/spacy-models/releases//tag/fr_core_news_md-2.3.0'>fr_core_news_md-2.3.0</a>) est un réseau neuronal convolutif entraîné sur les corpus Sequoia et WikiNER. Le modèle de mandarin (<a href='https://github.com/explosion/spacy-models/releases//tag/zh_core_web_md-2.3.1'>zh_core_web_md_2.3.1</a>) est entraîné sur OntoNotes.<br/>La colorisation du japonais recourt à l'analyseur morphosyntaxique <a href='https://taku910.github.io/mecab/'>MeCab</a> et au dictionnaire <a href='https://salsa.debian.org/nlp-ja-team/mecab-ipadic'>IPADIC</a>.",
"jp":"GrammaChromeの色は<a href='https://taku910.github.io/mecab/'>MeCab</a>と<a href='https://salsa.debian.org/nlp-ja-team/mecab-ipadic'>IPADIC</a>の形態素解析に基づいています。フランス語版と中国語版は<a href='https://spacy.io/'>SpaCy</a>の<a href='https://github.com/explosion/spacy-models/releases//tag/fr_core_news_md-2.3.0'>fr_core_news_md-2.3.0</a>と<a href='https://github.com/explosion/spacy-models/releases//tag/zh_core_web_md-2.3.1'>zh_core_web_md_2.3.1</a>を利用しています。"
}
}
\ No newline at end of file
.loader {
border: 16px solid #f3f3f3;
border-radius: 50%;
border-top: 16px solid #3498db;
width: 100px;
height: 100px;
-webkit-animation: spin 2s linear infinite; /* Safari */
animation: spin 2s linear infinite;
margin: 30px;
}
/* Safari */
@-webkit-keyframes spin {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
\ No newline at end of file
:root {
--tokenmargin: 20px 0px;
}
.preprod {
position: absolute;
top: 5px;
......@@ -41,53 +45,52 @@ h2 {
}
button {
border: 1px solid transparent;
border-radius: 5px;
margin: 5px;
box-shadow: gray 1px 1px 1px;
margin: 5px;
padding: 2px 18px;
}
/* PARAMETRAGES */
.outputParam {
position: absolute;
right: 0px;
top: 0px;
padding: 15px;
}
.outputParam span {
.outputParam svg {
cursor: pointer;
padding: 5px;
font-size: 1em;
padding: 0px;
width: 25px;
}
.outputParam svg {
.btntags {
border: 1px solid transparent;
}
.btnzi {
width: 25px;
cursor: pointer;
padding: 10px;
width: 50px;
margin: auto;
}
.btnActive {
border: 1px solid yellow;
border-radius: 3px;
}
.divInfo {
margin: 10px 20px;
font-size: 1em;
font-style: italic;
}
footer {
margin-top: 20px;
font-style: italic;
font-size: 12pt;
}
.licence-div {
display: -ms-flexbox; /* IE10 */
display: flex;
flex-direction: row;
flex-wrap: nowrap; /* étale les items sur la largeur */
justify-content: center;
align-items: center; /* alignement vertical des items */
font-size: 12pt;
}
.licence-div div {
margin: 3px 5px;
}
.header {
font-size: 12pt;
......@@ -130,22 +133,6 @@ footer {
text-align: left;
}
.win-black {
position: relative;
display: inline-table;
background-color: black;
color: white;
border: solid 2px darkgrey;
border-radius: 10px;
padding: 10px;
margin: 10px;
}
.win-white {
background-color: white;
color: black;
}
.outputMainDiv {
height: 250px;
width: 80%;
......@@ -167,12 +154,53 @@ footer {
font-weight: bold;
}
.btntags {
border: 1px solid transparent;
}
.tokenborder:hover {
border: 1px solid rgba(255, 255, 255, 0.74);
border-radius: 5px;
padding-top: 10px;
}
\ No newline at end of file
}
.token {
margin: var(--tokenmargin);
}
.win-black {
position: relative;
display: inline-table;
background-color: black;
color: white;
border: solid 2px darkgrey;
border-radius: 10px;
padding: 10px;
margin: 10px;
}
.win-white {
background-color: white;
color: black;
}
/* FOOTER */
footer {
margin-top: 20px;
font-style: italic;
font-size: 12pt;
}
.licence-div {
display: -ms-flexbox; /* IE10 */
display: flex;
flex-direction: row;
flex-wrap: nowrap; /* étale les items sur la largeur */
justify-content: center;
align-items: center; /* alignement vertical des items */
font-size: 12pt;
}
.licence-div div {
margin: 3px 5px;
}
......@@ -7,6 +7,7 @@
<title>GrammaChrome</title>
<link rel="shortcut icon" type="image/png" href="{% static 'grammachrome.ico' %}"/>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
<link rel="stylesheet" type="text/css" href="{% static 'styles/loader.css'%}">
<link rel="stylesheet" type="text/css" href="{% static 'styles/styles.css'%}">
<script type="text/javascript" src="{% static 'languages/languages.js' %}"></script>
</head>
......@@ -21,6 +22,7 @@
<select id="choixLang" onchange="selectLang(this.value)" style="height: 35px;">
<option value="fr">Français</option>
<option value="zh">中文</option>
<option value="jp">日本語</option>
</select>
</div>
......@@ -38,11 +40,18 @@
<h2><span id="sp_resultat" class="langspan"></span></h2>
<div class="outputParam">
<div class="btntags langtitle" id="ti_btntags" onclick="switchTags()">
<svg viewBox="0 0 16 16" class="bi bi-tag" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<svg viewBox="0 0 16 16" class="bi bi-tag btnzi" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" d="M2 2v4.586l7 7L13.586 9l-7-7H2zM1 2a1 1 0 0 1 1-1h4.586a1 1 0 0 1 .707.293l7 7a1 1 0 0 1 0 1.414l-4.586 4.586a1 1 0 0 1-1.414 0l-7-7A1 1 0 0 1 1 6.586V2z"/>
<path fill-rule="evenodd" d="M4.5 5a.5.5 0 1 0 0-1 .5.5 0 0 0 0 1zm0 1a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z"/>
</svg>
</div>
<!-- <div id="ti_btnkana" onclick="">
<img src="{% static 'im/btn-kana.png' %}" class="btnzi">
</div> -->
<div id="ti_btnwordspace" onclick="togglewordspace()">
<img id="imgzhtokenspace" src="{% static 'im/zhtokenspaceblack.png' %}" class="btnzi">
</div>
</div>
<center><div id="loader" class="loader" style="display: none;"></div></center>
<div id="outText" class="outText outputBold"></div>
......
{% load static %}
<footer>
<!--<div style="font-size: 20pt;"><a href="https://alem.hypotheses.org/category/tutoriels/tutoriels-wikicolor" target="_blank"><span id="sp_tuto" class="langspan"></span></a></div>-->
<div style="font-size: 20pt;"><a href="https://alem.hypotheses.org/category/tutoriels/tutoriels-grammachrome" target="_blank"><span id="sp_tuto" class="langspan"></span></a></div>
<div>S.Coulange, {{updateTime}} |
<a href="https://gricad-gitlab.univ-grenoble-alpes.fr/pedagogies-multimodales/grammacolor"><span id="sp_footcode" class="langspan"></span></a>
- <a href="https://gricad-gitlab.univ-grenoble-alpes.fr/pedagogies-multimodales/grammacolor/commits/master"><span id="sp_footjournal" class="langspan"></span></a>
......@@ -8,6 +8,6 @@
<div class="licence-div">
<div><span id="sp_footlicence" class="langspan"></span></div>
<div><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" title="Attribution-NonCommercial-ShareAlike 4.0 International"><img height="30px" src="{% static 'im/cc-by-nc-sa.png' %}" title="Attribution-NonCommercial-ShareAlike 4.0 International" class="licence-element licence-img"/></a></div>
<div><span id="sp_footSpaCy" class="langspan"></span><a href="https://spacy.io/"> SpaCy</a></div>
<div><span id="sp_footSpaCy" class="langspan"></span><a href="https://spacy.io/"> SpaCy</a>, <a href="https://taku910.github.io/mecab/">MeCab</a></div>
</div>
</footer>
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment