正则表达式 SpaCy

Posted

技术标签:

【中文标题】正则表达式 SpaCy【英文标题】:Regular expression SpaCy 【发布时间】:2018-06-21 16:22:54 【问题描述】:

我正在为匹配数字创建一个 spaCy 正则表达式匹配项并将其提取为 pandas 数据框。

问题:Panda 从数字中提取但覆盖值而不是附加。如何解决?

(原代码来源:yarongon)

from __future__ import unicode_literals
import spacy
import re
import pandas as pd
from datetime import date
nlp = spacy.load('en_core_web_sm', disable=['parser', 'tagger', 'ner'])
doc = nlp("This is a sample number: 11. This is second sample number: 1145.")
NUM_PATTERN = re.compile(r"\d+")
for match in re.finditer(NUM_PATTERN, doc.text):
    start, end = match.span()
    Number = doc.char_span(start, end)
    print Number
pandas_attributes = [Number,]
df = pd.DataFrame(pandas_attributes,
                  columns=['Number'])
print df

输出:

11
1145
  Number
0   1145

Expected output:
      Number
o      11 
1      1145

编辑 1: 我正在尝试对单个文本进行多个模式匹配。

from __future__ import unicode_literals
import spacy
import re
import pandas as pd
from datetime import date
nlp = spacy.load('en_core_web_sm', disable=['parser', 'tagger', 'ner'])
doc = nlp("This is a sample-number: 11. This is second sample number: 1145.")
NUM_PATTERN = re.compile(r"\d+")
HYPH_PATTERN = re.compile('\w+(?:-)\w+')

for match in re.finditer(NUM_PATTERN, doc.text):
    start, end = match.span()
    Number = doc.char_span(start, end)
    print Number

for match in re.finditer(HYPH_PATTERN, doc.text):
    start, end = match.span()
    Hyph_word = doc.char_span(start, end)
    print Hyph_word

pandas_attributes = [Number,Hyph_word]
df = pd.DataFrame(pandas_attributes,
                  columns=['Number','Hyphenword'])
print df

电流输出。

Output:
11
1145
sample-number

AssertionError: 2 columns passed, passed data had 3 columns

Expected output:
Number  Hyphen_word
11      sample-number
1145  

编辑2:输出

                Number Hyphenword
0                 (11)     (1145)
1  (sample, -, number)       Non

Expected output:

    Number   Hyphenword
0        11   sample-word
1      1145   Non

【问题讨论】:

【参考方案1】:

您需要附加值以在循环中列出:

L = []
for match in re.finditer(NUM_PATTERN, doc.text):
    start, end = match.span()
    L.append(doc.char_span(start, end))

然后使用DataFrame构造函数:

df = pd.DataFrame(L,columns=['Number'])

您还可以附加具有多个值的元组:

示例:

L = []
for x in range(3):
    Number = x + 1
    Val = x + 4
    L.append((Number, Val))

print (L)
[(1, 4), (2, 5), (3, 6)]

df = pd.DataFrame(L,columns=['Number', 'Val'])
print (df)
   Number  Val
0       1    4
1       2    5
2       3    6

我相信你可以使用双append

PATTERNS = [NUM_PATTERN, HYPH_PATTERN]

pandas_attributes = []
for pat in PATTERNS:
    L = []
    for match in re.finditer(pat, doc.text):
        start, end = match.span()
        L.append(doc.char_span(start, end))
    pandas_attributes.append(L) 

df = pd.DataFrame(pandas_attributes,
                  index=['Number','Hyphenword']).T

【讨论】:

你会回答多个模式匹配的工作吗?如何进行编辑 1? 代码正在运行,但是插入了列和行。见编辑 2 我更正了,需要pd.DataFrame(pandas_attributes, index=['Number','Hyphenword']).T 太棒了。作品你可以对这个逗号和括号做些什么来删除它吗? 那么在我把它写到excel之前,有什么办法可以去掉输出中的逗号和括号呢?

以上是关于正则表达式 SpaCy的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式与扩展正则表达式区别

PHP 正则表达式总结

正则表达式

正则表达式

正则表达式“或“的使用

正则表达式 验证数字格式 非负数 小数点后保留两位 数字正则 double正则