將PDF和Gutenberg文檔格式轉換為文本:生產中的自然語言處理

Estimates state that 70%–85% of the world’s data is text (unstructured data). Most of the English and EU business data formats as byte text, MS Word, or Adobe PDF. [1]

據估計,全球數據的70%–85%是文本(非結構化數據)。 大多數英語和歐盟業務數據格式為字節文本,MS Word或Adobe PDF。 [1]

Organizations web displays of Adobe Postscript Document Format documents (PDF). [2]

組織Web顯示Dobe Postscript文檔格式文檔( PDF )。 [2]

In this blog, I detail the following :

在此博客中,我將詳細介紹以下內容:

  1. Create a file path from the web file name and local file name;

    從Web文件名和本地文件名創建文件路徑;
  2. Change byte encoded Gutenberg project file into a text corpus;

    將字節編碼的Gutenberg項目文件更改為文本語料庫;
  3. Change a PDF document into a text corpus;

    將PDF文檔更改為文本語料庫;
  4. Segment continuous text into a Corpus of word text.

    將連續文本分割成單詞文本的語料庫。

將常用文檔格式轉換為文本 (Converting Popular Document Formats into Text)

1.從Web文件名或本地文件名創建本地文件路徑 (1. Create local filepath from the web filename or local filename)

The following function will take either a local file name or a remote file URL and return a filepath object.

以下函數將采用本地文件名或遠程文件URL并返回文件路徑對象。

#in file_to_text.py
--------------------------------------------
from io import StringIO, BytesIO
import urllib
def file_or_url(pathfilename:str) -> Any:
"""
Reurn filepath given local file or URL.
Args:
pathfilename:
Returns:
filepath odject istance
"""
try:
fp = open(pathfilename, mode="rb") # file(path, 'rb')
except:
pass
else:
url_text = urllib.request.urlopen(pathfilename).read()
fp = BytesIO(url_text)
return fp

2.將Unicode字節編碼的文件更改為Python Unicode字符串 (2. Change Unicode Byte encoded file into a o Python Unicode String)

You will often encounter text blob downloads in the size 8-bit Unicode format (in the romantic languages). You need to convert 8-bit Unicode into Python Unicode strings.

您經常會遇到8位Unicode格式的文本blob下載(浪漫語言)。 您需要將8位Unicode轉換為Python Unicode字符串。

#in file_to_text.py
--------------------------------------------
def unicode_8_to_text(text: str) -> str:
return text.decode("utf-8", "replace")import urllib
from file_to_text import unicode_8_to_texttext_l = 250text_url = r'http://www.gutenberg.org/files/74/74-0.txt'
gutenberg_text = urllib.request.urlopen(text_url).read()
%time gutenberg_text = unicode_8_to_text(gutenberg_text)
print('{}: size: {:g} \n {} \n'.format(0, len(gutenberg_text) ,gutenberg_text[:text_l]))

output =>

輸出=>

CPU times: user 502 μs, sys: 0 ns, total: 502 μs
Wall time: 510 μs
0: size: 421927

The Project Gutenberg EBook of The Adventures of Tom Sawyer, Complete by
Mark Twain (Samuel Clemens)
This eBook is for the use of anyone anywhere at no cost and with almost
no restrictions whatsoever. You may copy it, give it away or re-use
it under the terms of the Project Gutenberg License included with this
eBook or online at www.guten

The result is that text.decode('utf-8') can format into a Python string of a million characters in about 1/1000th second. A rate that far exceeds our production rate requirements.

結果是text.decode('utf-8')可以在大約1/1000秒內格式化為一百萬個字符的Python字符串。 生產率遠遠超過我們的生產率要求。

3.將PDF文檔更改為文本語料庫。 (3. Change a PDF document into a text corpus.)

“Changing a PDF document into a text corpus" is one of the most troublesome and common tasks I do for NLP text pre-processing.

“將PDF文檔轉換為文本語料庫 ”是我為NLP文本預處理所做的最麻煩,最常見的任務之一。

#in file_to_text.py
--------------------------------------------
def PDF_to_text(pathfilename: str) -> str:
"""
Chane PDF format to text.
Args:
pathfilename:
Returns:
"""
fp = file_or_url(pathfilename)
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos = set()
for page in PDFPage.get_pages(
fp,
pagenos,
maxpages=maxpages,
password=password,
caching=caching,
check_extractable=True,
):
interpreter.process_page(page)
text = retstr.getvalue()
fp.close()
device.close()
retstr.close()
return text
-------------------------------------------------------arvix_list =['https://arxiv.org/pdf/2008.05828v1.pdf'
, 'https://arxiv.org/pdf/2008.05981v1.pdf'
, 'https://arxiv.org/pdf/2008.06043v1.pdf'
, 'tmp/inf_finite_NN.pdf' ]
for n, f in enumerate(arvix_list):
%time pdf_text = PDF_to_text(f).replace('\n', ' ')
print('{}: size: {:g} \n {} \n'.format(n, len(pdf_text) ,pdf_text[:text_l])))

output =>

輸出=>

CPU times: user 1.89 s, sys: 8.88 ms, total: 1.9 s
Wall time: 2.53 s
0: size: 42522
On the Importance of Local Information in Transformer Based Models Madhura Pande, Aakriti Budhraja, Preksha Nema Pratyush Kumar, Mitesh M. Khapra Department of Computer Science and Engineering Robert Bosch Centre for Data Science and AI (RBC-DSAI) Indian Institute of Technology Madras, Chennai, India {mpande,abudhra,preksha,pratyush,miteshk}@
CPU times: user 1.65 s, sys: 8.04 ms, total: 1.66 s
Wall time: 2.33 s
1: size: 30586
ANAND,WANG,LOOG,VANGEMERT:BLACKMAGICINDEEPLEARNING1BlackMagicinDeepLearning:HowHumanSkillImpactsNetworkTrainingKanavAnand1anandkanav92@gmail.comZiqiWang1z.wang-8@tudelft.nlMarcoLoog12M.Loog@tudelft.nlJanvanGemert1j.c.vangemert@tudelft.nl1DelftUniversityofTechnology,Delft,TheNetherlands2UniversityofCopenhagenCopenhagen,DenmarkAbstractHowdoesauser’sp
CPU times: user 4.82 s, sys: 46.3 ms, total: 4.87 s
Wall time: 6.53 s
2: size: 57204
0 2 0 2 g u A 3 1 ] G L . s c [ 1 v 3 4 0 6 0 . 8 0 0 2 : v i X r a Of?ine Meta-Reinforcement Learning with Advantage Weighting Eric Mitchell1, Rafael Rafailov1, Xue Bin Peng2, Sergey Levine2, Chelsea Finn1 1 Stanford University, 2 UC Berkeley em7@stanford.edu Abstract Massive datasets have proven critical to successfully
CPU times: user 12.2 s, sys: 36.1 ms, total: 12.3 s
Wall time: 12.3 s
3: size: 89633
0 2 0 2 l u J 1 3 ] G L . s c [ 1 v 1 0 8 5 1 . 7 0 0 2 : v i X r a Finite Versus In?nite Neural Networks: an Empirical Study Jaehoon Lee Samuel S. Schoenholz? Jeffrey Pennington? Ben Adlam?? Lechao Xiao? Roman Novak? Jascha Sohl-Dickstein {jaehlee, schsam, jpennin, adlam, xlc, romann, jaschasd}@google.com Google Brain

On this hardware configuration, “Converting a PDF file into Python string” requires 150 seconds per million characters. Not fast enough for a Web interactve production application.

在此硬件配置上,“ 將PDF文件轉換為Python字符串 ”每百萬個字符需要150秒。 對于Web interactve生產應用程序來說不夠快。

You may want to stage formatting in the background.

您可能要在后臺進行格式化。

4.將連續文本分割成單詞文本的語料庫 (4. Segment continuous text into Corpus of word text)

When we read https://arxiv.org/pdf/2008.05981v1.pdf', it came back as continuous text with no separation character. Using the package from wordsegment, we separate the continuous string into words.

當我們閱讀https://arxiv.org/pdf/2008.05981v1.pdf'時 ,它以沒有分隔符的連續文本形式出現。 使用來自wordsegment的包我們將連續的字符串分成單詞。

from wordsegment import load,  clean, segment
%time words = segment(pdf_text)
print('size: {:g} \n'.format(len(words)))
' '.join(words)[:text_l*4]

output =>

輸出=>

CPU times: user 1min 43s, sys: 1.31 s, total: 1min 44s
Wall time: 1min 44s
size: 5005'an and wang loog van gemert blackmagic in deep learning 1 blackmagic in deep learning how human skill impacts network training kanavanand1anandkanav92g mailcom ziqiwang1zwang8tudelftnl marco loog12mloogtudelftnl jan van gemert 1jcvangemerttudelftnl1 delft university of technology delft the netherlands 2 university of copenhagen copenhagen denmark abstract how does a users prior experience with deep learning impact accuracy we present an initial study based on 31 participants with different levels of experience their task is to perform hyper parameter optimization for a given deep learning architecture the results show a strong positive correlation between the participants experience and then al performance they additionally indicate that an experienced participant nds better solutions using fewer resources on average the data suggests furthermore that participants with no prior experience follow random strategies in their pursuit of optimal hyperparameters our study investigates the subjective human factor in comparisons of state of the art results and scientic reproducibility in deep learning 1 introduction the popularity of deep learning in various elds such as image recognition 919speech1130 bioinformatics 2124questionanswering3 etc stems from the seemingly favorable tradeoff between the recognition accuracy and their optimization burden lecunetal20 attribute their success t'

You will notice that wordsegment accomplishes a fairly accurate separation into words. There are some errors , or words that we don’t want, that NLP text pre-processing clear away.

您會注意到, wordsegment實現了相當準確的單詞分離。 NLP文本預處理會清除一些錯誤或我們不希望使用的單詞。

The Apache wordsegment is slow. It is barely adequate in production for small, less than 1 thousand word documents. Can we find some faster way to segment?

Apache 單詞段速度很慢。 對于少于一千個單詞的小型文檔,它幾乎不能滿足生產要求。 我們可以找到更快的細分方式嗎?

4b。 將連續文本分割成單詞文本的語料庫 (4b. Segment continuous text into Corpus of word text)

There seems to be a faster method to "Segment continuous text into Corpus of word text."

似乎有一種更快的方法“將連續文本分割成單詞文本的語料庫”。

As discussed in the following blog:

如以下博客中所述:

SymSpell is 100x -1000x faster. Wow!

SymSpell是100倍-1000x更快。 哇!

Note: ed: 8/24/2020 Wolf Garbe deserves credit for pointing out

注意:ed:8/24/2020 Wolf Garbe值得一提

The benchmark results (100x -1000x faster) given in the SymSpell blog post are referring solely to spelling correction, not to word segmentation. In that post SymSpell was compared to other spelling correction algorithms, not to word segmentation algorithms. — Wolfe Garbe 8/23/2020

SymSpell博客文章中給出的基準測試結果(快100倍-1000倍)僅指拼寫校正,而不是指分詞。 在那篇文章中,將SymSpell與其他拼寫校正算法進行了比較,而不是與分詞算法進行了比較。 -Wolfe Garbe 2020年8月23日

and

Also, there is an easier way to call a C# library from Python: https://stackoverflow.com/questions/7367976/calling-a-c-sharp-library-from-python — Wolfe Garbe 8/23/2020

此外,還有一種從Python調用C#庫的簡便方法: https ://stackoverflow.com/questions/7367976/calling-ac-sharp-library-from-python — Wolfe Garbe 8/23/2020

Note: ed: 8/24/2020. I am going to try Garbe's C## implementation. If I do not get the same results (and probably if I do) I will try cython port and see if I can fit into spacy as a pipeline element. I will let you know my results.

注意:ed:8/24/2020。 我將嘗試Garbe的C ##實現。 如果沒有得到相同的結果(可能的話),我將嘗試cython port,看看是否可以將spacy作為管??道元素使用。 我會讓你知道我的結果。

However, it is implemented in C#. Since I am not going down the infinite ratholes of:

但是,它是用C#實現的。 由于我沒有遇到以下無限困難:

  • Convert all my NLP into C#. Not a viable option.

    將我所有的NLP轉換為C# 。 不是可行的選擇。

  • Calling C# from Python. I talked to two engineer managers of Python groups. They have Python-C# capability, but it involves :

    Python調用C# 。 我與兩位Python組的工程師經理進行了交談。 它們具有Python-C#功能,但涉及到:

Note:

注意:

  1. Translating to VB-vanilla;

    翻譯成VB -vanilla;

  2. Manual intervention and translation must pass tests for reproducibility;

    手動干預和翻譯必須通過再現性測試;
  3. Translating from VB-vanilla to C;

    VB- vanilla轉換為C ;

  4. Manual intervention and translation must pass tests for reproducibility.

    手動干預和翻譯必須通過再現性測試。

Instead, we work with a port to Python. Here is a version:

相反,我們使用Python的端口。 這是一個版本:

def segment_into_words(input_term):
# maximum edit distance per dictionary precalculation
max_edit_distance_dictionary = 0
prefix_length = 7
# create object
sym_spell = SymSpell(max_edit_distance_dictionary, prefix_length)
# load dictionary
dictionary_path = pkg_resources.resource_filename(
"symspellpy", "frequency_dictionary_en_82_765.txt")
bigram_path = pkg_resources.resource_filename(
"symspellpy", "frequency_bigramdictionary_en_243_342.txt")
# term_index is the column of the term and count_index is the
# column of the term frequency
if not sym_spell.load_dictionary(dictionary_path, term_index=0,
count_index=1):
print("Dictionary file not found")
return
if not sym_spell.load_bigram_dictionary(dictionary_path, term_index=0,
count_index=2):
print("Bigram dictionary file not found")
returnresult = sym_spell.word_segmentation(input_term)
return result.corrected_string%time long_s = segment_into_words(pdf_text)
print('size: {:g} {}'.format(len(long_s),long_s[:text_l*4]))

output =>

輸出=>

CPU times: user 20.4 s, sys: 59.9 ms, total: 20.4 s
Wall time: 20.4 s
size: 36585 ANAND,WANG,LOOG,VANGEMER T:BLACKMAGICINDEEPLEARNING1B lack MagicinDeepL earning :HowHu man S kill Imp acts Net work T raining Ka nav An and 1 an and kana v92@g mail . com ZiqiWang1z. wang -8@tu delft .nlM arc oLoog12M.Loog@tu delft .nlJ an van Gemert1j.c. vang emert@tu delft .nl1D elf tUniversityofTechn ology ,D elf t,TheN ether lands 2UniversityofC open hagen C open hagen ,Den mark Abs tract How does a user ’s prior experience with deep learning impact accuracy ?We present an initial study based on 31 participants with different levels of experience .T heir task is to perform hyper parameter optimization for a given deep learning architecture .T here -s ult s show a strong positive correlation between the participant ’s experience and the ?n al performance .T hey additionally indicate that an experienced participant ?nds better sol u-t ions using fewer resources on average .T he data suggests furthermore that participants with no prior experience follow random strategies in their pursuit of optimal hyper pa-ra meters .Our study investigates the subjective human factor in comparisons of state of the art results and sci enti?c reproducibility in deep learning .1Intro duct ion T he popularity of deep learning in various ? eld s such as image recognition [9,19], speech [11,30], bio informatics [21,24], question answering [3] etc . stems from the seemingly fav or able trade - off b

SymSpellpy is is about 5x faster implemented in Python.We are not seeing 100x -1000x faster.

SymSpellpyPython中實現的速度要快大約5倍。我們看不到100倍-1000倍的速度。

I guess that SymSpell-C# is comparing to different segmentation algorithms implemented in Python.

我猜想SymSpell-C#正在與Python中實現的不同細分算法進行比較。

Perhaps we see speedup due to C#, a compiled statically typed language. Since C# and C are about the same computing speed, we should expect a speedup of C# 100x -1000x faster than a Python implementation.

也許由于C# (一種編譯的靜態類型語言)而使我們看到了加速。 由于C#C的計算速度大致相同,因此我們應該期望C#的加速比Python實現快100倍-1000倍。

Note: There is a spacy pipeline implementation spacy_symspell, which directly calls SymSpellpy. I recommend you don’t use spacy_symspell. Spacy first generates tokens as the first step of the pipeline, which is immutable. spacy_symspell generates new text from Segmenting continuous text. It can not generate new tokens in the spacy as spacy already generated tokens. .A spacy pipeline works a token sequence, not a stream of text. One would have to spin off a changed version of spacy. Why bother? Instead, segment continuous text into Corpus of word text. Then correct the text of embedded whitespace in a word and hyphenated words in the text. Do any other raw cleaning you want to do. Then feed the raw text to spacy.

注意:有一個spacy管道實現spacy_symspell,它直接調用SymSpellpy。 我建議您不要使用spacy_symspell。 Spacy首先生成令牌,這是流水線的第一步,這是不可變的。 spacy_symspell從生成新文本 分割連續文本。 由于spacy已生成令牌,因此無法在spacy中生成新令牌 .A spacy管道工程令牌序列,文本不流 人們將不得不衍生出一種變化的spacy版本 何必呢? 相反段連續的文本到文本字語料庫。 然后更正單詞中嵌入的空格文本和文本中帶連字符的單詞。 進行您想做的其他任何原始清潔。 然后將原始文本輸入spacy

I show spacy_symspell. Again my advice is not to use it.

我展示spacy_symspell。 同樣,我的建議是不要使用它。

import spacy
from spacy_symspell import SpellingCorrector
def segment_into_words(input_term):
nlp = spacy.load(“en_core_web_lg”, disable=[“tagger”, “parser”])
corrector = SpellingCorrector()
nlp.add_pipe(corrector)

結論 (Conclusion)

In future blogs, I will detail many common and uncommon Fast Text Pre-Processing Methods. Also, I will show the expected speedup from moving SymSpellpy to cython.

在以后的博客中,我將詳細介紹許多常見和不常見的快速文本預處理方法。 另外,我將展示從SymSpellpy遷移cython的預期加速

There will be many more formats and APIs you need to support in the world of “Changing X format into a text corpus.”

在“將X格式更改為文本語料庫”的世界中,您將需要支持更多的格式和API。

I detailed two of the more common document formats, PDF, and Gutenberg Project formats. Also, I gave two NLP utility functions segment_into_words and file_or_url.

我詳細介紹了兩種較常見的文檔格式PDFGutenberg Project格式。 另外,我提供了兩個NLP實用程序功能segment_into_wordsfile_or_url.

I hope you learned something and can use some of the code in this blog.

希望您學到了一些知識,并可以使用此博客中的一些代碼。

If you have some format conversions or better yet a package of them, let me know.

如果您進行了某些格式轉換或更好的轉換,請告訴我 。

翻譯自: https://towardsdatascience.com/natural-language-processing-in-production-converting-pdf-and-gutenberg-document-formats-into-text-9e7cd3046b33

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392466.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392466.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392466.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go_筆試題記錄-指針與值類型實現接口的區別

1、如果Add函數的調用代碼為: func main() {var a Integer 1var b Integer 2var i interface{} &asum : i.(*Integer).Add(b)fmt.Println(sum) } 則Add函數定義正確的是() A.type Integer int func (a Integer) Add(b Integer) Intege…

leetcode 48. 旋轉圖像

解題思路 將數組從里到外分為若干層, 數組 [1,2,3], [4,5,6][7,8,9]的最外層即為 [1,2,3] [4 6][7,8,9] ,將一層分為4條邊,如741 123,將741放到123的位置,123放到369的位置,如此類推(但是放置的…

如何恢復誤刪的OneNote頁面

今天不小心把半個月的日記刪掉了!(為了減少頁面數量,每個月的日記會放在同一個頁面上)。 幸運的是OneNote有自動備份功能,喜極而泣。 操作方法來自微軟支持 打開丟失了最近筆記的筆記本。 單擊“文件”>“信息”&g…

javascript函數式_JavaScript中的函數式編程原理

javascript函數式After a long time learning and working with object-oriented programming, I took a step back to think about system complexity.經過長時間的學習和使用面向對象的編程,我退后了一步來思考系統的復雜性。 “Complexity is anything that mak…

java writeint_Java DataOutputStream.writeInt(int v)類型

DataOutputStream.writeInt(int v)方法示例DataOutputStream的DataOutputStream.writeInt(int v)方法具有以下語法。public final void writeInt(int v) throws IOException示例在下面的代碼中展示了如何使用DataOutputStream.writeInt(int v)方法。import java.io.DataInputSt…

協方差意味著什么_“零”到底意味著什么?

協方差意味著什么When I was an undergraduate student studying Data Science, one of my professors always asked the same question for every data set we worked with — “What does zero mean?”當我是一名研究數據科學的本科生時,我的一位教授總是對我們處…

Go_筆試題記錄-不熟悉的

1、golang中沒有隱藏的this指針,這句話的含義是() A. 方法施加的對象顯式傳遞,沒有被隱藏起來 B. golang沿襲了傳統面向對象編程中的諸多概念,比如繼承、虛函數和構造函數 C. golang的面向對象表達更直觀,對…

leetcode 316. 去除重復字母(單調棧)

給你一個字符串 s ,請你去除字符串中重復的字母,使得每個字母只出現一次。需保證 返回結果的字典序最小(要求不能打亂其他字符的相對位置)。 注意:該題與 1081 https://leetcode-cn.com/problems/smallest-subsequenc…

Go-json解碼到結構體

廢話不多說,直接干就得了,上代碼 package mainimport ("encoding/json""fmt" )type IT struct {Company string json:"company" Subjects []string json:"subjects"IsOk bool json:"isok"…

leetcode 746. 使用最小花費爬樓梯(dp)

數組的每個索引作為一個階梯,第 i個階梯對應著一個非負數的體力花費值 costi。 每當你爬上一個階梯你都要花費對應的體力花費值,然后你可以選擇繼續爬一個階梯或者爬兩個階梯。 您需要找到達到樓層頂部的最低花費。在開始時,你可以選擇從索…

安卓中經常使用控件遇到問題解決方法(持續更新和發現篇幅)(在textview上加一條線、待續)...

TextView設置最多顯示30個字符。超過部分顯示...(省略號)&#xff0c;有人說分別設置TextView的android:signature"true",而且設置android:ellipsize"end";可是我試了。居然成功了&#xff0c;供大家參考 [java] view plaincopy<TextView android:id…

網絡工程師晉升_晉升為工程師的最快方法

網絡工程師晉升by Sihui Huang黃思慧 晉升為工程師的最快方法 (The Fastest Way to Get Promoted as an Engineer) We all want to live up to our potential, grow in our career, and do the best work of our lives. Getting promoted at work not only proves that we hav…

java 銀行存取款_用Java編寫銀行存錢取錢

const readline require(‘readline-sync‘)//引用readline-synclet s 2;//錯誤的次數for (let i 0; i < 3; i) {console.log(‘請輸入名&#xff1a;(由英文組成)‘);let user readline.question();console.log(‘請輸入密碼&#xff1a;(由數字組成)‘);let password …

垃圾郵件分類 python_在python中創建SMS垃圾郵件分類器

垃圾郵件分類 python介紹 (Introduction) I have always been fascinated with Google’s gmail spam detection system, where it is able to seemingly effortlessly judge whether incoming emails are spam and therefore not worthy of our limited attention.我一直對Goo…

leetcode 103. 二叉樹的鋸齒形層序遍歷(層序遍歷)

給定一個二叉樹&#xff0c;返回其節點值的鋸齒形層序遍歷。&#xff08;即先從左往右&#xff0c;再從右往左進行下一層遍歷&#xff0c;以此類推&#xff0c;層與層之間交替進行&#xff09;。例如&#xff1a; 給定二叉樹 [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回…

簡單易用的MongoDB

從我第一次聽到Nosql這個概念到如今已經走過4個年頭了&#xff0c;但仍然沒有具體的去做過相應的實踐。最近獲得一段學習休息時間&#xff0c;購買了Nosql技術實踐一書&#xff0c;正在慢慢的學習。在主流觀點中&#xff0c;Nosql大體分為4類&#xff0c;鍵值存儲數據庫&#x…

html畫布圖片不顯示_如何在HTML5畫布上顯示圖像

html畫布圖片不顯示by Nash Vail由Nash Vail Ok, so here’s a question: “Why do we need an article for this, Nash?”好的&#xff0c;這是一個問題&#xff1a;“為什么我們需要為此寫一篇文章&#xff0c;納什&#xff1f;” Well, grab a seat.好吧&#xff0c;坐下…

java斷點續傳插件_視頻斷點續傳+java視頻

之前仿造uploadify寫了一個HTML5版的文件上傳插件&#xff0c;沒看過的朋友可以點此先看一下~得到了不少朋友的好評&#xff0c;我自己也用在了項目中&#xff0c;不論是用戶頭像上傳&#xff0c;還是各種媒體文件的上傳&#xff0c;以及各種個性的業務需求&#xff0c;都能得到…

全棧入門_啟動數據棧入門包(2020)

全棧入門I advise a lot of people on how to build out their data stack, from tiny startups to enterprise companies that are moving to the cloud or from legacy solutions. There are many choices out there, and navigating them all can be tricky. Here’s a brea…

Go-json解碼到接口及根據鍵獲取值

Go-json解碼到接口及根據鍵獲取值 package mainimport ("encoding/json""fmt""github.com/bitly/go-simplejson" )type JsonServer struct {ServerName stringServerIP string }type JsonServers struct {Servers []JsonServer }func main() {…